hadoop 2.4.1和用于hadoop的google云存储连接器

vwhgwdsa  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(332)

我正在尝试使用google的云存储连接器在hadoop上运行oryx:https://cloud.google.com/hadoop/google-cloud-storage-connector
我更喜欢将hadoop 2.4.1与oryx结合使用,因此我在google compute engine上创建的hadoop集群使用hadoop2_env.sh设置,例如:

.bdutil -b <BUCKET_NAME> -n 2 --env_var_files hadoop2_env.sh \
--default_fs gs --prefix <PREFIX_NAME> deploy

当我尝试使用hadoop运行oryx时,我面临两个主要问题。
1) 尽管确认我的hadoop conf目录与google在compute engine上安装的预期目录匹配,例如:

$ echo $HADOOP_CONF_DIR
/home/hadoop/hadoop-install/etc/hadoop

我仍然发现有东西在找/conf目录,例如:

Caused by: java.lang.IllegalStateException: Not a directory: /etc/hadoop/conf

我的理解是../etc/hadoop应该是/conf目录,例如:hadoop:configuration files
虽然我不需要做任何更改,但这个问题只有在我将配置文件复制到新创建的目录中时才能得到解决,例如:

sudo mkdir /etc/hadoop/conf
sudo cp /home/hadoop/hadoop-install/etc/hadoop/* /etc/hadoop/conf

为什么会这样?这是使用googlehadoop连接器的结果吗?
2) 在“解决”了上述问题之后,我发现了(对我来说)与hadoop集群和google文件系统之间的通信有关的其他错误:
星期三10月1日20:18:30 utc 2014警告无法为您的平台加载本机hadoop库。。。在适用的情况下使用内置java类
10月1日星期三20:18:30 utc 2014信息命名空间前缀:hdfs://bucket_name
2014年10月1日星期三20:18:30 utc在com.cloudera.oryx.common.servcomp.storeutils.listgenerationsforinstance(storeutils)执行java.lang.exceptionininitializerror时出现严重意外错误。java:50)在com.cloudera.oryx.computation.periodicrunner.run(periodicrunner。java:173)在java.util.concurrent.executors$runnableadapter.call(executors。java:471)在java.util.concurrent.futuretask.runandreset(futuretask。java:304)在java.util.concurrent.scheduledthreadpoolexecutor$scheduledfuturetask.access$301(scheduledthreadpoolexecutor。java:178)在java.util.concurrent.scheduledthreadpoolexecutor$scheduledfuturetask.run(scheduledthreadpoolexecutor。java:293)位于java.util.concurrent.threadpoolexecutor.runworker(threadpoolexecutor。java:1145)在java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor。java:615)在java.lang.thread.run(线程。java:745)原因:java.lang.illegalargumentexception:java.net.unknownhostexception:org.apache.hadoop.security.securityutil.buildtokenservice(securityutil)上的阻力预测。java:373)在org.apache.hadoop.hdfs.namenodeproxies.createnonhaproxy(namenodeproxies。java:258)在org.apache.hadoop.hdfs.namenodeproxies.createproxy(namenodeproxies。java:153)在org.apache.hadoop.hdfs.dfsclient.(dfsclient。java:602)在org.apache.hadoop.hdfs.dfsclient。java:547)位于org.apache.hadoop.hdfs.distributedfilesystem.initialize(distributedfilesystem)。java:139)在org.apache.hadoop.fs.filesystem.createfilesystem(filesystem。java:2591)在org.apache.hadoop.fs.filesystem.access$200(文件系统)。java:89)在org.apache.hadoop.fs.filesystem$cache.getinternal(文件系统)。java:2625)在org.apache.hadoop.fs.filesystem$cache.get(filesystem。java:2607)在org.apache.hadoop.fs.filesystem.get(filesystem。java:368)在com.cloudera.oryx.common.servcomp.store。java:76)在com.cloudera.oryx.common.servcomp.store。java:57) ... 9个以上
原因:java.net.unknownhostexception:bucket\u name。。。22个以上
与我相关的是,当我将默认文件系统设置为gs://
也许这导致了未知的例外?
注意,我已经“确认”了hadoop集群连接到google文件系统,例如:hadoop fs-ls生成我的google cloud bucket的内容和gs://bucket\u name目录的所有预期内容。不过,我并不熟悉hadoop通过hadoop连接器的google表现形式,我通常用传统的方法测试hadoop集群是否正在运行,即:jps只产生6440jps,而不是列出所有节点。但是,我正在hadoop集群的主节点上运行这个命令,即prefix_name-m,并且我不确定使用google cloud storage connector for hadoop时的预期输出。
那么,如何解决这些错误并让我的oryx作业(通过hadoop)成功访问我的gs://bucket\u name目录中的数据呢?
提前感谢您的意见或建议。
最新消息:感谢您的详细回复。作为解决方案,我将gs://硬编码为oryx,方法是更改:

prefix = "hdfs://" + host + ':' + port;
} else {
  prefix = "hdfs://" + host;

收件人:

prefix = "gs://" + host + ':' + port;
} else {
  prefix = "gs://" + host;

我现在得到以下错误:
2014年10月14日星期二20:24:50 utc在com.cloudera.oryx.common.servcomp.storeutils.listgenerationsforinstance(storeutils)上执行java.lang.exceptionininitializererror时出现严重意外错误。java:50)在com.cloudera.oryx.computation.periodicrunner.run(periodicrunner。java:173)在java.util.concurrent.executors$runnableadapter.call(executors。java:471)在java.util.concurrent.futuretask.runandreset(futuretask。java:304)在java.util.concurrent.scheduledthreadpoolexecutor$scheduledfuturetask.access$301(scheduledthreadpoolexecutor。java:178)在java.util.concurrent.scheduledthreadpoolexecutor$scheduledfuturetask.run(scheduledthreadpoolexecutor。java:293)位于java.util.concurrent.threadpoolexecutor.runworker(threadpoolexecutor。java:1145)在java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor。java:615)在java.lang.thread.run(线程。java:745)
原因:java.lang.runtimeexception:java.lang.classnotfoundexception:class com.google.cloud.hadoop.fs.gcs.googlehadoopfilesystem未在org.apache.hadoop.conf.configuration.getclass(configuration)中找到。java:1905)在org.apache.hadoop.fs.filesystem.getfilesystemclass(filesystem。java:2573)在org.apache.hadoop.fs.filesystem.createfilesystem(文件系统)。java:2586)在org.apache.hadoop.fs.filesystem.access$200(文件系统)。java:89)在org.apache.hadoop.fs.filesystem$cache.getinternal(filesystem。java:2625)在org.apache.hadoop.fs.filesystem$cache.get(filesystem。java:2607)在org.apache.hadoop.fs.filesystem.get(filesystem。java:368)在com.cloudera.oryx.common.servcomp.store.(存储。java:76)在com.cloudera.oryx.common.servcomp.store。java:57)
按照这里的说明:https://cloud.google.com/hadoop/google-cloud-storage-connector#classpath 我相信我已经将连接器jar添加到hadoop的类路径中;我补充说:

HADOOP_CLASSPATH=$HADOOP_CLASSPATH:'https://storage.googleapis.com/hadoop-lib/gcs/gcs-connector-1.2.9-hadoop2.jar

到/home/rich/hadoop-env-setup.sh。和(echo$hadoop\u classpath)产生:
/contrib/capacity scheduler/.jar:/home/hadoop/hadoop install/share/hadoop/common/lib/gcs-connector-1.2.9-hadoop2.jar:/contrib/capacity scheduler/.jar:/home/hadoop/hadoop install/share/hadoop/common/lib/gcs-connector-1.2.9-hadoop2.jar
我需要添加更多到类路径吗?
我还注意到(可能是相关的)即使使用export命令,/etc/hadoop/conf仍然会出现错误。我一直在使用sudomkdir/etc/hadoop/conf作为临时解决方案。我在这里提到这一点,以防可能导致其他问题。

n7taea2i

n7taea2i1#

似乎有几个问题;首先,通常情况下,当事情在 hadoop jar ,hadoop将各种系统环境变量和类路径等嵌入正在运行的程序中;在你的情况下,因为oryx不使用 hadoop jar ,而不是使用类似于:

java -Dconfig.file=oryx.conf -jar computation/target/oryx-computation-x.y.z.jar

那么 $HADOOP_CONF_DIR 实际上没有进入环境,所以oryxconfiguration.java中的system.getenv无法获取它,并使用默认值 /etc/hadoop/conf 价值观。这个问题可以简单地用 export 命令,您可以通过查看它是否进入子shell来测试:

echo $HADOOP_CONF_DIR
bash -c 'echo $HADOOP_CONF_DIR'
export HADOOP_CONF_DIR
bash -c 'echo $HADOOP_CONF_DIR'
java -Dconfig.file=oryx.conf -jar computation/target/oryx-computation-x.y.z.jar

第二个也是更不幸的问题是,oryx似乎硬编码“hdfs”,而不允许用户设置任何文件系统方案:

private Namespaces() {
  Config config = ConfigUtils.getDefaultConfig();
  boolean localData;
  if (config.hasPath("model.local")) {
    log.warn("model.local is deprecated; use model.local-data");
    localData = config.getBoolean("model.local");
  } else {
    localData = config.getBoolean("model.local-data");
  }
  if (localData) {
    prefix = "file:";
  } else {
    URI defaultURI = FileSystem.getDefaultUri(OryxConfiguration.get());
    String host = defaultURI.getHost();
    Preconditions.checkNotNull(host,
        "Hadoop FS has no host? Did you intent to set model.local-data=true?");
    int port = defaultURI.getPort();
    if (port > 0) {
      prefix = "hdfs://" + host + ':' + port;
    } else {
      prefix = "hdfs://" + host;
    }
  }
  log.info("Namespace prefix: {}", prefix);
}

这完全取决于oryx是否打算在未来添加对其他文件系统方案的支持,但与此同时,您要么自己更改oryx代码并重新编译,要么尝试绕过它(但可能会导致对hdfs具有硬依赖性的oryx片段失败)。
从理论上讲,对羚羊的改变应该是:

String scheme = defaultURI.getScheme();
    if (port > 0) {
      prefix = scheme + "://" + host + ':' + port;
    } else {
      prefix = scheme + "://" + host;
    }

但是,如果您确实走这条路,请记住gcs的最终列表一致性语义,其中多阶段工作流不能依赖“列表”操作来立即查找前一阶段的所有输出;oryx可能有也可能没有这种依赖性。
在您的情况下,最可靠的解决方案是部署 --default_fs hdfs ,其中bdutil仍将安装gcs连接器,以便您可以运行 hadoop distcp 要将数据从gcs临时移动到hdfs,请运行oryx,完成后将其复制回gcs。

相关问题