0

我试图使用 Hive 自定义脚本来执行我的 mapreduce 工作。我有以下代码:

 ADD FILE reducer1.py;
    ADD FILE reducer2.py;

    FROM (
        FROM
         (
            SELECT i.time, i.id, i.response
            FROM table_1 i
            WHERE (i.id == 12345)
            CLUSTER BY time
          ) A
          REDUCE A.* USING 'reducer1.py'
          AS (x,y,z)
          CLUSTER BY x,y
    ) B
    REDUCE B.* USING 'reducer2.py'

但是,这个蜂巢作业失败了。当我查看日志时,错误是:

“无法运行程序“/mapred/d02/local/taskTracker/usr/jobcache/job_201311040808_1131/attempt_201311040808_1131_r_000000_0/work/./rtbmapper_auctionsimulator_reducer2.py”:java.io.IOException:error=2,java.lang 中没有这样的文件或目录.ProcessBuilder.start(ProcessBuilder.java:460)

我在一开始就添加了上面两个 py 文件。此外,当我只运行 reducer1 时,它没有任何问题。我使用了以下代码:

ADD FILE reducer1.py;
FROM
     (
        SELECT i.time, i.id, i.response
        FROM table_1 i
        WHERE (i.id == 12345)
        CLUSTER BY time
      ) A
      REDUCE A.* USING 'reducer1.py'

所以我的问题是:Hive 自定义脚本是否只允许一个减速器?提前谢谢了!

4

1 回答 1

0

我可以告诉你是的,Hive 每个查询肯定可以有多个 MapReduce 作业,因此也可以有多个 Reducer。从理论上讲,这并没有什么问题。

不幸的是,我不能告诉你这里出了什么问题。从错误消息中,由于某种原因,Hive 无法找到您的减速器脚本...仔细检查它是否在您认为的位置。尝试逐个执行每个命令(添加文件...,添加文件...,选择)并确保它们都没有失败或产生奇怪的输出。最后,您可以尝试使用中间表。第一个查询使用第一个 reduce 脚本,并输出到一个临时表。第二个查询在该临时表上运行第二个 reduce 脚本。

希望这可以帮助!

于 2013-11-11T19:05:52.387 回答