大数据,机器学习,人工智能Hadoop大数据大数据

使用Python操作Hadoop,Python-MapReduc

2019-04-07  本文已影响5人  MasterXiao

环境

环境使用:hadoop3.1,Python3.6,ubuntu18.04

Hadoop是使用Java开发的,推荐使用Java操作HDFS。

有时候也需要我们使用Python操作HDFS。

本次我们来讨论如何使用Python操作HDFS,进行文件上传,下载,查看文件夹,以及如何使用Python进行MapReduce编程。

使用Python操作HDFS

首先需要安装和导入hdfs库,使用pip install hdfs

1. 连接并查看指定路径下的数据

from hdfs import * 
client = Client('http://ip:port')  #2.X版本port 使用50070  3.x版本port 使用9870
client.list('/')   #查看hdfs /下的目录

2. 创建目录

client.makedirs('/test')
client.makedirs('/test',permision = 777 ) # permision可以设置参数

3. 重命名、删除

client.rename('/test','123')  #将/test 目录改名为123
client.delete('/test',True)  #第二个参数表示递归删除 

4.下载

/test/log.txt 文件下载至/home目录下。

client.download('/test/log.txt','/home') 

5. 读取

with client.read("/test/[PPT]Google Protocol Buffers.pdf") as reader:    
    print reader.read()

其他参数:

6.上传数据

将文件上传至hdfs的 /test下。

client.upload(‘/test’,’/home/test/a.log’)

Python-MapReduce

编写mapper代码,map.py

import sys

for line in sys.stdin:
    fields = line.strip().split()
    for item in fields:
        print(item + ' ' + '1')

编写reducer代码,reduce.py

import sys

result = {}
for line in sys.stdin:
    kvs = line.strip().split(' ')
    k = kvs[0]
    v = kvs[1]
    if k in result:
        result[k]+=1
    else:
        result[k] = 1
for k,v in result.items():
    print("%s\t%s" %(k,v))

添加测试文本,test1.txt

tale as old as time
true as it can be
beauty and the beast

本地测试执行map代码:

cat test1.txt | python map.py
结果:

tale 1
as 1
old 1
as 1
time 1
true 1
as 1
it 1
can 1
be 1
beauty 1
and 1
the 1
beast 1

本地测试执行reduce代码:

cat test1.txt | python map.py | sort -k1,1 | python reduce.py

执行结果:

and 1
be  1
old 1
beauty  1
true    1
it  1
beast   1
as  3
can 1
time    1
the 1
tale    1

在Hadoop平台执行map-reduce程序

本地测试完毕,编写脚本在HDFS中执行程序

脚本:run.sh (请根据本机环境修改)

HADOOP_CMD="/app/hadoop-3.1.2/bin/hadoop"

STREAM_JAR_PATH="/app/hadoop-3.1.2/share/hadoop/tools/lib/hadoop-streaming-3.1.2.jar"

INPUT_FILE_PATH_1="/py/input/"

OUTPUT_PATH="/output"

$HADOOP_CMD fs -rmr-skipTrash $OUTPUT_PATH

# Step 1.

$HADOOP_CMD jar $STREAM_JAR_PATH   \
-input $INPUT_FILE_PATH_1   \
-output $OUTPUT_PATH   \
-mapper "python  map.py"   \
-reducer "python reduce.py"  \
-file ./map.py   \
-file ./reduce.py  \

添加执行权限chmod a+x run.sh
执行测试:bash run.sh,查看结果:

image.png

练习

1. 文件合并去重

输入文件file1的样例如下:
20150101 x
20150102 y
20150103 x
20150104 y
20150105 z
20150106 x

输入文件file2的样例如下:
20150101 y
20150102 y
20150103 x
20150104 z
20150105 y

根据输入文件file1file2合并得到的输出文件file3的样例如下:

20150101 x
20150101 y
20150102 y
20150103 x
20150104 y
20150104 z
20150105 y
20150105 z
20150106 x

对于两个输入文件,即文件file1和文件file2,请编写MapReduce程序,对两个文件进行合并,并剔除其中重复的内容,得到一个新的输出文件file3
为了完成文件合并去重的任务,你编写的程序要能将含有重复内容的不同文件合并到一个没有重复的整合文件,规则如下:

2. 挖掘父子关系

输入文件内容如下:
child parent
Steven Lucy
Steven Jack
Jone Lucy
Jone Jack
Lucy Mary
Lucy Frank
Jack Alice
Jack Jesse
David Alice
David Jesse
Philip David
Philip Alma
Mark David
Mark Alma

输出文件内容如下:

grandchild grandparent
Steven Alice
Steven Jesse
Jone Alice
Jone Jesse
Steven Mary
Steven Frank
Jone Mary
Jone Frank
Philip Alice
Philip Jesse
Mark Alice
Mark Jesse

你编写的程序要能挖掘父子辈关系,给出祖孙辈关系的表格。规则如下:

上一篇 下一篇

猜你喜欢

热点阅读