【问题标题】:How to load data from HDFS sequencefile in python如何在 python 中从 HDFS 序列文件加载数据
【发布时间】:2016-02-14 13:19:55
【问题描述】:

我正在运行一个 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 的所有者将文件从文本更改为序列文件。我发现 map reduce 程序输出了很多零大小的文件,这可能意味着它没有成功地从 HDFS 读取文件。

我应该对代码进行哪些更改才能从序列文件中读取?我还有一个 HIVE 外部表来根据 mapreduce 的输出执行聚合和排序,并且 HIVE 之前是 STORED AS TEXTFILE,我应该更改为 STORED AS SEQUENCEFILE 吗?

谢谢,

【问题讨论】:

    标签: python hadoop mapreduce hive sequencefile


    【解决方案1】:

    看看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 文件。

    【讨论】:

    • 谢谢,我应该更改 hadoop 流作业命令来运行这个 map reduce python 脚本吗?我粘贴的第一个代码块。
    • 如果您的输入目录相同,则无需更改作业提交命令。你将不得不改变你的 mapper.py
    • 谢谢。我使用hadoop流进行处理,mapper从stdint读取,但您的代码直接从代码中的文件读取(reader = SequenceFile.Reader("your_file_path"))。如何从标准输入读取序列文件?
    • 我看到一些帖子说将这个添加到运行hadoop作业的命令中。 -inputformat SequenceFileAsTextInputFormat
    • 非常感谢您的脚本将 sequencefile 转换为文本字符串,以便我可以让我的代码像以前一样工作。但是这个文件的输出是在本地磁盘而不是 HDFS 对吗?我的 hadoop mapreduce 从 HDFS 获取输入。另外,我应该启用参数吗? -inputformat SequenceFileAsTextInputFormat
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 2013-12-12
    • 1970-01-01
    相关资源
    最近更新 更多