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

Google api 将50TB数据从本地Hadoop群集迁移到Google云存储,google-api,google-api-java-client,google-hadoop,Google Api,Google Api Java Client,Google Hadoop,我正在尝试将Hadoop集群中的现有数据(JSON)迁移到Google云存储 我已经研究过GSUtil,它似乎是将大数据集移动到GCS的推荐选项。它似乎可以处理庞大的数据集。GSUtil似乎只能将数据从本地计算机移动到GCS或S3GCS,但无法从本地Hadoop集群移动数据 将数据从本地Hadoop集群移动到GCS的推荐方法是什么 对于GSUtil,它能直接将数据从本地Hadoop集群(HDFS)移动到GCS吗?还是首先需要在运行GSUtil的机器上复制文件,然后传输到GCS 使用Google客

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

我已经研究过GSUtil,它似乎是将大数据集移动到GCS的推荐选项。它似乎可以处理庞大的数据集。GSUtil似乎只能将数据从本地计算机移动到GCS或S3GCS,但无法从本地Hadoop集群移动数据

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

  • 对于GSUtil,它能直接将数据从本地Hadoop集群(HDFS)移动到GCS吗?还是首先需要在运行GSUtil的机器上复制文件,然后传输到GCS

  • 使用Google客户端(JavaAPI)库与使用GSUtil相比有哪些优点和缺点


  • 非常感谢,

    问题1:将数据从本地Hadoop集群移动到GCS的推荐方法是使用。该站点上的说明主要用于在Google计算引擎VM上运行Hadoop,但是您也可以直接下载GCS连接器,如果您使用的是Hadoop 1.x或Hadoop 0.20.x,或者Hadoop 2.x或Hadoop 0.23.x

    对于hadoop 2,只需将JAR文件复制到hadoop/lib目录或
    $hadoop\u COMMON\u lib\u JARS\u目录中即可:

    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,在左侧找到
    api和auth
    ,单击
    Credentials
    ,如果您还没有一次单击
    Create new Client ID
    ,请在单击
    Create Client ID
    之前选择
    Service account
    ,然后现在,连接器需要一个“.p12”类型的密钥对,因此,单击
    生成新的P12密钥
    ,并跟踪下载的.P12文件。在将其放在更容易从Hadoop访问的目录中之前,可以方便地对其进行重命名,例如:

    cp ~/Downloads/*.p12 /path/to/hadoop/conf/gcskey.p12
    
    将以下条目添加到Hadoop conf dir中的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.impl
    com.google.cloud.hadoop.fs.gcs.googlehadoop文件系统
    fs.gs.project.id
    您的ascii谷歌项目id
    fs.gs.system.bucket
    你的项目拥有的一些桶
    fs.gs.working.dir
    /
    fs.gs.auth.service.account.enable
    真的
    fs.gs.auth.service.account.email
    您的服务帐户-email@developer.gserviceaccount.com
    fs.gs.auth.service.account.keyfile
    /路径/to/hadoop/conf/gcskey.p12
    
    通常不会使用fs.gs.system.bucket,除非在某些情况下用于映射的临时文件,您可能只需要为此创建一个新的一次性bucket。通过主节点上的这些设置,您应该已经能够测试想要列出的bucket了。此时,您已经可以尝试使用一个简单的
    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节点,并且它应该按照预期工作。请注意,无需重新启动datanodes或namenodes

    问题2:虽然用于Hadoop的GCS连接器能够直接从HDFS复制,而不需要额外的磁盘缓冲区,但GSUtil不能,因为它无法解释HDFS协议;它只知道如何处理实际的本地文件系统文件,或者如您所说的GCS/S3文件


    问题3:使用JavaAPI的好处是灵活性;您可以选择如何处理错误、重试、缓冲区大小等,但这需要更多的工作和计划。使用gsutil有利于快速使用案例,并且您从Google团队继承了大量错误处理和测试。用于Hadoop的GCS连接器实际上是直接构建在Java API之上的,而且由于它都是开源的,因此您可以在GitHub上的源代码中看到它需要做哪些工作才能顺利工作:

    看起来在最近的版本中几乎没有更改属性名称

    `String servicecomport=“服务-account@test.gserviceaccount.com";

    字符串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)`

    非常感谢Dennis的详细回复,我也在考虑gsutil将我的50TB数据传输到地面军事系统。我选择解决方案(Hadoop connector或GsUtil)的标准是将数据上载到GCS所需的总时间。您认为Hadoop解决方案会比GsUtil更快吗(GsUtil有一个利用多核的选项)?其次,我是否能够使用Hadoop connector将6GB hdfs文件从hdfs传输到地面军事系统,而不会丢失/更改数据(因为每个文件都由128MB hdfs块组成)?再次感谢,我才意识到原来的答案只是我回复的第一部分;我曾试图在一个不可靠的数据计划上发布它,希望我对问题2和问题3的回答有助于澄清使用GCS连接器和gsutil之间的区别。一般来说,gsutil的多线程将有助于从单个本地计算机上载文件,但对于HDFS中的数据,gsutil无法真正直接读取该数据,您需要使用
    hadoop distcp
    ,它将能够利用集群中的所有核心。使用distcp应该尽可能快。要更直接地回答您的后续问题:是的,使用hadoop distcphdfs://host:port/your-当前文件目录gs://your bucket/new file dir
    肯定比尝试使用gsutil本身要快。您的6GB hdfs文件应在