Зачем мне нужно oop lib jars в HDFS? - PullRequest
0 голосов
/ 14 апреля 2020

Я создал задание 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 jar отсутствует на hdfs://bigcluster:9000/opt/hadoop/share/hadoop/common

Файл JAR существует в / opt / hadoop / share / hadoop / common, но моя работа - поиск внутри HDFS. Если я скопирую все банки (их много) в HDFS, это сработало. Но проблема в том, я хочу понять, действительно ли это необходимо? Кто-то может объяснить мне, ПОЧЕМУ? Если я хочу запустить его в производство, нужно ли это делать? Это правильно?

Кроме того, я вижу ответ Почему мне нужно сохранить папку hbase / lib в hdfs? и да, если я изменю каркас MapReduce на YARN, он также будет работать , Но я не хочу работать с YARN и просто хочу понять, почему мне нужно переместить все Had oop libs в 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

Решение

Наконец, я получил ответ от этого комментария: { ссылка }

Внутри core-site. xml, есть два свойства для настройки файловой системы по умолчанию внутри Had oop.

<property>
    <name>fs.defaultFS</name>
    <value>hdfs://sym-cbe85-dev-chat-glb-1-ause1-hbs1.symphony.com:9000</value>
</property>
<property>
    <name>fs.default.name</name>
    <value>hdfs://sym-cbe85-dev-chat-glb-1-ause1-hbs1.symphony.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");
...