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

mec1mxoz  于 2021-05-29  发布在  Hadoop
关注(0)|答案(3)|浏览(326)

在hadoop文件系统上执行更新的最佳方法是什么?例如,我有一个包含数据的avro文件,为了下一次运行,我需要更新avro文件本身中的数据。我们如何解决这个问题?
例如:我有下面关于hdfs的数据,下次需要更新“substricts”数组
{“name”:“districtname”,“\u class”:“org.bitbucket.codezarvis.api.dto.districtdocument”,“type”:“district”,“substricts”:[256,257]}

shstlldc

shstlldc1#

我还提出了一个方法和设计的文件

{
    "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文件,其中包含必须应用于下一次运行的增量。
diff包含一个或多个相互关联的diff条目。
diff包含每个修改、删除或添加的分区条目的“before”和“after”信息。
如果与上一次运行相比添加了子区,“before”将为空。如果与上一次运行相比删除了子区,则“after”将为空。
如果与上一次运行相比修改了子区,则“before”和“after”都将存在。
输出中存在delta记录可能有以下原因:与hdfs上的上一个输出相比,区域被更改、添加或删除。

mklgxw1f

mklgxw1f2#

hdfs被设计成一个只写一次、只附加的文件系统。也就是说,您有几个选项可以执行更新操作:
使用hbase,它在底层hdfs文件之上提供了一个无sql系统。请记住,它对您隐藏了魔力,但它仍然必须执行您必须执行的操作—制作文件副本、仅替换必要的部分、交换文件等。它的性能不会很出色,但它会完成工作。
配置单元插入覆盖将允许您运行执行更新/计算的查询,然后用更新的数据覆盖表。或者您可以将覆盖限制为单个分区,然后考虑如何管理分区。
不更新,始终写入新行/文件。当您有新数据时,将其写入新分区,即使它正在替换其他数据。从表中选择数据时,始终只选择最新的分区。您的数据历史将继续增长,您可以在其他时间删除那些旧分区。
建议-如果你发现自己在hadoop中经常遇到这种情况,请重新考虑hadoop是否是最佳选择。acid最好由sql解决方案完成。

clj7thdc

clj7thdc3#

模式演化是一个在不重写现有数据的情况下修改模式的通用概念。如果数据作为avro存储在hive表中(底层数据存储在hdfs中),那么可以更改模式(尽管这也有一些局限性)。

相关问题