# MR_python **Repository Path**: francisdu/MR_python ## Basic Information - **Project Name**: MR_python - **Description**: 利用Hadoop Streaming 编写 Python脚本 实现mapreduce任务 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2018-04-26 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 项目结构
|hdfs |____hdfs.py 使用python连接HDFS |wordcount |____map.py map阶段 |____reduce.py reduce阶段 |____reduce_iter.py 迭代的方式实现reduce |____run.sh 提交job的脚本 |____README.md ### 生产环境:
python 2.7 hadoop 2.7.6 pycharm 2018.1 ## Hadoop Streaming - Hadoop Streaming:

Hadoop Streaming最大的好处是让任何语言编写的map, reduce程序能够在hadoop集群上运行; map / reduce程序只要遵循从标准输入stdin读,写出到标准输出stdout即可; 其次,Hadoop Streaming容易进行单机调试,通过管道前后相接的方式就可以模拟streaming, 在本地完成map/reduce程序的调试

本地测试:
        cat word/* |
        python map.py  |
        sort |
        python reduce.py
- hadoop Streaming的局限 :

Streaming默认只能处理文本数据Textfile,对于二进制数据,比较好的方法是将二进制的key, value进行base64编码,转化为文本 Mapper和reducer的前后都要进行标准输入和标准输出的转化,涉及数据拷贝和解析,带来了一定的开销
### Streaming命令的相关参数
###### hadoop Streaming命令的形式:
/usr/local/src/hadoop-1.2.1/bin/hadoop jar  hadoop-streaming.jar \
###### 普通选项: -- 修改本地临时目录 :
-D dfs.data.dir=/tmp
-- 指定额外的本地临时目录
-D  mapred.local.dir=/tmp/local
-D  mapred.system.dir=/tmp/system
-D  mapred.tmp.dir=/tmp/tmp
-- 指定作业名
-D  mapred.job.name=”Test001”
-- 指定只有map的作业
-D  mapred.reduce.tasks=0
-- 指定reducer个数
-D  mapred.reduce.tasks=2
-- 指定mapper个数
-D  mapred.map.tasks=2
-- 指定Mapper输出的key,value分隔符
-D stream.map.output.field.separator=.
-D stream.num.map.output.key.fields=4
-- 指定reducer输出的value, key分隔符
-D stream.reduce.output.field.seperator=.
-D stream.num.reduce.output.key.fields=4
-- Inputformat如何分行,默认'\n'
-D stream.map.input.field.seperator
-- 作业优先级
-D  mapred.job.priority=HIGH
-- 最多同时运行的map任务数
-D mapred.job.map.capacity=5
-- 最多同时运行的reduce任务数
-D mapred.job.reduce.capacity=3
-- Task没有响应(输入输出)的最大时间
-D mapred.task.timeout=6000
-- Map的输出是否压缩
-D mapred.compress.map.output=True
-- Map的输出的压缩方式
-D mapred.map.output.comression.codec=
--Reduce的输出是否压缩
-D mapred.output.compress=True
-- Reducer的输出的压缩方式
-D mapred.output.compression.codec=