本文已参与「新人创作礼」活动,一起开启掘金创作之路。 之前的文章中主要讲到了如何搭建一个mapreduce平台,本文主要讲解如何在这个平台上进行代码使用,进行并行计算。
一、HDFS文件相关操作命令
(如果你是hadoop2..,可以通过主节点的50070端口的网页访问hdfs文件夹,其中还有一些存储的状态,hadoop3使用9870端口访问)
1.无法建文件夹,关闭安全模式
2.建立成功
3.Alice文件上传成功
4.存储文件,递归显示文件
5.显示文件中的数据
6.对文件进行拷贝,删除
二、使用python对hdfs进行操作
**1.下载hdfs包 **
pip install hdfs
2.建立访问 .因为我的集群装的是hadoop2.7.3,默认端口应该是50070
from hdfs import *
client=Client('http://192.168.150.17:50070/',root='/')
print(client.list('/'))
3.建立文件夹
from hdfs import *
client=Client('http://192.168.150.17:50070/',root='/')
print(client.list('/'))
client.makedirs("test_01", permission=777)
print(client.list('/'))
如果这个时候出现一些没有权限的问题,可以使用
hdfs dfs -chmod -R 777 /命令解决
4.hadoop读取文件时出现错误
解决方案:通过配置host文件成功解决
5.重命名文件,递归删除文件
client.rename('test_01','test_rename')
print(client.list('/'))
client.delete('/test_rename',True) #True表示递归删除
print(client.list('/'))
6.下载文件到一个新建的文件夹中
print(client.list('/'))
client.download('/input', 'H:/all_my_code/tsts/zju/bigdata/dld')
下载成功:
三、执行mapreduce
1.mapper.py最开始不能执行
这里mapper主要就是做分割,后面的计数工作交给reducer来完成(这样才符合mapreduce的观点)
#!/usr/bin/env python
**import** sys
# input comes from STDIN (standard input)
**for** line **in** sys.stdin:
# remove leading and trailing whitespace
line = line.strip()
# split the line into words
words = line.split()
# increase counters
**for** word **in** words:
**print** ('%s %s' % (word, 1))
后来通过修改文件权限解决问题:
2.reducer.py排序之后运行
from operator import itemgetter
import sys
current_word = None
current_count = 0
word = None
# input comes from STDIN
for line in sys.stdin:
# remove leading and trailing whitespace
line = line.strip()
# parse the input we got from mapper.py
word, count = line.split(' ', 1)
# convert count (currently a string) to int
count = int(count)
# this IF-switch only works because Hadoop sorts map output
# by key (here: word) before it is passed to the reducer
if current_word == word:
current_count += count
else:
if current_word:
# write result to STDOUT
print ('%s\t%s' % (current_word, current_count))
current_count = count
current_word = word
# do not forget to output the last word if needed!
if current_word == word:
print ('%s\t%s' % (current_word, current_count))
3.通过xftp把文件放能够到hadoop文件夹上面
4.将文件上传到hdfs上
5.输入代码开始运行
hadoop jar /usr/hadoop/hadoop-2.7.3/share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar -mapper '/root/anaconda3/bin/python3.8 /usr/local/hadoop/mapper.py' -reducer '/root/anaconda3/bin/python3.8 /usr/local/hadoop/reducer.py' -input /input/book -output /input/book-output
出现找不到这个东西的问题,是由于我是用了hadoop2.7.3版本,他找不到我想要的东西。在请教了亲爱的马龙飞博士之后,告诉我需要在命令后面指定一下文件的具体位置。(或者直接放到hadoop的安装目录下)
一下子就解决了,不愧是博士
Hadoop2如果出现不知道文件位置在上面地方的相关错误,需要在命令的最后面指定以下文件的位置。
不同与hadoop3,在mapper和reducer指定之后它还是不知道位置在哪里,出现文件找不到的问题在最后用
-file /usr/local/hadoop/mapper.py -file /usr/local/hadoop/reducer.py指定一下即可
完整命令
hadoop jar /usr/hadoop/hadoop-2.7.3/share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar -mapper /usr/local/hadoop/mapper.py -reducer /usr/local/hadoop/reducer.py -input /input/book -output /input/book-output7 -file /usr/local/hadoop/mapper.py -file /usr/local/hadoop/reducer.py
hadoop-streaming-2.7.3.jar这个jar包是为了让map和reduce之间做通讯用的,相当与shuffle
6.bash运行
HADOOP_CMD='./bin/hadoop'
STREAM_JAR_PATH='/usr/hadoop/hadoop-2.7.3/share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar '
INPUT_PATH='book'
OUTPUT_PATH='book-output'
$HADOOP_CMD jar $STREAM_JAR_PATH \
-input $INPUT_PATH \
-output $OUTPUT_PATH \
-mapper "python3 mapper.py" \
-reducer "python3 reducer.py" \
-file “/usr/local/hadoop/mapper.py” \
-file “/usr/local/hadoop/reducer.py”
7.得到最后的结果: