输入数据读取方式
1. Download
该模式下,遍历用户指定的HDFS路径下所有文件,并以文件为单位将输入数据平均分配给各Worker,Worker在执行程序启动前,将所分配到的数据文件从HDFS下载到本地指定路径。XLearning默认采用Download模式对输入数据进行处理。详细使用示例说明如下:XLearning作业提交脚本中,指定参数:
--input /tmp/input#data
在此参数示例中,Xlearning将遍历HDFS路径/tmp/input文件夹下的所有文件,根据Worker数目,将文件均匀分配给各Worker,各Worker下载所分配文件至./data(“#”后所指定名称)路径下。由此,用户可在程序中从本地(./data)操作输入文件。扩展使用示例:
a. 不同HDFS文件下载至同一本地路径,如 输入文件为/tmp/input1/file1、/tmp/input2/file2,均对应本地路径./data,
1) 将所需的不同HDFS文件以“,”分隔传入input参数,最后以"#"来拼接所指定的本地路径名
--input /tmp/input1/file1,/tmp/input2/file2#data \
2) 指定多个input参数,分别将HDFS文件对应本地目录
--input /tmp/input1/file1#data \
--input /tmp/input2/file2#data \
注意,根据Worker数目,若下载至同一本地目录下的HDFS文件存在重名现象,如:
--worker-num 1
--input /tmp/input1/file1,/tmp/input2/file1#data"
则会在Worker中下载不同HDFS目录下的"file1"文件下载至本地./data路径。该情况可通过设置提交参数"--isRenameInputFile true",XLearning将根据当前时间对文件进行重命名。(在此情况下,若用户程序存在指定文件名进行文件读取操作,可能需要进行修改)
b. 多个输入文件路径,如 分别将HDFS路径/tmp/input1、/tmp/input、/tmp/input3下载至本地路径data1、data2、data3,可通过多个input参数进行指定,示例如下:
--input /tmp/input1#data1 \
--input /tmp/input2#data2 \
--input /tmp/input3#data3 \
2. Placeholder
该模式与Download类似,不同之处在于Worker不会直接下载HDFS文件到本地指定路径,而是将所分配的HDFS文件列表通过环境变量INPUT_FILE_LIST
传给Worker中的执行程序对应进程。执行程序从环境变量os.environ["INPUT_FILE_LIST"]
中获取需要处理的文件列表,直接对HDFS文件进行读写等操作。该模式要求深度学习框架具备读取HDFS文件的功能,或借助第三方模块库如pydoop等。TensorFlow在0.10版本后已经支持直接操作HDFS文件。使用示例说明:
XLearning作业提交脚本中,指定参数:
--input /tmp/input#data \
--input-strategy PLACEHOLDER \
在此参数示例中,XLearning将遍历HDFS路径/tmp/input文件夹下的所有文件,根据Worker数目,将文件均匀分配给各Worker,各Worker将所分配的文件列表通过环境变量"INPUT_FILE_LIST"传给各执行程序,执行程序可依赖第三方库或框架自身来对HDFS文件直接操作。
注意:环境变量"INPUT_FILE_LIST"为json格式,其中,key为"input"参数所指定的本地路径,value为所分配的HDFS文件列表(list类型)
根据上述作业提交脚本,输入文件列表获取使用示例如下:
import os
import json
inputfile = json.loads(os.environ["INPUT_FILE_LIST"])
data_file = inputfile["data"]
注意,若输入文件列表太大容易造成执行命令参数过长导致作业失败。此处,若环境变量"INPUT_FILE_LIST"不存在,则说明已超出参数长度上限,XLearning会将环境变量"INPUT_FILE_LIST"应传入的内容写入本地文件"inputFileList.txt"中,用户可从该文件中读取输入文件列表,文件内容仍为json格式,如:
with open("inputFileList.txt") as f:
fileStr = f.readline()
inputfile = json.loads(fileStr)
3. InputFormat
该模式下,Worker从标准输入方式读取所分配到的数据分片信息,使用示例说明:
XLearning作业提交脚本中,指定参数:
--input /tmp/input \
--input-strategy STREAM \
在此参数示例中,XLearning将HDFS路径/tmp/input文件夹下的所有文件数据进行分片并分发给各Worker。Worker通过管道将数据传给执行程序进程,执行程序可通过标准输入方式进行数据读取,例如:
def main():
#read data from stdin
for line in sys.stdin:
#write result to stdout
sys.stdout.write(line + '\n')