我正在尝试将我的Hadoop群集中的现有数据(JSON)迁移到Google云端存储。
我已经探索过GSUtil,似乎是将大数据集移动到GCS的推荐选项。它似乎可以处理庞大的数据集。虽然GSUtil似乎只能将数据从本地机器移动到GCS或S3< - > GCS,但是无法从本地Hadoop集群移动数据。
将数据从本地Hadoop集群移动到GCS的推荐方法是什么?
对于GSUtil,是否可以直接将数据从本地Hadoop集群(HDFS)移动到GCS,还是首先需要在运行GSUtil的机器上复制文件然后转移到GCS?
使用Google客户端(Java API)库与GSUtil相比有哪些优缺点?
非常感谢,
答案 0 :(得分:13)
问题1:将数据从本地Hadoop集群移动到GCS的推荐方法是使用Google Cloud Storage connector for Hadoop。该网站上的说明主要用于在Google Compute Engine VM上运行Hadoop,但如果您使用Hadoop 1.x或Hadoop 0.20.x,也可以直接下载GCS连接器gcs-connector-1.2.8-hadoop1.jar,或者gcs-connector-1.2.8-hadoop2.jar适用于Hadoop 2.x或Hadoop 0.23.x。
在Hadoop 2的情况下,只需将jar文件复制到hadoop / lib目录或$HADOOP_COMMON_LIB_JARS_DIR
:
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
然后,您可能想要使用service-account" keyfile"身份验证,因为您使用的是内部部署的Hadoop集群。访问您的cloud.google.com/console,在左侧找到APIs & auth
,点击Credentials
,如果您还没有点击Create new Client ID
,请选择{在点击Service account
之前{1}},然后现在,连接器需要" .p12"密钥对的类型,因此请单击Create client id
并跟踪下载的.p12文件。在将其放置在更容易从Hadoop访问的目录中之前重命名它可能很方便,例如:
Generate new P12 key
将以下条目添加到Hadoop conf目录中的core-site.xml文件中:
cp ~/Downloads/*.p12 /path/to/hadoop/conf/gcskey.p12
fs.gs.system.bucket通常不会被使用,除了在某些情况下对于mapred临时文件,您可能只想为此目的创建一个新的一次性存储桶。通过主节点上的这些设置,您应该已经能够测试<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>
。此时,您已经可以尝试使用简单的hadoop fs -ls gs://the-bucket-you-want to-list
将所有数据汇集到主节点之外。
如果您想使用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
答案 1 :(得分:2)
看起来在最近的版本中更改了几个属性名称。
`String serviceAccount =&#34; service-account@test.gserviceaccount.com" ;;
String keyfile =&#34; /path/to/local/keyfile.p12" ;;
hadoopConfiguration.set(&#34; google.cloud.auth.service.account.enable&#34;,true); hadoopConfiguration.set(&#34; google.cloud.auth.service.account.email&#34;,serviceAccount); hadoopConfiguration.set(&#34; google.cloud.auth.service.account.keyfile&#34;,keyfile);`