首页 文章

Map 中的第三方 jar 减少了工作量

提问于
浏览
1

我的情况是我的 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 回答

  • 1

    1.将所有依赖 jar 捆绑到主 jar 里并制作一个胖 jar . 或者2.保留HDFS位置中的所有相关jar并通过-libjars选项添加它我可以选择哪一个?

    虽然这两种方法都在实践中 . 我建议使用Uber jar,这是你的第一个方法 .

    Uber jar:一个 jar 里面有一个 lib/ 文件夹,里面装着更多的依赖 jar (一种叫做'uber' jars的结构),你通过常规的'hadoop jar'命令提交作业,这些lib / .jars会被框架拿起来因为提供的jar通过 conf.setJarByClassconf.setJar 明确指定 . 也就是说,如果这个用户uber jar作为mapred ... jar转到JT,那么它由框架正确处理并且lib / .jars都被考虑并放在 classpath 上 .

    为什么

    优点是您可以分发您的超级jar,而不管是否在目的地安装了依赖项,因为您的超级jar实际上没有依赖项 .

    由于我的mapreduce作业是通过oozie的java动作调用的,因此oozie lib文件夹中可用的库不会添加到mapper / reducer的类路径中 . 如果我将此java动作更改为map reduce动作,那么jar会不可用?

    对于上述问题,由于答案很广泛,

    我有来自CDH4.xxCDH5.xxHow to configure Mapreduce action with Oozie shre lib.sharelib 链接给你

  • 2

    您显然可以采用您建议的方法,但Oozie已经为 hcatalog 准备了sharelib . 您可以在 job.properties 中使用 oozie.action.sharelib.for.actiontype 属性开箱即用 . 对于 java 操作,您可以指定:

    oozie.action.sharelib.for.java=hcatalog
    

    这会将oozie share lib hcatalog 中的库加载到启动器作业中 . 这应该做的工作 .

    您可以在此处查看 hcatalog 的内容:

    hdfs dfs -ls /user/oozie/share/lib/lib_*/hcatalog
    

相关问题