java - 为什么我需要将 hadoop lib jars 放入 HDFS?
问题描述
我创建了一个 MapReduce 作业,并且正在多集群环境中进行测试,但出现以下错误:
Exception in thread "main" java.io.FileNotFoundException: File does not exist: hdfs://bigcluster:9000/opt/hadoop/share/hadoop/common/hadoop-common-2.6.0.jar
at org.apache.hadoop.hdfs.DistributedFileSystem$18.doCall(DistributedFileSystem.java:1122)
at org.apache.hadoop.hdfs.DistributedFileSystem$18.doCall(DistributedFileSystem.java:1114)
at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
at org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:1114)
at org.apache.hadoop.mapreduce.filecache.ClientDistributedCacheManager.getFileStatus(ClientDistributedCacheManager.java:288)
at org.apache.hadoop.mapreduce.filecache.ClientDistributedCacheManager.getFileStatus(ClientDistributedCacheManager.java:224)
at org.apache.hadoop.mapreduce.filecache.ClientDistributedCacheManager.determineTimestamps(ClientDistributedCacheManager.java:93)
at org.apache.hadoop.mapreduce.filecache.ClientDistributedCacheManager.determineTimestampsAndCacheVisibilities(ClientDistributedCacheManager.java:57)
at org.apache.hadoop.mapreduce.JobSubmitter.copyAndConfigureFiles(JobSubmitter.java:269)
at org.apache.hadoop.mapreduce.JobSubmitter.copyAndConfigureFiles(JobSubmitter.java:390)
at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:483)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1296)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1293)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628)
at org.apache.hadoop.mapreduce.Job.submit(Job.java:1293)
at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1314)
at com.company.hbase.mapreduce.message.maestro.threadIndex.fakecolum.MockTestThreadIndexData.run(MockTestThreadIndexData.java:47)
at com.company.hbase.mapreduce.MaestroUpdateJob.main(MaestroUpdateJob.java:49)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
我看到那个hadoop-common-2.6.0.jar
罐子不见了hdfs://bigcluster:9000/opt/hadoop/share/hadoop/common
jar 文件存在于 /opt/hadoop/share/hadoop/common 上,但我的工作是在 HDFS 内部寻找。如果我将所有 jar(有很多)复制到 HDFS,它就可以工作。但问题是,我想明白,真的有必要吗?有人可以向我解释为什么?如果我想在生产中运行它,我需要做这个吗?那是对的吗?
另外,我看到了答案为什么我需要将 hbase/lib 文件夹保留在 hdfs 中?是的,如果我将 MapReduce 框架更改为 YARN,它也可以工作。但我不想使用 YARN,我只想了解为什么必须将所有 Hadoop 库移动到 HDFS 才能运行 MapReduce 作业。
更新
这是我实例化jobconf的方式
Job job = Job.getInstance(config, "MyJob");
Scan scan = createScan();
Filter filter = createMyFilter();
FilterList filters = createMyFilter();
scan.setFilter(filters);
TableMapReduceUtil.initTableMapperJob(
MY_TABLE,
scan,
MyMapper.class,
null,
null,
job
);
TableMapReduceUtil.initTableReducerJob(
MY_TABLE,
null,
job
);
job.setNumReduceTasks(0);
这是我的mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>myhost:9001</value>
</property>
<property>
<name>hadoop.ssl.enabled</name>
<value>true</value>
</property>
<property>
<name>hadoop.ssl.require.client.cert</name>
<value>false</value>
<final>true</final>
</property>
<property>
<name>hadoop.ssl.hostname.verifier</name>
<value>DEFAULT</value>
<final>true</final>
</property>
<property>
<name>hadoop.ssl.keystores.factory.class</name>
<value>org.apache.hadoop.security.ssl.FileBasedKeyStoresFactory</value>
<final>true</final>
</property>
<property>
<name>hadoop.ssl.server.conf</name>
<value>ssl-server.xml</value>
<final>true</final>
</property>
<property>
<name>hadoop.ssl.client.conf</name>
<value>ssl-client.xml</value>
<final>true</final>
</property>
</configuration>
我如何运行这个:
HADOOP_CLASSPATH=`/opt/hbase/bin/hbase classpath` /opt/hadoop/bin/hadoop jar /tmp/mymapred-1.0-SNAPSHOT-jar-with-dependencies.jar
解决方案
最后,我从这条评论中得到了答案:https ://stackoverflow.com/a/31950822/13305602
在 core-site.xml 中,有两个属性可以配置 Hadoop 中的默认文件系统。
<property>
<name>fs.defaultFS</name>
<value>hdfs://myhost.mycompany.com:9000</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://myhost.mycompany.com:9000</value>
</property>
这两个属性的默认值file://
见此处:https ://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/core-default.xml
您可以更改此属性,core-site.xml
或者如果您处于无权访问该属性的环境中,则只能在 jobConf 的作业上下文设置中执行此操作。
Configuration configuration = new Configuration();
configuration.set("fs.defaultFS", "file:///");
configuration.set("fs.default.name", "file:///");
Job job = Job.getInstance(configuration, "MyJob");
解决方案
推荐阅读
- node.js - TypeError:无法读取节点 js 中未定义电子的属性“showMessageBox”
- visual-studio - 如何找到解决方案正在使用的默认 windows sdk 版本?
- c# - 使用下拉 Unity 隐藏/显示面板
- asp.net-core - 每当我添加 Microsoft.EntityframeworkCore.SqlServer 时生成错误
- javascript - 大型 HTML5 画布从 p5.js 呈现每帧需要 400-500 毫秒。这是图书馆的限制吗?
- angular - else 在 ng-if 中阻塞
- .net-core - 如何使用 Angular 部署 .NET Core 应用程序
- python - 有没有办法使用 python 将 Windows 鼠标光标更改为自定义光标?
- ios - KeyboardAvoidingView 在 IOS 上无法按预期工作
- python-3.x - 如何合并重复列值的行