我的情况是我的 Map 减少工作依赖于第三方库,如hive-hcatalog-xxx.jar . 我正在通过oozie完成所有工作 . Mapreduce作业通过java动作运行 . 在我的工作中包含第三方图书馆的最佳方式是什么?我有两个选择
-
将所有依赖的 jar 捆绑到主 jar 里并创建一个胖 jar .
-
将所有相关的jar保留在HDFS位置,并通过-libjars选项添加它
我可以选择哪一个?请指教 .
由于我的mapreduce作业是通过oozie的java动作调用的,因此oozie lib文件夹中可用的库不会添加到mapper / reducer的类路径中 . 如果我将此java动作更改为map reduce动作,那么jar会不可用?
提前致谢 .
2 回答
虽然这两种方法都在实践中 . 我建议使用Uber jar,这是你的第一个方法 .
Uber jar:一个 jar 里面有一个
lib/
文件夹,里面装着更多的依赖 jar (一种叫做'uber' jars的结构),你通过常规的'hadoop jar'命令提交作业,这些lib / .jars会被框架拿起来因为提供的jar通过conf.setJarByClass
或conf.setJar
明确指定 . 也就是说,如果这个用户uber jar作为mapred ... jar转到JT,那么它由框架正确处理并且lib / .jars都被考虑并放在classpath
上 .优点是您可以分发您的超级jar,而不管是否在目的地安装了依赖项,因为您的超级jar实际上没有依赖项 .
对于上述问题,由于答案很广泛,
我有来自CDH4.xx,CDH5.xx和How to configure Mapreduce action with Oozie shre lib.的
sharelib
链接给你您显然可以采用您建议的方法,但Oozie已经为
hcatalog
准备了sharelib . 您可以在job.properties
中使用oozie.action.sharelib.for.actiontype
属性开箱即用 . 对于java
操作,您可以指定:这会将oozie share lib
hcatalog
中的库加载到启动器作业中 . 这应该做的工作 .您可以在此处查看
hcatalog
的内容: