
Hadoop 、hdfs命令应用,续上一篇ambari平台搭建之后
Hadoop 、hdfs命令应用
上一篇文章我们搭建了ambari管理集群,现在我们利用平台来做一些小实验。
- 我们的hd0-hdp作为主节点执行命令测试
三种命令的区别
- 1.hadoop fs:
意思是说该命令可以用于其他文件系统,不止是hdfs文件系统内,也就是说该命
令的使用范围更广
- 2.hadoop dfs
专门针对hdfs分布式文件系统
- 3.hdfs dfs
和上面的命令作用相同,相比于上面的命令更为推荐,并且当使用hadoop dfs时内部会被转为hdfs dfs命令
7.1登录hdfs用户
[root@nd0-hdp ~\]# su - hdfs
7.2 -ls <path>
- 列出指定目录下的内容
[hdfs@nd0-hdp ~\]# hadoop fs -ls /
7.3 -du <path>
- 显示目录中所有文件大小,或者指定一个文件时,显示此文件大小
\[hdfs@nd0-hdp ~\]\$ hadoop fs -du /
7.4 -count <path>
- 统计文件个数及占空间情况
[hdfs@nd0-hdp ~\]\$ hadoop fs -count /
7.5 -mkdir
- 新建目录
[hdfs@nd0-hdp ~\]\$ hadoop fs -mkdir /mvtest
7.6 -mv
- 移动目录
7.7 -touchz <path>
- 在指定目录创建一个新文件
[hdfs@nd0-hdp ~\]\$ hdfs dfs -touchz /mvtest/123
7.8 -rm<path>
- 删除指定目录的文件
[hdfs@nd0-hdp ~\]\$ hdfs dfs -rm /mvtest/123
7.9 -chmod
- 类似于linux命令,用来修改权限
[hdfs@nd0-hdp ~\]\$ hdfs dfs -chmod 777 /mvtest/123
7.10 -put
- 从本地系统拷贝到dfs中
[hdfs@nd0-hdp ~]$ hdfs dfs -put -f mvtest/test /mvtest/
7.11 -get
- 从dfs拷贝到本地系统中
[hdfs@nd0-hdp ~]$ hdfs dfs -get -f /mvtest/test ./
7.12 -cat
- 和Linux的cat一样查看文件内的内容
[hdfs@nd0-hdp ~]$ hdfs dfs -cat /mvtest/test
8. Wordcount词频统计方法一:
- Map阶段
– 主要完成key-value对生成,这里是每看到一个单词,就输出(单词,1)的kv对
- 排序阶段
– 对刚才的kv对进行排序,这样相同单词就在一块儿了
- Reduce阶段
– 对同一个单词的次数进行汇总,得到(词,频次)对
- 错误解决
在开始前需要检查mapreduce和yarn的服务是否成功启动
实验最后执行作业任务时出现了内存不足的报错
需要在ambari控制台中将yarn和mapreduce的内存增大,需要将内存调到灰色小三角的默认位置
8.1 map程序:
[root@nd1-hdp mapreduce\]# vi map.py #输入以下内容
import sys
# 从标准输入过来的数据
for line in sys.stdin:
# 把首位的空格去掉
line = line.strip()
# 把这一行文本切分成单词(按照空格)
words = line.split()
# 对见到的单词进行次数标注(出现1次)
for word **in** words:
print '%s\t%s' % (word, 1)
8.2 reduce程序
[root@nd1-hdp mapreduce\]# vi reduce.py
#coding: utf-8
# !/usr/bin/env python
from operator import itemgetter
import sys
current_word = None
current_count = 0
word = None
# 依旧是标准输入过来的数据
for line in sys.stdin:
# 去除左右空格
line = line.strip()
# 按照tab键对行切分,得到word和次数1
word, count = line.split('\t', 1)
# 你得到的1是一个字符串,需要对它进行类型转化
try:
count = int(count)
except ValueError:
#如果不能转成数字,输入有问题,调到下一行
continue
# 如果本次读取的单词和上一次一样,对次数加1
if current_word == word:
current_count += count
else:
if current_word:
# 输出统计结果
print '%s\t%s' % (current_word, current_count)
current_count = count
current_word = word
# 不要忘了最后一个词哦,也得输出结果
if current_word == word:
print '%s\t%s' % (current_word, current_count)
8.3本地测试程序
- 给编写的程序添加权限
[root@nd1-hdp mapreduce]# chmod a+x map.py
[root@nd1-hdp mapreduce]# chmod a+x reduce.py
- 测试执行
[root@nd1-hdp mapreduce\]# echo "hello world son fk usa god dont bless you world son fk usa god" | python map.py |sort|python reduce.py
8.4 编写wcdata.txt
- 上传到Hadoop
[root@nd1-hdp mapreduce]# su hdfs
[hdfs@nd1-hdp mapreduce]$ hdfs dfs -mkdir /hdfs_wc #新建文件目录
[hdfs@nd1-hdp mapreduce]$ hdfs dfs -put wcdata.txt /hdfs_wc
[hdfs@nd0-hdp root]$ hdfs dfs -ls /hdfs_wc
#编写程序这里在nd1、nd0都可以只要上传文件到hdfs就行
- 回到root
8.5 执行mapreduce任务
[root@nd0-hdp ~]# cd /usr/hdp/3.1.0.0-78/hadoop-mapreduce/ #找到Hadoop安装mapreduce的目录
[root@nd0-hdp hadoop-mapreduce]# ls
-
找到需要的包hadoop-streaming.jar
-
切换到hdfs用户
[root@nd0-hdp ~]# su hdfs
[hdfs@nd0-hdp root]$ hadoop jar /usr/hdp/3.1.0.0-78/hadoop-mapreduce/hadoop-streaming.jar -mapper "python map.py" -reducer "python reduce.py" -input /hdfs_wc/* -output /hdfs_wc1 -file /opt/hadoop/mapreduce/map.py -file /opt/hadoop/mapreduce/reduce.py
#在wordcount 后面的两个路径,前者是我们上传的数据路径后者则是输出job的路径
- 查看目录下生成的文件
9.WordCount词频统计方法二:
- 再次进入mapreduce的目录
[hdfs@nd0-hdp hadoop-mapreduce\]$ cd /usr/hdp/3.1.0.0-78/hadoop-mapreduce
这里使用Hadoop自带的包hadoop-mapreduce-examples-3.1.1.3.1.0.0-78.jar,这个包里面包含了word count程序所以我们就省略了编程的过程。
9.1执行命令
[hdfs@nd0-hdp hadoop-mapreduce]$ hadoop jar /usr/hdp/3.1.0.0-78/hadoop-mapreduce/hadoop-mapreduce-examples-3.1.1.3.1.0.0-78.jar wordcount /hdfs_wc/ /hdfsout1
#在wordcount 后面的两个路径,前者是我们上传的数据路径后者则是输出job的路径
- 执行完成后查看目录下的文件
[hdfs@nd0-hdp hadoop-mapreduce]$ hadoop fs -ls /hdfsout1/
Found 2 items
-rw-r--r-- 3 hdfs hdfs 0 2020-11-11 16:16 /hdfsout1/\_SUCCESS
-rw-r--r-- 3 hdfs hdfs 115 2020-11-11 16:16 /hdfsout1/part-r-00000
[hdfs@nd0-hdp hadoop-mapreduce]$ hadoop fs -cat /hdfsout1/part-r-00000
至此本次实验结束。