问题 1:将数据从本地 Hadoop 集群移动到 GCS 的推荐方法是使用Google Cloud Storage connector for Hadoop。该站点上的说明主要用于在 Google Compute Engine 虚拟机上运行 Hadoop,但如果您使用的是 Hadoop 1.x 或 Hadoop 0.20 ,您也可以直接下载 GCS 连接器, gcs-connector-1.2.8-hadoop1.jar .x 或gcs-connector-1.2.8-hadoop2.jar用于 Hadoop 2.x 或 Hadoop 0.23.x。
只需将 jarfile 复制到您的 hadoop/lib 目录中,或者$HADOOP_COMMON_LIB_JARS_DIR
对于 Hadoop 2:
cp ~/Downloads/gcs-connector-1.2.8-hadoop1.jar /your/hadoop/dir/lib/
如果您运行的是 0.20.x,您可能还需要将以下内容添加到您的 hadoop/conf/hadoop-env.sh 文件中:
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/your/hadoop/dir/lib/gcs-connector-1.2.8-hadoop1.jar
然后,您可能需要使用服务帐户“密钥文件”身份验证,因为您在本地 Hadoop 集群上。访问您的 cloud.google.com/console,在左侧APIs & auth
找到,Credentials
单击密钥对,因此单击并跟踪下载的 .p12 文件。在将其放置在更容易从 Hadoop 访问的目录中之前重命名它可能会很方便,例如:Create new Client ID
Service account
Create client id
Generate new P12 key
cp ~/Downloads/*.p12 /path/to/hadoop/conf/gcskey.p12
将以下条目添加到 Hadoop conf 目录中的 core-site.xml 文件:
<property>
<name>fs.gs.impl</name>
<value>com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem</value>
</property>
<property>
<name>fs.gs.project.id</name>
<value>your-ascii-google-project-id</value>
</property>
<property>
<name>fs.gs.system.bucket</name>
<value>some-bucket-your-project-owns</value>
</property>
<property>
<name>fs.gs.working.dir</name>
<value>/</value>
</property>
<property>
<name>fs.gs.auth.service.account.enable</name>
<value>true</value>
</property>
<property>
<name>fs.gs.auth.service.account.email</name>
<value>your-service-account-email@developer.gserviceaccount.com</value>
</property>
<property>
<name>fs.gs.auth.service.account.keyfile</name>
<value>/path/to/hadoop/conf/gcskey.p12</value>
</property>
fs.gs.system.bucket 通常不会使用,除非在某些情况下用于映射临时文件,您可能只想为此目的创建一个新的一次性存储桶。使用主节点上的这些设置,您应该已经能够测试hadoop fs -ls gs://the-bucket-you-want to-list
. 此时,您已经可以尝试使用简单的hadoop fs -cp hdfs://yourhost:yourport/allyourdata gs://your-bucket
.
如果您想使用 Hadoop 的 distcp 加速它,请将 lib/gcs-connector-1.2.8-hadoop1.jar 和 conf/core-site.xml 同步到所有 Hadoop 节点,它应该都能按预期工作。请注意,无需重新启动数据节点或名称节点。
问题 2:虽然 Hadoop 的 GCS 连接器能够直接从 HDFS 复制而无需额外的磁盘缓冲区,但 GSUtil 不能,因为它无法解释 HDFS 协议;它只知道如何处理实际的本地文件系统文件或如您所说的 GCS/S3 文件。
问题 3:使用 Java API 的好处是灵活性;您可以选择如何处理错误、重试、缓冲区大小等,但这需要更多的工作和计划。使用 gsutil 非常适合快速用例,并且您从 Google 团队继承了许多错误处理和测试。Hadoop 的 GCS 连接器实际上是直接构建在 Java API 之上的,并且由于它都是开源的,因此您可以在 GitHub 上的源代码中看到需要哪些东西才能使其顺利运行:https:// github.com/GoogleCloudPlatform/bigdata-interop/blob/master/gcs/src/main/java/com/google/cloud/hadoop/gcsio/GoogleCloudStorageImpl.java