環境使用:hadoop3.1,Python3.6,ubuntu18.04python
Hadoop是使用Java開發的,推薦使用Java操做HDFS。編程
有時候也須要咱們使用Python操做HDFS。ubuntu
本次咱們來討論如何使用Python操做HDFS,進行文件上傳,下載,查看文件夾,以及如何使用Python進行MapReduce編程。bash
首先須要安裝和導入hdfs
庫,使用pip install hdfs
。app
from hdfs import * client = Client('http://ip:port') #2.X版本port 使用50070 3.x版本port 使用9870 client.list('/') #查看hdfs /下的目錄
client.makedirs('/test') client.makedirs('/test',permision = 777 ) # permision能夠設置參數
client.rename('/test','123') #將/test 目錄更名爲123 client.delete('/test',True) #第二個參數表示遞歸刪除
將/test/log.txt
文件下載至/home
目錄下。函數
client.download('/test/log.txt','/home')
with client.read("/test/[PPT]Google Protocol Buffers.pdf") as reader: print reader.read()
其餘參數:oop
將文件上傳至hdfs的 /test
下。測試
client.upload(‘/test’,’/home/test/a.log’)
編寫mapper
代碼,map.py
:編碼
import sys for line in sys.stdin: fields = line.strip().split() for item in fields: print(item + ' ' + '1')
編寫reducer
代碼,reduce.py
:spa
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
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
,查看結果:
輸入文件file1
的樣例以下:20150101 x
20150102 y
20150103 x
20150104 y
20150105 z
20150106 x
輸入文件file2
的樣例以下:20150101 y
20150102 y
20150103 x
20150104 z
20150105 y
根據輸入文件file1
和file2
合併獲得的輸出文件file3
的樣例以下:
20150101 x
20150101 y
20150102 y
20150103 x
20150104 y
20150104 z
20150105 y
20150105 z
20150106 x
對於兩個輸入文件,即文件file1
和文件file2
,請編寫MapReduce
程序,對兩個文件進行合併,並剔除其中重複的內容,獲得一個新的輸出文件file3
。
爲了完成文件合併去重的任務,你編寫的程序要能將含有重複內容的不一樣文件合併到一個沒有重複的整合文件,規則以下:
x,y,z
排列。輸入文件內容以下: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
你編寫的程序要能挖掘父子輩關係,給出祖孫輩關係的表格。規則以下:
A-Z
排列