输入数据读取方式

1. Download

该模式下,遍历用户指定的HDFS路径下所有文件,并以文件为单位将输入数据平均分配给各Worker,Worker在执行程序启动前,将所分配到的数据文件从HDFS下载到本地指定路径。XLearning默认采用Download模式对输入数据进行处理。详细使用示例说明如下:XLearning作业提交脚本中,指定参数:

  1. --input /tmp/input#data

在此参数示例中,Xlearning将遍历HDFS路径/tmp/input文件夹下的所有文件,根据Worker数目,将文件均匀分配给各Worker,各Worker下载所分配文件至./data(“#”后所指定名称)路径下。由此,用户可在程序中从本地(./data)操作输入文件。扩展使用示例:

  1. a. 不同HDFS文件下载至同一本地路径,如 输入文件为/tmp/input1/file1、/tmp/input2/file2,均对应本地路径./data
  2. 1) 将所需的不同HDFS文件以“,”分隔传入input参数,最后以"#"来拼接所指定的本地路径名
  3. --input /tmp/input1/file1,/tmp/input2/file2#data \
  4. 2) 指定多个input参数,分别将HDFS文件对应本地目录
  5. --input /tmp/input1/file1#data \
  6. --input /tmp/input2/file2#data \
  7. 注意,根据Worker数目,若下载至同一本地目录下的HDFS文件存在重名现象,如:
  8. --worker-num 1
  9. --input /tmp/input1/file1,/tmp/input2/file1#data"
  10. 则会在Worker中下载不同HDFS目录下的"file1"文件下载至本地./data路径。该情况可通过设置提交参数"--isRenameInputFile true"XLearning将根据当前时间对文件进行重命名。(在此情况下,若用户程序存在指定文件名进行文件读取操作,可能需要进行修改)
  11. b. 多个输入文件路径,如 分别将HDFS路径/tmp/input1、/tmp/input、/tmp/input3下载至本地路径data1data2data3,可通过多个input参数进行指定,示例如下:
  12. --input /tmp/input1#data1 \
  13. --input /tmp/input2#data2 \
  14. --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文件。使用示例说明:

  1. XLearning作业提交脚本中,指定参数:
  2. --input /tmp/input#data \
  3. --input-strategy PLACEHOLDER \
  4. 在此参数示例中,XLearning将遍历HDFS路径/tmp/input文件夹下的所有文件,根据Worker数目,将文件均匀分配给各Worker,各Worker将所分配的文件列表通过环境变量"INPUT_FILE_LIST"传给各执行程序,执行程序可依赖第三方库或框架自身来对HDFS文件直接操作。
  5. 注意:环境变量"INPUT_FILE_LIST"json格式,其中,key"input"参数所指定的本地路径,value为所分配的HDFS文件列表(list类型)
  6. 根据上述作业提交脚本,输入文件列表获取使用示例如下:
  7. import os
  8. import json
  9. inputfile = json.loads(os.environ["INPUT_FILE_LIST"])
  10. data_file = inputfile["data"]
  11. 注意,若输入文件列表太大容易造成执行命令参数过长导致作业失败。此处,若环境变量"INPUT_FILE_LIST"不存在,则说明已超出参数长度上限,XLearning会将环境变量"INPUT_FILE_LIST"应传入的内容写入本地文件"inputFileList.txt"中,用户可从该文件中读取输入文件列表,文件内容仍为json格式,如:
  12. with open("inputFileList.txt") as f:
  13. fileStr = f.readline()
  14. inputfile = json.loads(fileStr)

3. InputFormat

该模式下,Worker从标准输入方式读取所分配到的数据分片信息,使用示例说明:

  1. XLearning作业提交脚本中,指定参数:
  2. --input /tmp/input \
  3. --input-strategy STREAM \
  4. 在此参数示例中,XLearningHDFS路径/tmp/input文件夹下的所有文件数据进行分片并分发给各WorkerWorker通过管道将数据传给执行程序进程,执行程序可通过标准输入方式进行数据读取,例如:
  5. def main():
  6. #read data from stdin
  7. for line in sys.stdin:
  8. #write result to stdout
  9. sys.stdout.write(line + '\n')