在Hadoop文件系统上执行更新的最佳方法是什么?



在Hadoop文件系统上执行更新的最佳方法是什么?例如,我有一个包含数据的 avro 文件,对于下一次运行,我需要更新 avro 文件本身中的数据。我们该如何解决这个问题?

例如:我在HDFS上有以下数据,下次需要更新"子区"数组

{ "名称": "地区名称", "_class": "org.bitbucket.codezarvis.api.dto.DistrictDocument", "type": "区"、"分区":[ 256, 257 ] }

HDFS被设计为一个一次写入,只追加的文件系统。 也就是说,您有几个选项可以执行更新操作:

  • 使用 HBase,它在底层 HDFS 文件之上提供了一个无 sql 系统。 请记住,它隐藏了您的魔力,但它仍然必须执行您必须执行的操作 - 复制文件,仅替换必要的部分,交换文件等。 它的性能不会很出色,但它会完成工作。
  • Hive 插入覆盖将允许你运行执行更新/计算的查询,然后使用更新的数据覆盖表。 或者,您可以将覆盖限制为单个分区,然后考虑如何管理分区。
  • 不要更新,始终写入新行/文件。 当您有新数据时,即使它替换了其他数据,也可以将其写入新分区。 从表中选择数据时,始终仅选择最新的分区。 您的数据历史记录将继续增长,您可以在其他时间删除这些较旧的分区。

忠告 - 如果你发现自己在Hadoop中经常处于这种情况,请重新考虑Hadoop是否是最佳选择。 ACID 最好由 SQL 解决方案完成。

架构演变是一个通用概念,用于在不重写现有数据的情况下修改架构。 如果数据作为AVRO存储在Hive表中(底层数据存储在HDFS中),则可以更改模式。 (尽管这也有一些限制)。

我还想出了文档的应用程序和设计

{
"diffs": [{
"before": null,
"after": {
"org.bitbucket.codezarvis.api.dto.DistrictDocument": {
"districtId": {
"mostSigBits": -917,
"leastSigBits": -562
},
"state": null,
"subDistricts": {
"array": [{
"subDistrictId":111,
"longitudeOfPoi": {
"string": "1.52256"
},                      
"latitudeOfPoi": {
"string": "42.543528"
}
}
}
}]
}

包含差异条目的 AVRO 文件,其中包含必须应用于下一次运行的增量。

比较包含一个或多个彼此有关系的比较条目。

差异包含每个修改,删除或添加的分区条目以及"之前"和"之后"信息。

如果与上一次运行相比添加了子区,则"之前"将为空。 如果与上一次运行相比删除了子区,则"之后"将为 null。

如果与上一次运行相比修改了子区,则"之前"和"之后"都将存在。

输出中存在增量记录可能有以下原因: 与HDFS上的先前输出相比,该区已更改,添加或删除。

相关内容

最新更新