当前位置: 首页>>hadoop 1.0>> 阅读正文

Hadoop Streaming高级编程

Category: hadoop 1.0 View: 75,737 Author: Dong
, ,

  • 评论 (4)
  • 引用通告 (5)
发表评论 发起引用

  • 1楼xmubingo 回复

    Post: 2014-04-16 02:01

    -file hdfs://host:fs_port/user/dict.txt#dict_link \

    这里是不是应该用-files

    [回复]

    Dong 回复:

    都行,但是属于不同类型,存放位置不同

    [回复]

  • 2楼Erica 回复

    Post: 2014-05-28 09:23

    你好, 您的文章受用無窮~ 感謝!
    最近寫hadoop streaming遇到一個問題想請教:
    我想在Reduce.py裡面import一些軟件, 例如scipy 以利後續函式使用

    從網路上得知可以使用zipimport這個module來對zip解壓縮, 於是我將下列三行塞在Reduce.py main code的前面

    import zipimport
    importer = zipimport.zipimporter(‘myscipy.mod’)
    scipy = importer.load_module(‘scipy’)

    接著在本地操作streaming是沒問題的
    但是在Hadoop上執行job會complete, 但是丟回empty result

    /usr/local/hadoop/bin/hadoop jar /usr/local/hadoop/contrib/streaming/hadoop-*streaming*.jar -D mapred.reduce.tasks=1 -file /home/Map.py -mapper /home/Map.py -file /home/Reduce.py -reducer /home/Reduce.py -input /user/test -output /user/el17/test_result -file /home/myscipy.zip -file /home/myscipy.mod

    這問題讓我費解…empty result表示他沒有成功import scipy嗎?
    使用Python版本是 2.6
    謝謝!

    [回复]

    Dong 回复:

    你用到外部的library了,如果用到的话,你需要实现部署到各个节点上,或者通过参数-file或-files分发到各个节点上。

    [回复]

    Erica 回复:

    你好,感謝回覆, 沒錯,是外部library.
    我企圖通過參數-file來分發到各節點:
    例如-file /home/myscipy.zip, 我將scipy打包成zip檔再分發出去.
    這個zipimport舉動在local python測試是可以解包並且成功import module, 但是在hadoop上運行的時候似乎不管用, 請問如何部署到各個節點呢?
    再次感謝

    [回复]

  • 3楼KevinS 回复

    Post: 2014-06-13 14:54

    博主你好,感谢你的博客使我更进一步了解streaming。我现在用streaming处理二进制文件出现如下问题,想请教一下:
    首先,我
    采用HADOOP-1722 提供的python例子,作为mapper和reducer,用如下脚本处理:

    LOCALINPUTPATH=$HADOOP_HOME/input
    hadoop fs -rmr output
    rm output/ -r
    hadoop jar $HADOOP_HOME/contrib/streaming/hadoop-streaming-1.2.1.jar \
    -D mapred.reduce.tasks=1 \
    -fs local \
    -jt local \
    -io typedbytes \
    -input $LOCALINPUTPATH/testtb.txt \
    -output output \
    -mapper ‘tbtestMap.py’ \
    -reducer ‘tbtestReduce.py’ \
    -file ../ssypy/tbtestMap.py \
    -file ../ssypy/tbtestReduce.py

    由于-io指定了typedbytes格式,但是发现结果是文本格式的键值对,并不是typedbytes。因此我推测由于outputformat默认为textoutputformat所以在hadoop的内部自动对reducer输出的typedbytes键值对转换成了utf-8格式的文本文件。但实际中我需要的结果是二进制文件,因此我加入了
    -outputformat org.apache.hadoop.mapred.SequenceFileOutputFormat,于是我得到了一个二进制的结果,并推测其为hadoop对reducer输出的typedbytes的键值对进行解析并序列化成sequencefile的结果。
    为了验证这个推测,
    接下来,我自行编写解析sequencefile的mapper(无reducer),其中python代码与HADOOP-1722中的类似。并依然设定了inputformat为sequncefileinputformat,-io为typedbytes。最终我在maper中得到的键值对是乱码(无论是maper的输出里还是在maper中打印的log中),百思不解。
    问题解决无门,特此请教:
    1.我上述叙述中的推测是正确的吗?即-io虽然制定了reducer的输出是typedbytes,但是最终输出还是和-outputformat中的设定有关,由于默认的-outputformat是textoutputformat因此,我得到了key \t value形式的字符串文本结果。
    2.结合1的推断,如果把-outputformat设定为其他,如seqeuncefileoutputformat,则hadoop会自动对reducer输出的typedbytes结果进行解析,得到键值对序列,并重新序列化到一个sequencefile中去。
    3.如果2中的推断是正确的,为什么我解析这个sequencefile得不到想要的键值对,而是乱码。

    问题比较复杂,中间有自己的猜测。所以表述起来很乱。期待您能回复。

    [回复]

  • 4楼xmubingo 回复

    Post: 2014-07-25 09:43

    hi 大神,我又来了。如果我想用hadoop streaming,实现mapper的输入是binary,mapper的输出是text,reducer的输入是text,reducer的输出是text。这样可以吗?我的inputformat可不可以是sequence,输出inoutformat是text??inputformat会不会对mapper和reducer的输入格式都限定了。

    [回复]

    zhaoYixing 回复:

    可以实现你想要的功能,你只需要自定义InputFormat就可以了,具体做法你可以搜一下自定义Inputformat的相关博客。InputFormat的结果只会影响到mapper的输入,对reducer没有影响

    [回复]

发表评论