我正在尝试将Hadoop集群中的现有数据(JSON)迁移到Google Cloud Storage.
我研究过GSUtil,似乎它是将大数据集迁移到GCS的推荐选项。它似乎可以处理庞大的数据集。GSUtil似乎只能将数据从本地机移动到GCS或S3<->GCS,但不能从本地Hadoop集群移动数据。
-
将数据从本地Hadoop集群移动到GCS的推荐方法是什么?
-
对于GSUtil,它可以直接将数据从本地Hadoop集群(HDFS)移动到GCS,还是需要先在运行GSUtil的机器上复制文件,然后再传输到GCS?
-
使用Google客户端(Java API)库与GSUtil的优缺点是什么?
谢谢,
问题1:将数据从本地Hadoop集群移动到GCS的推荐方法是使用Hadoop的Google Cloud Storage连接器。该网站上的说明主要是关于在Google Compute Engine vm上运行Hadoop,但是你也可以直接下载GCS连接器,如果你使用的是Hadoop 1,可以下载GCS -connector-1.2.8-hadoop1.jar。或Hadoop 0.20。或gcs-connector-1.2.8-hadoop2.jar(用于Hadoop 2)。
在hadoop 2的情况下,只需将jarfile复制到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
然后,你可能想要使用服务帐户"keyfile"身份验证,因为你是在一个本地Hadoop集群上。访问您的cloud.google.com/console,在左侧找到APIs & auth
,单击Credentials
,如果您还没有单击Create new Client ID
,请在单击Create client id
之前选择Service account
,然后现在,连接器需要一个"。因此,单击Generate new P12 key
并跟踪下载的.p12文件。在将它放在一个更容易从Hadoop访问的目录中之前,重命名它可能会很方便,例如:
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通常不会被使用,除非在某些情况下用于映射的临时文件,您可能想要为此目的创建一个新的一次性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节点,它应该都能像预期的那样工作。注意,不需要重新启动datanode或namenode。
问题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
看起来在最近的版本中几乎没有更改属性名。
' String serviceAccount = "service-account@test.gserviceaccount.com";
String keyfile = "/path/to/local/keyfile.p12";
hadoopConfiguration.set("google.cloud.auth.service.account。启用",真正的);hadoopConfiguration.set("google.cloud.auth.service.account。电子邮件",serviceAccount);hadoopConfiguration.set("google.cloud.auth.service.account。密钥文件",密钥文件);'