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