将50TB数据从本地Hadoop集群迁移到Google云存储

时间:2014-08-13 16:25:45

标签: google-api google-api-java-client google-hadoop

我正在尝试将我的Hadoop群集中的现有数据(JSON)迁移到Google云端存储。

我已经探索过GSUtil,似乎是将大数据集移动到GCS的推荐选项。它似乎可以处理庞大的数据集。虽然GSUtil似乎只能将数据从本地机器移动到GCS或S3< - > GCS,但是无法从本地Hadoop集群移动数据。

  1. 将数据从本地Hadoop集群移动到GCS的推荐方法是什么?

  2. 对于GSUtil,是否可以直接将数据从本地Hadoop集群(HDFS)移动到GCS,还是首先需要在运行GSUtil的机器上复制文件然后转移到GCS?

  3. 使用Google客户端(Java API)库与GSUtil相比有哪些优缺点?

  4. 非常感谢,

2 个答案:

答案 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);`