在集群中运行作业之前,我需要设置 LD_LIBRARY_PATH 和 CLASSPATH。在 LD_LIBRARY_PATH 中,我需要添加运行作业时所需的一些 jar 的位置,因为这些 jar 在我的集群中可用,与 CLASSPATH 类似。
我有一个 3 NODE 集群,我需要修改所有 3 个数据节点的 LD_LIBRARY_PATH 和 CLASSPATH,以便将集群节点上可用的 jar 添加到类路径中,这样在运行作业时可以使用以下 jar,因为我避免在运行作业时复制 jar 分发以使用集群节点上所有可用的 jar
答案1
澄清一下你问题中的一些观点。如果你需要将 jar 添加到类路径,那么你可以通过多种方式执行此操作:
- 将 jar 文件硬烘焙到你的工作 jar 文件(即所谓的 jar-in-jar 方法),其中每个依赖 jar 文件都放在主工作 jar 文件的一个 lib 文件夹中
- 将 jar 上传到 HDFS 并修改作业配置以将这些 jar 包含在 map 的类路径中/减少执行时间(
DistributedCache.addFileToClassPath(new Path("hdfs://namenode:8020/myapp/mylib.jar"), job);
) - 与上述相同,但让作业客户端完成将 jar 上传到 HDFS 并配置分布式缓存的工作(假设您使用 ToolRunner.run() 来启动您的作业):
hadoop jar myjar.jar org.MainClass -libjars dep1.jar,dep2.jar
LD_LIBRARY_PATH 用于本机共享库(编译的 C 代码)。如果要包含 .so 库,则可以使用 -files 选项(类似于前面的 -libjars 示例)让作业客户端将 .so 上传到 HDFS,并配置每个 map/reduce 任务以将其包含在 java.library.path 属性中:hadoop jar myjar.jar org.MainClass -files libIOProcs.so