我试图使用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自定义脚本只允许一个reducer吗?非常感谢提前!
答案 0 :(得分:0)
我可以告诉你是的,Hive绝对可以为每个查询提供多个MapReduce作业,因此不止一个Reducer。从理论上讲,这并没有错。
不幸的是,我无法告诉你这里失败了什么。从错误消息中,出于某种原因,Hive无法找到您的reducer脚本...仔细检查它是您认为的位置。尝试逐个执行每个命令(添加文件...,添加文件...,选择),并确保它们都没有失败或产生奇怪的输出。最后,您可以使用中间表来尝试此操作。第一个查询使用第一个reduce脚本,并输出到临时表。第二个查询在该临时表上运行第二个reduce脚本。
希望这有帮助!