6

我正在尝试将 Hadoop 集群中的现有数据 (JSON) 迁移到 Google Cloud Storage。

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

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

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

  3. 使用 Google 客户端 (Java API) 库与 GSUtil 的优缺点是什么?

非常感谢,

4

2 回答 2

14

问题 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 IDService accountCreate client idGenerate 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

于 2014-08-16T18:13:27.293 回答
2

看起来在最近的版本中很少更改属性名称。

`String serviceAccount = "service-account@test.gserviceaccount.com";

String keyfile = "/path/to/local/keyfile.p12";

hadoopConfiguration.set("google.cloud.auth.service.account.enable", true); hadoopConfiguration.set("google.cloud.auth.service.account.email", serviceAccount); hadoopConfiguration.set(“google.cloud.auth.service.account.keyfile”,keyfile);`

于 2017-01-04T06:53:47.787 回答