Hadoop 自定义映射器作为jar文件

Hadoop 自定义映射器作为jar文件,hadoop,hive,Hadoop,Hive,我想为配置单元编写一个自定义映射器,它是一个jar文件。我将如何在查询中使用它 使用常规语法: add file myfile.jar ... map using myfile.jar 似乎不起作用。我得到的错误是: 2013-04-15 22:52:26207 INFO org.apache.hadoop.hive.ql.exec.ScriptOperator:脚本未使用所有输入数据。这被认为是一个错误。 2013-04-15 22:52:26207 INFO org.apache.ha

我想为配置单元编写一个自定义映射器,它是一个jar文件。我将如何在查询中使用它

使用常规语法:

add file myfile.jar

...

map using myfile.jar
似乎不起作用。我得到的错误是:

2013-04-15 22:52:26207 INFO org.apache.hadoop.hive.ql.exec.ScriptOperator:脚本未使用所有输入数据。这被认为是一个错误。 2013-04-15 22:52:26207 INFO org.apache.hadoop.hive.ql.exec.ScriptOperator:set-hive.exec.script.allow.partial.consumption=true;忽略它。 2013-04-15 22:52:26207致命的ExecReducer:org.apache.hadoop.hive.ql.metadata.HiveException:java.io.IOException:管道破裂


注意:my jar是一个jruby文件,编译成jar,其中包含。

Hive使用“可流化”的自定义映射器和还原器—一种普通程序,从stdin读取,在stdout中写入。所以通常有一些脚本语言用于此:Python、Perl、PHP甚至Bash。当然还有Ruby

但如果您想使用java程序来实现这一点,您应该使该程序可执行。您真的需要使用Java进行普通标准输入/标准输出工作吗


UPD:所以JRuby只需使用普通Ruby即可。

Hive只需执行任何映射器脚本。在本例中,它需要像
java-jar myfile.jar
那样运行jar文件,但它试图以
/myfile.jar
的形式运行它。我的解决方案是添加一个名为
myfile.sh
的包装shell脚本。shell脚本运行jar,我使用
myfile.sh
作为映射器。通过这种方式,我可以使用
.jar
文件作为映射器。

如果您需要完全使用Java,请尝试编写您自己的UDF而不是映射器。实际上,HiveQL函数和UDF的工作原理与mapper相同。

我绝对需要使用java。相信我,这不是你的选择。jRuby不是一个选项。无法评论您的答案,所以将在这里回答:我认为wrapped.sh脚本不是解决方案。Hadoop读取主节点上的mapper和reducer程序,并在执行之前将它们发送到每个节点。如果要使用包装器,Hive/Hadoop将仅分发该包装器,而不是包装器和包装器。如果您使用
addfile
了解两者,它将分发两者。