Mapreduce分布式并行编程(二)[包括错误排除]

246 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 之前的文章中主要讲到了如何搭建一个mapreduce平台,本文主要讲解如何在这个平台上进行代码使用,进行并行计算。

一、HDFS文件相关操作命令

(如果你是hadoop2..,可以通过主节点的50070端口的网页访问hdfs文件夹,其中还有一些存储的状态,hadoop3使用9870端口访问)
1.无法建文件夹,关闭安全模式 image.png 2.建立成功

image.png

3.Alice文件上传成功

image.png

4.存储文件,递归显示文件

image.png 5.显示文件中的数据

image.png 6.对文件进行拷贝,删除

image.png

二、使用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('/'))

image.png 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('/'))

image.png 如果这个时候出现一些没有权限的问题,可以使用 hdfs dfs -chmod -R 777 /命令解决
4.hadoop读取文件时出现错误

image.png 解决方案:通过配置host文件成功解决 image.png 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')

下载成功:

image.png

三、执行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))

image.png 后来通过修改文件权限解决问题:

image.png

image.png 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))

image.png 3.通过xftp把文件放能够到hadoop文件夹上面

image.png 4.将文件上传到hdfs上

image.png 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

image.png 出现找不到这个东西的问题,是由于我是用了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.得到最后的结果:

image.png