我有一个map reduce程序正在运行以读取HDFS文件,如下所示:
hadoop jar /opt/mapr/hadoop/hadoop-0.20.2/contrib/streaming/hadoop-0.20.2-dev-streaming.jar -Dmapred.reduce.tasks=1000 -file $homedir/mapper.py -mapper $homedir/mapper.py -file $homedir/reducer.py -reducer $homedir/reducer.py -input /user/data/* -output /output/ 2> output.text
要确认的是,路径/ user / data / *包含文件夹,/ user / data / *会迭代所有子文件夹下的所有文件吗?
hdfs文本文件包含每行的JSON字符串,因此映射器读取文件如下:
for line in sys.stdin:
try:
object = json.loads(line)
但是HDFS的所有者将文件从文本更改为sequencefile。我发现地图减少程序输出了很多零大小的文件,这可能意味着它没有成功地从HDFS读取文件。
我应该如何更改代码以便我可以从序列文件中读取?我还有一个HIVE外部表来执行基于mapreduce输出的聚合和排序,并且HIVE之前存储为TEXTFILE,我应该更改为STORED AS SEQUENCEFILE吗?
谢谢,
答案 0 :(得分:4)
查看this
在mapreduce作业之前运行python文件以下
输入:您的序列文件
输出:你输入mapreduce
import sys
from hadoop.io import SequenceFile
if __name__ == '__main__':
if len(sys.argv) < 3:
print 'usage: SequenceFileReader <filename> <output>'
else:
reader = SequenceFile.Reader(sys.argv[1])
key_class = reader.getKeyClass()
value_class = reader.getValueClass()
key = key_class()
value = value_class()
#reader.sync(4042)
position = reader.getPosition()
f = open(sys.argv[2],'w')
while reader.next(key, value):
f.write(value.toString()+'\n')
reader.close()
f.close()
您现在不必更改原始python文件。