google-api - 将 50TB 数据从本地 Hadoop 集群迁移到 Google Cloud Storage

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

我正在尝试将 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 的推荐方法是使用 Google Cloud Storage connector for Hadoop .该站点上的说明主要用于在 Google Compute Engine VM 上运行 Hadoop,但您也可以直接下载 GCS 连接器,gcs-connector-1.2.8-hadoop1.jar如果您使用的是 Hadoop 1.x 或 Hadoop 0.20.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
    

    然后,您可能需要使用服务帐户“ key 文件”身份验证,因为您在本地 Hadoop 集群上。访问您的 cloud.google.com/console,查找 APIs & auth在左侧,单击 Credentials , 如果你还没有一键点击Create new Client ID , 选择 Service account在点击 Create client id 之前,然后现在,连接器需要“.p12”类型的 key 对,所以单击 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 协议(protocol);它只知道如何处理实际的本地文件系统文件或如您所说的 GCS/S3 文件。

    问题 3:使用 Java API 的好处是灵 active ;您可以选择如何处理错误、重试、缓冲区大小等,但这需要更多的工作和计划​​。使用 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

    关于google-api - 将 50TB 数据从本地 Hadoop 集群迁移到 Google Cloud Storage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25291397/

    相关文章:

    ruby-on-rails - 在 Ruby 中打开并读取 Google Drive 中的文件

    java - NoClassDefFoundError : com/google/appengine/api/urlfetch/ResponseTooLargeException

    hadoop - 从 Hadoop 访问只读的 Google Storage 存储桶

    hadoop - 使用来自 Hadoop BigQuery 连接器的 ignoreUnknownValues

    hadoop - 创建集群后,如何更改基于谷歌云的hadoop启用集群的默认存储桶?

    node.js - 无法通过 Google API node.js SDK 使用现有访问 token 进行授权

    javascript - 使用 angularJS 从 JSON url 获取数据

    javascript - google analytics api根据帐户更改网络属性

    java - 异常使用 HttpRequest.execute() : Invalid use of SingleClientConnManager: connection still allocated

    java - 为简单的单用户桌面应用程序设置 oauth