【问题标题】:What is the best approach to perform updations on Hadoop File System?在 Hadoop 文件系统上执行更新的最佳方法是什么?
【发布时间】:2017-04-10 02:12:10
【问题描述】:

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

例如:我在 HDFS 上有以下数据,下次需要更新“subDistricts”数组

{ "name": "DistrictName", "_class": “org.bitbucket.codezarvis.api.dto.DistrictDocument”,“类型”: “区”,“子区”:[ 256, 257 ] }

【问题讨论】:

    标签: hadoop hdfs cloudera avro


    【解决方案1】:

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

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

    忠告 - 如果您发现自己在这种情况下经常使用 hadoop,请重新考虑 hadoop 是否是最佳选择。 ACID 最好由 SQL 解决方案完成。

    【讨论】:

    • 感谢@Richard Kemp
    【解决方案2】:

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

    【讨论】:

    • 感谢 Deepan Ram 的建议。
    【解决方案3】:

    我还想出了一个文档的方法和设计

    {
        "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"
                            }
                        }
                    }
                }]
            }
    

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

    一个 Diff 包含一个或多个相互关联的 Diff 条目。

    Diff 包含每个修改、删除或添加的子区条目的“之前”和“之后”信息。

    如果与上一次运行相比添加了一个 subDistrict,则“之前”将为空。 如果一个 subDistrict 与之前的运行相比被删除,那么 'after' 将为空。

    如果一个 subDistrict 与之前的运行相比被修改,'before' 和 'after' 都将存在。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-05
      相关资源
      最近更新 更多