给了个任务是将自己开发好的模型和程序放到Hadoop平台上去执行,之前只是开发模型,不负责这些工作,第一次做,记录一下。
step1:编写一个Mapper.py
将代码的预测部分封装起来,在Mapper.py中整体有两部分,第一部分是加载模型,第二部分是模型预测,
类似:
# encoding=utf-8
import sys
import terminal_predict as pred
#加载模型
pred.model_init()
#预测
print('input the test sentence:')
for line in sys.stdin:
pred.predict_online(line)
step2:Hadoop服务器相关设置
1.将我们的代码和模型,全部放在Hadoop服务器的本地某个路径下,如:/data/person_ner_online下面,整个项目中需要用到的文件全部放在同一级目录下,不能存在二级目录中,也不能在程序中从某个文件夹里导入自己的py。
2.登录到自己数据输入的Hadoop目录下:
hadoop fs -ls /data/work
3.创建输入文件夹:
hadoop fs -mkdir /data/work/input
4.在本地终端创建自己的输入文件
vim 123.txt
5.将该输入文件上传到Hadoop的input目录下:
hadoop fs -put 123.txt /data/work/input
6.创建运行结果存储的输出文件夹output
hadoop fs -mkdir /data/work/output
step3:编写shell脚本
脚本模板如下,一般情况下我们只针对输入输出文件做一些改动即可。
#!/bin/bash
# 修改自己的输入输出目录即可
INPUT_DIR=/data/input/testCorpus.txt
OUTPUT_DIR=/data/output
hadoop fs -test -e ${OUTPUT_DIR}
if [ $? -eq 0 ] ;then
hadoop fs -rmr ${OUTPUT_DIR}
else
echo "${OUTPUT_DIR} not found!"
fi
hadoop jar /usr/local/hadoop-2.7.3/share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar \
-archives hdfs://ns3-backup/dw_ext/up/ext/content/Python.zip#Python \
-input hdfs://ns3-backup${INPUT_DIR} \
-output hdfs://ns3-backup${OUTPUT_DIR} \
-mapper "Python/bin/python Mapper.py" \
-jobconf mapred.map.tasks=15 \
-jobconf mapred.job.name="Mapper" \
-file bert_config.json \
-file bert_model.ckpt.data-00000-of-00001 \
-file bert_model.ckpt.index \
-file bert_model.ckpt.meta \
-file checkpoint \
-file bert_lstm_ner.py \
-file conlleval.py \
-file data_process.py \
-file lstm_crf_layer.py \
-file label2id.pkl \
-file label_list.pkl \
-file terminal_predict.py \
-file tf_metrics.py \
-file utils.py \
-file model.ckpt-3173.data-00000-of-00001 \
-file model.ckpt-3173.index \
-file model.ckpt-3173.meta \
-file Mapper.py \
-file tokenization.py \
-file modeling.py \
-file vocab.txt
特别注意:
1. archives hdfs 这里面的一般的Python路径一般是默认的Hadoop平台上的Python环境,如果我们在本地是用Python3跑的代码,在平台上默认用Python2,则会出现不兼容的问题,所以我们可以自己打包一个自己的开发环境,然后放到指定路径下,然后通过该参数指定我们的开发环境的路径,这样就可以解决环境兼容问题了。
2. -file 里是我们代码执行时需要调用的所有的输入文件,如果有代码是放在一个包(文件夹),或者模型在一个文件夹下,我们必须把这些所有的代码和文件都拉出来,放在最外面的一级目录,这样才可以push到Hadoop上去。
step4:将.sh脚本也放在Hadoop平台的本地,执行.sh
我们的模型预测就可以在Hadoop上运行了,最后运行结束后可以去
hadoop fs -ls /data/work/output
下查看输出文件,即可看到预测结果:
hadoop fs -cat /data/output/part-00000
关于Hadoop和编写分布式程序的资料,可以参考这篇博客: