我的map reduce工作依赖于第三方库,比如hive-hcatalog-.jar。我所有的工作都是通过oozie来完成的。mapreduce作业通过java操作运行。在我的工作中加入第三方库的最佳方式是什么?我手头有两个选择
将所有依赖jar捆绑到主jar中,并创建一个胖jar。
将所有依赖jar保存在hdfs位置,并通过-libjars选项添加它
我能选哪一个?请给我建议。
由于我的mapreduce作业是通过oozie的java操作调用的,因此oozie lib文件夹中可用的库不会添加到mapper/reducer的类路径中。如果我将这个java操作更改为map reduce操作,jar是否可用?
提前谢谢。
2条答案
按热度按时间omhiaaxx1#
显然,您可以采用您建议的方法,但是oozie已经为sharelib做好了准备
hcatalog
. 你可以用他们的开箱即用oozie.action.sharelib.for.actiontype
你的财产job.properties
. 对于java
可以指定的操作:这将从oozie共享库加载库
hcatalog
进入你的发射器工作。这样就可以了。您可以 checkout
hcatalog
在这里:cvxl0en22#
1.将所有依赖jar捆绑到主jar中,并创建一个fat jar。或者2.将所有依赖jar保存在一个hdfs位置,并通过-libjars选项添加它我可以选择哪一个?
不过,这两种方法都在实践中。我建议你使用uberjar,即你的第一种方法。
uberjar:一个有
lib/
其中包含更多依赖jar(一种称为“uber”jar的结构)的文件夹,并且您通过常规的“hadoop jar”命令提交作业,这些lib/.jar会被框架获取,因为提供的jar是通过conf.setJarByClass
或者conf.setJar
. 也就是说,如果这个用户uberjar以mapred…jar的身份进入jt,那么框架会正确地处理它,lib/.jar都会被考虑并放在classpath
.为什么?
这样做的好处是,你可以分发你的uberjar,而完全不在乎目的地是否安装了依赖项,因为你的uberjar实际上没有依赖项。
由于我的mapreduce作业是通过oozie的java操作调用的,因此oozie lib文件夹中可用的库不会添加到mapper/reducer的类路径中。如果我将这个java操作更改为map reduce操作,jar是否可用?
对于上述问题,由于答案是广泛的,
我有
sharelib
cdh4.xx、cdh5.xx的链接&如何使用oozie shre lib配置mapreduce操作。为你