【问题标题】:Sync files on hdfs having same size but varies in contents在具有相同大小但内容不同的 hdfs 上同步文件
【发布时间】:2018-01-16 20:58:25
【问题描述】:

我正在尝试使用 distcp 和 airbnb reair 实用程序将文件从一个 hadoop 集群同步到另一个集群,但它们都没有按预期工作。

如果源和目标的文件大小相同,即使文件内容已更改(校验和也不同),除非不使用覆盖选项,否则它们都无法更新它。

我需要保持 30TB 左右的同步数据,所以每次加载完整的数据集是不可行的。

如果文件大小相同(源中的计数已更改)并且校验和不同,任何人都可以建议我如何使两个数据集同步。

【问题讨论】:

  • 您是在两个不同的 HDFS 集群之间同步,还是在 HDFS 和 GCS 之类的集群之间同步?
  • @DennisHuo 在 HDFS 和 GCS 之间同步
  • 您能否解释一下为什么 DistCp 没有按预期工作?您在使用--update flag 吗?如“指定-update时,除非文件大小也不同(即除非重新创建文件),否则不会同步状态更新”
  • @GuillemXercavins 设置更新标志时,即使大小相同,也会再次复制源中的所有文件。每次我将运行 distcp 每次都会传输 30TB。
  • 做了一些快速测试,结果相同。重读 DistCp documentation 似乎要同步,您应该使用 -diff 选项并将快照与 -update 结合使用。你试过了吗?

标签: hadoop hive hadoop2 hortonworks-data-platform google-cloud-dataproc


【解决方案1】:

DistCp 处理大小相同但内容不同的文件之间的同步的方式是通过比较其所谓的FileChecksumFileChecksum 最初是在 HADOOP-3981 中引入的,主要是为了在 DistCp 中使用。不幸的是,这有一个已知的缺点,即在不同的存储实现之间不兼容,甚至在具有不同内部块/块设置的 HDFS 实例之间也不兼容。具体来说,该 FileChecksum 采用例如 512-bytes-per-chunk 和 128MB-per-block 的结构。

由于 GCS 没有“块”或“块”的相同概念,因此它没有任何类似的 FileChecksum 定义。 Hadoop 常用的所有其他对象存储也是如此。 DistCp documentation appendix 在“DistCp 和对象存储”下讨论了这个事实。

也就是说,有一个巧妙的技巧可以为 HDFS 文件定义一个很好的标准化复合 CRC 表示,该表示主要与现有 HDFS 部署就地兼容;我已经向HDFS-13056 提交了概念证明,以尝试将其添加到上游,之后应该可以使其针对 GCS 开箱即用,因为 GCS 还支持文件级 CRC32C。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-16
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    相关资源
    最近更新 更多