Google api 将50TB数据从本地Hadoop群集迁移到Google云存储
我正在尝试将Hadoop集群中的现有数据(JSON)迁移到Google云存储 我已经研究过GSUtil,它似乎是将大数据集移动到GCS的推荐选项。它似乎可以处理庞大的数据集。GSUtil似乎只能将数据从本地计算机移动到GCS或S3GCS,但无法从本地Hadoop集群移动数据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客
非常感谢,问题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文件应在