我正在使用Fink 1.3.2与来自flink-connectors(flink-hbase_2.11)的hbase TableInputFormat,使用DataSet API。
我有一个HBase表,其中rowkeys被结构化如下:
| RowKey | data |
| 0-someuniqid | data |
| 0-someuniqid | data |
| 2-someuniqid | data |
| 2-someuniqid | data |
| 4-someuniqid | data |
| 5-someuniqid | data |
| 5-someuniqid | data |
| 7-someuniqid | data |
| 8-someuniqid | data |
表的前缀可以是0到9(这是为了防止hbase节点中的热点)。在我的测试表中,没有人写入此表。
我有一份表格的工作:
tableInputFormat0 = new TableInputFormat("table", 0);
tableInputFormat1 = new TableInputFormat("table", 1);
...
tableInputFormat9 = new TableInputFormat("table", 9);
tableInputFormat0.union(tableInputFormat1).(...).union(tableInputFormat9)
.map(mapFunction())
.rebalance()
.filter(someFilter())
.groupBy(someField())
.reduce(someSumFunction())
.output(new HbaseOutputFormat());
问题是当读取大量记录(大约2000万条记录)时,作业并不总是读取相同数量的记录。
大部分时间它(正确地)读取:20,277,161行。但有时它会显示:20,277,221或20,277,171总是更少。 (我通过flink web仪表板获得了这个数字,但是我可以看到写入的内容,即通过reduce汇总了太多的数据)
我无法通过使用较小的数据集来缩小问题,因为在针对500万条记录的表运行作业时不会发生问题。由于音量很难识别多次读取哪些记录。
如何调试(并解决)此问题?
答案 0 :(得分:1)
TableInputFormat
是一个抽象类,你必须实现一个子类。
我会做两件事:
这应该有助于确定问题是否