Hadoop Streaming 使用 Python + NLTK 进行大数据分词心得
Hadoop Streaming 就是使用 hadoop jar命令 调用streaming jar包进行MR. 通过标准输入和标准输出进行交互. 脚本语言如python会从标准输入中读, 向标准输入中写.
hadoop jar 命令有两种类型的参数, generic options 和 command options. 在格式上 必须先写generic options.
以下英文转自:https://hadoop.apache.org/docs/r1.2.1/streaming.html
bin/hadoop command [genericOptions] [streamingOptions]
The Hadoop generic command options you can use with streaming are listed here:
Parameter | Optional/Required | Description |
---|---|---|
-conf configuration_file | Optional | Specify an application configuration file |
-D property=value | Optional | Use value for given property |
-fs host:port or local | Optional | Specify a namenode |
-jt host:port or local | Optional | Specify a job tracker |
-files | Optional | Specify comma-separated files to be copied to the Map/Reduce cluster |
-libjars | Optional | Specify comma-separated jar files to include in the classpath |
-archives | Optional | Specify comma-separated archives to be unarchived on the compute machines |
给一个我自己的例子:
hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-2.8.0.jar \
-files /home/uname/PycharmProjects/untitled/pExtract/p_mapper.py,/home/uname/PycharmProjects/untitled/pExtract/p_reducer.py,hdfs://127.0.0.1:9000/output/part-00000 \
-D mapred.map.tasks=7 \
-D mapred.reduce.tasks=3 \
-input /input/casetext_LF.txt \
-output /p/above2000 \
-mapper "python p_mapper.py" \
-reducer "p_reducer.py"
-files参数: 指定要放到hadoop分布式缓存的文件, 用逗号分开. 可以指向hdfs中的文件, 在脚本调用的时候只要写文件名就可以了, 不必写全路径
-mapper -reducer参数: 指定脚本, 在上面这个例子里, mapper用的是命令形式, reducer直接填了文件名. 如果直接填文件名的话,脚本头上要加环境信息, 比如python就要加: #!/usr/bin/env python
NLTK 是一个比较特殊的python 库, 它自己还会提供一个download功能, 下载一下语料库, 分词库, 当时遇到的问题是hadoop streaming调用NLTK的函数时, 找不到NLTK自己的语料库, 解决办法:
nltk.data.path.append('/path/to/data')
在代码中显式指定NLTK的语料库文件夹 nltk_data 的位置
Hadoop Streaming 的logs位置:
在HADOOP_HOME的 logs/userlogs下, python脚本可以通过向标准错误中print信息, 来记录日志:
print >> stderr, "error message"
由于各种发行版的log位置和log编码方式都不一样, 我建议可以在python 脚本里指定一个位置自己写入文件记录日志. 可以在所有slave上开一个所有人都拥有写入权限的文件夹, 让脚本输出目录.