実験環境:Linux環境、python3環境
実験要件:
1. map.pyファイルを作成し、次の点に注意してください。
1.空白行の処理については、line [0]!= ''を判断できます。
2.時間データには年、月、日が含まれ、年を傍受するだけで済みます
3.注文データの各行は1として数えることができます
4.ターゲット出力フォーマット:年、金額
2.自分でreduce.pyコードを書いて、ポイントに注意してください
1.データの行数はトランザクション数と見なすことができます
2.出力は年でソートする必要があります
3.ターゲット出力フォーマット:年、トランザクション数-合計
(合計金額は、13572468.98-> 13572.46kのように、小数点以下2桁のkに変換する必要があります)
実験的なアイデア:
1.マップリンク:マッピング、つまり、処理するフィールドを選択します。この質問の実験要件から判断すると、マップによって処理される最後のキー値は次のようになります。(k1、v1)=(年、金額)
2。リンクを減らす:プロトコル、同じキーワードのデータが処理されます。最終的にreduceによって処理されるキーと値のペアは次のとおりです。(k2、v2)=(年、(トランザクション数-合計))
機能的なリンクを実現する
マップ機能の実装
#map功能的实现
import sys
for line in sys.stdin:
if line[0]!="" :
col = line.strip().split(',')
col1=col[2].strip().split('-')
col[2]=col1[0]
print(col[2],',',col[6])
リデュース機能の実装
#reduce功能的实现
#!/bin/env python
# encoding: utf-8
from operator import itemgetter
import itertools
import sys
def read_mapper_output(file, separator = ','):
for line in file:
yield line.rstrip().split(separator,1)
stdin_generator=read_mapper_output(sys.stdin, ',')
for year, sals in itertools.groupby(stdin_generator,itemgetter(0) ):
count=0
total_sal=0
for year,cur_sal in sals:
count = count+1
total_sal=total_sal + float(cur_sal)
print(year,'\t',count,'\t','%.2f'%(total_sal/1000))
運用結果
実行結果の
マップローカルパイプラインテストマップコード
cat sales.csv | python map.py
Map-reduce操作の結果
map-reduceローカルパイプラインテスト:
cat sales.csv | python map.py | sort -k 1 | python reduce.py
HadoopクラスターにMapReduce関数を実装する
1.コマンドラインウィンドウを開き、Hadoopを起動します
cd /opt/hadoop/sbin
hadoop namenode -format #格式化名称节点
start-all.sh #启动服务器
jps #查看进程
2.HDFSにディレクトリ/ 001 / inputを作成し、データファイルをHDFSにアップロードします
hdfs dfs -mkdir -p /001/input #创建文件夹
hdfs dfs -put sales.csv /001/input #上传文件到集群文件夹里
hdfs dfs -ls /001/input #查看是否上传成功
3、新しいXX.shファイルを作成します
$HADOOP_HOME/bin/hadoop jar \
$HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar \
-D stream.non.zero.exit.is.failure=false \ #对于错误不报出
-D mapred.job.name="streaming_count" \ #作业的名称的命名,在浏览器输入:localhost:8088/,可以看到作业名。
-D mapred.job.priority=HIGH \ #先执行优先权高的作业
-files "/home/ubuntu/PycharmProjects/untitled/map.py,/home/ubuntu/PycharmProjects/untitled/reduce.py" \
-input /001/input/sales.csv \
-output /001/input/out001 \
-mapper "python3 map.py" \
-reducer "python3 reduce.py"
次に、XX.shフォルダーの下のコマンドウィンドウを開き、次のコードを入力して結果を実行します。
sh XX.sh
上記のコマンドを実行した結果は次のとおりです。