我正在尝试使用 Google 的 Cloud Storage Connector for Hadoop 在 Hadoop 上运行 Oryx: https ://cloud.google.com/hadoop/google-cloud-storage-connector
我更喜欢将 Hadoop 2.4.1 与 Oryx 一起使用,因此我将 hadoop2_env.sh 设置用于我在 google 计算引擎上创建的 hadoop 集群,例如:
.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 在计算引擎上安装的预期匹配,例如:
$ 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目录,eg: hadoop:配置文件
虽然我不需要进行任何更改,但这个问题只有在我将配置文件复制到新创建的目录时才能解决,例如:
sudo mkdir /etc/hadoop/conf
sudo cp /home/hadoop/hadoop-install/etc/hadoop/* /etc/hadoop/conf
那么这是为什么呢?这是使用 google hadoop 连接器的结果吗?
2)在“解决”上述问题之后,我发现(在我看来)与 hadoop 集群和 google 文件系统之间的通信有关的其他错误:
2014 年 10 月 1 日星期三 20:18:30 UTC 警告无法为您的平台加载 native-hadoop 库...在适用的情况下使用内置 java 类
2014 年 10 月 1 日星期三 20:18:30 UTC 信息 命名空间前缀:hdfs://BUCKET_NAME
2014 年 10 月 1 日星期三 20:18:30 UTC 在 com.cloudera.oryx.common.servcomp.StoreUtils.listGenerationsForInstance(StoreUtils.java:50) 在 com.cloudera.oryx.computation 执行 java.lang.ExceptionInInitializerError 时出现严重意外错误。 PeriodicRunner.run(PeriodicRunner.java:173) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304) at java.util .concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java: 1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在 java.lang.Thread.run(Thread.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.(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(FileSystem.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.(Store.java:76) at com.cloudera.oryx.common.servcomp.Store.(Store.java:57) ... 还有 9 个
引起:java.net.UnknownHostException: BUCKET_NAME ... 22 更多
与我相关的是,当我将默认文件系统设置为 gs:// 时,命名空间前缀是 hdfs://
也许这会导致 UnkownHostException?
请注意,我已“确认”hadoop 集群已连接到 google 文件系统,例如:hadoop fs -ls 生成我的 google 云存储桶的内容以及 gs://BUCKET_NAME 目录的所有预期内容。但是,我不熟悉通过 hadoop 连接器对 hadoop 的 google 表现,以及我通常测试以查看 hadoop 集群是否正在运行的传统方式,即:jps 仅产生 6440 Jps,而不是列出所有节点。但是,我从 hadoop 集群的主节点(即 PREFIX_NAME-m)运行此命令,并且在使用 google 云存储连接器用于 hadoop 时,我不确定预期的输出。
那么,如何解决这些错误并让我的 oryx 作业(通过 hadoop)成功访问我的 gs://BUCKET_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:50) 在 com.cloudera.oryx.computation 执行 java.lang.ExceptionInInitializerError。 PeriodicRunner.run(PeriodicRunner.java:173) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304) at java.util .concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java: 1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker。在 java.lang.Thread.run(Thread.java:745) 处运行(ThreadPoolExecutor.java:615)
引起:java.lang.RuntimeException:java.lang.ClassNotFoundException:类 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(FileSystem.java:2586) 在 org.apache.hadoop.fs.FileSystem.access $200(FileSystem.java:89) at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2625) at 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.(Store.java:76) 在 com.cloudera.oryx.common.servcomp。商店。(商店。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_CLASSPATH) 产生:
/contrib/capacity-scheduler/.jar:/home/hadoop/hadoop-install/share/hadoop/common/lib/gcs-connector-1.2.9-hadoop2.jar:/contrib/capacity-scheduler/.jar:/ _ _主页/hadoop/hadoop-install/share/hadoop/common/lib/gcs-connector-1.2.9-hadoop2.jar
我需要在类路径中添加更多内容吗?
我还注意到(可能相关)即使使用导出命令,我仍然会收到 /etc/hadoop/conf 的错误。我一直在使用 sudo mkdir /etc/hadoop/conf 作为临时解决方法。我在这里提到这一点,以防它可能导致其他问题。