【问题标题】:Migrating 50TB data from local Hadoop cluster to Google Cloud Storage将 50TB 数据从本地 Hadoop 集群迁移到 Google Cloud Storage
【发布时间】:2014-10-07 02:55:33
【问题描述】:

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

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

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

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

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

非常感谢,

【问题讨论】:

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


    【解决方案1】:

    问题 1:将数据从本地 Hadoop 集群移动到 GCS 的推荐方法是使用Google Cloud Storage connector for Hadoop。该站点上的说明主要用于在 Google Compute Engine 虚拟机上运行 Hadoop,但您也可以直接下载 GCS 连接器,如果您使用的是 Hadoop 1.x 或 Hadoop 0.20.x,则可以使用gcs-connector-1.2.8-hadoop1.jar,或者gcs-connector-1.2.8-hadoop2.jar Hadoop 2.x 或 Hadoop 0.23.x。

    在 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
    

    然后,您可能希望使用服务帐户“密钥文件”身份验证,因为您位于本地 Hadoop 集群上。访问你的cloud.google.com/console,在左侧找到APIs & auth,点击Credentials,如果你还没有点击Create new Client ID,选择Service account再点击Create client id,然后现在,连接器需要“.p12”类型的密钥对,因此单击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,除非在某些情况下用于映射临时文件,您可能只想为此目的创建一个新的一次性存储桶。使用主节点上的这些设置,您应该已经能够测试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

    【讨论】:

    • 非常感谢 Dennis 的详细回复,我也在考虑使用 gsutil 将我的 50TB 数据传输到 GCS。我选择解决方案(Hadoop 连接器或 GsUtil)的标准是将数据上传到 GCS 所需的总时间。您是否认为 Hadoop 解决方案会比 GsUtil 更快(gsutil 可以选择利用多个内核)?其次,我能否使用 Hadoop-connector 传输我的 6GB hdfs 文件而不会丢失/更改数据从 HDFS 到 GCS(因为每个文件都由 128MB hdfs 块组成)?再次感谢,
    • 我刚刚意识到原来的答案只发布了我回复的第一部分;我曾试图通过一个不稳定的数据计划发布它,希望我对问题 2 和问题 3 的回答有助于阐明使用 GCS 连接器与 gsutil 之间的区别。通常,gsutil 的多线程将有助于从单个本地机器上传文件,但对于 HDFS 内的数据,gsutil 无法真正直接读取该数据,您将希望使用 hadoop distcp 代替,这将能够利用所有整个集群的核心。它应该与您的网络允许的一样快,使用 distcp。
    • 为了更直接地回答您的后续问题:是的,使用 hadoop distcp hdfs://host:port/your-current-file-dir gs://your-bucket/new-file-dir 肯定比尝试使用 gsutil 本身要快。您的 6GB hdfs 文件应该未更改/完整地到达 GCS,即使一旦在 GCS 上实际底层块大小将被抽象掉(您实际上可以将它们视为 GCS 中的整体 6GB 文件)。我建议先测试一个较小的子集,或者只测试单个文件,以确保您的 distcp 在尝试完整的 50TB 之前按预期工作。
    • 非常感谢丹尼斯,非常感谢您的帮助。我正在尝试您的方法(GCS hadoop 连接器),但是由于某种原因,每当我点击“创建客户端 ID”以生成密钥时,我都无法在凭据中看到服务帐户选项。它与启用的 API 有什么关系吗?我启用了 4 个 API,即 GCS、GCS JSON API、Google Cloud SQL 和 BigQuery API。我看到以下选项: - 已安装的应用程序 在台式计算机或手持设备(如 Android 或 iPhone)上运行。 - Android 了解更多 - Chrome 应用了解更多 - iOS 了解更多 - 其他。
    • 由于服务账户经常与谷歌计算引擎虚拟机一起使用,这很可能与启用谷歌计算引擎有关;不需要实际创建任何虚拟机,尝试启用它并查看是否打开了服务帐户选项。
    【解决方案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);`

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-25
      • 2015-08-01
      • 1970-01-01
      • 2019-06-25
      • 1970-01-01
      • 2016-02-08
      相关资源
      最近更新 更多