开发者社区> 问答> 正文

超级啰嗦版ODPSMapReduce入门

尝试了大半天,终于在ODPS当中成功实现了MapReduce。我把详细步骤及思路整理了一下,希望对大家有所帮助。写的不好或不对的地方,还望大家不吝赐教。
http://beader.me/2014/05/05/odps-mapreduce/













展开
收起
beader 2014-05-06 10:04:52 12454 0
6 条回答
写回答
取消 提交回答
  • Re超级啰嗦版ODPSMapReduce入门

    试了很多次,都是这个错误,望楼主指点

    -------------------------

    Re超级啰嗦版ODPSMapReduce入门
    解决了
    2014-05-22 12:32:49
    赞同 展开评论 打赏
  • 回4楼果子果子的帖子
    您好,根据提示错误应该发生在TestReducer.java的第42行,可否麻烦您把42行左右那块区域的代码截图下来看看。

    -------------------------

    回4楼果子果子的帖子
    您好,我刚刚又重新做了一遍,在我这里是成功的。
    根据您反映的情况,TestReducer.java第40+行大概都是在做output.set()的部分,并且这里错误提示是"index out of bound",即下标越界。我的推测是,您事先可能没有正确建立output table。
    您可以再检查下“打包、上传、建表、运行“这个部分,由于reduce中的output将会有8列,因此对应的output table也应该要有8列。例子中是在SQL中建了如下的表,供您参考,您可以再尝试一下。

    create table tb_output (user_id string, brand_id string, visit_datetime string, clicks bigint,
                           buy bigint, collect bigint, basket bigint, cum_clicks bigint);


    请注意上面的命令是在SQL下执行的噢。

    -------------------------

    Re超级啰嗦版ODPSMapReduce入门
    你的Reducer没有写错,你的output table也是正确的。并且根据错误提示,错误是发生在
    output.set(2,date)这行,出现下标越界的问题。
    output实际上是一个array,在reducer的setup函数里,output=context.createOutputRecord();这句会设定output的长度。
    而你在之前执行output.set(0,...)与output.set(1,...)这两句均没有发生问题,说明
    output被设定为长度为2了。


    但是你的output table有8列,是正确的,所以我怀疑是程序没有读到正确的那个table。请你检查这两个地方。
    第一个是在TestDriver中,



    Input和Output table的名字,是否是由args[0]和args[1]这两个参数决定。


    第二个是你在ODPS中调用的那句命令是否存在问题,重试下"打包、上传、建表、运行"这4个步骤


    由于与虚拟机之间无法复制粘贴,虽然检查再检查,可能发生我博文中的代码与我实际执行代码不一致的情况,所以我把虚拟机中的代码全部截图下来给您参考。
    TestDriver.java




    TestMapper.java




    TestReducer.java










    -------------------------

    回9楼果子果子的帖子
    哈哈,成功了就好
    2014-05-06 22:15:56
    赞同 展开评论 打赏
  • Re超级啰嗦版ODPSMapReduce入门
    对楼主的分享精神点赞,但是有个小问题向楼主请教,我按照整个步骤做下来都没有问题,在ODPSx下提交运行就报错,

    -------------------------

    Re超级啰嗦版ODPSMapReduce入门
    感谢楼主的热心,这么晚了还给我检查程序。

    -------------------------

    Re超级啰嗦版ODPSMapReduce入门
    已经找到错误的地方了,output=context.createOutputRecord()写成了output=context.createMapOutputKeyRecord(),自己的粗心浪费楼主宝贵的时间,真是太惭愧!给楼主再点个赞!
    2014-05-06 22:04:01
    赞同 展开评论 打赏
  • Re超级啰嗦版ODPSMapReduce入门
    点赞
    2014-05-06 14:52:02
    赞同 展开评论 打赏
  • Re超级啰嗦版ODPSMapReduce入门
    楼主辛苦了,大大的赞一下!
    2014-05-06 12:53:16
    赞同 展开评论 打赏
  • Re超级啰嗦版ODPSMapReduce入门

    -------------------------

    回11楼buaalsy的帖子
    怎么回事啊,我新建了一个包导出后也是这样,之前别的导出jar没有这种状况。
    2014-05-06 11:24:27
    赞同 展开评论 打赏
滑动查看更多
问答排行榜
最热
最新

相关电子书

更多
给运维工程师的Python实战课 立即下载
Augular2+进阶开发实战... 立即下载
小程序云应用入门实操系列课程 - 第一讲 立即下载

相关实验场景

更多