从两个配置单元

时间:2018-03-16 19:43:46

标签: hadoop apache-spark hive

我们遇到了一个问题,我们正试图在RDBMS(源)和配置单元(目标)之间进行近乎实时的同步。基本上,源代码将更改(插入,更新和删除)作为avro文件推送到HDFS。这些被加载到外部表(使用avro架构),进入Hive。 ORC中还有一个基表,它包含在Source推送到新记录集之前进入的所有记录。

收到数据后,我们必须进行重复数据删除(因为可能会对现有行进行更新)并删除所有已删除的记录(因为可能会从源中删除)。

我们现在使用rank()对外部表和基表的并集上的分区键执行重复数据删除。然后将结果推送到新表中,交换名称。这花费了很多时间。

我们尝试使用合并,酸交易,但排名超过分区,然后过滤掉所有行,这给了我们最好的时间。

有更好的方法吗?有关改善整个过程的任何建议吗?我们有很多桌子,所以我们现在没有任何分区或桶。

1 个答案:

答案 0 :(得分:0)

您可以尝试将所有事务数据存储到Hbase表中。

使用RDBMS表的主键作为行键将数据存储到Hbase表中: -

从NiDB处理器(executionql,Querydatabasetable..etc)中拉出RDBMS的所有数据后,我们将以Avro格式从处理器输出。

您可以使用ConvertAvroToJson处理器,然后使用SplitJson Processor从json记录数组中分割每条记录。

将所有记录存储在Hbase表中,其中Rowkey作为RDBMS表中的主键。

当我们根据“上次修改日期”字段获得增量加载时,我们将从RDBMS表中更新记录和新添加的记录。

如果我们获得现有rowkey的更新,那么Hbase将覆盖该记录的现有数据,对于新添加的记录,Hbase会将它们添加为表中的新记录。

然后通过使用Hive-Hbase集成,您可以使用Hive显示Hbase表数据。

https://cwiki.apache.org/confluence/display/Hive/HBaseIntegration

通过使用这个方法,我们将使用Hbase表来处理所有upsert操作,我们不能指望hive-hbase表与native hive表相同的性能将执行得更快,因为hbase表不适用于sql如果你正在访问基于Rowkey的数据,那么hbase表是最有效的,

如果我们要有数百万条记录,那么我们需要对hive查询做一些调整

Tuning Hive Queries That Uses Underlying HBase Table