具有Hbase表输入格式的Flink DataSet api - 多次读取行

时间:2017-12-07 16:22:44

标签: hadoop hbase apache-flink

我正在使用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万条记录的表运行作业时不会发生问题。由于音量很难识别多次读取哪些记录。

如何调试(并解决)此问题?

1 个答案:

答案 0 :(得分:1)

TableInputFormat是一个抽象类,你必须实现一个子类。

我会做两件事:

  • 检查每个输入拆分是否只处理一次(此信息写入JobManager日志文件)
  • 调整输入格式以计算每个输入拆分的发出记录数。记录计数和拆分ID应写入(TaskManager)日志。

这应该有助于确定问题是否

  • 由于一次(或多次)拆分被分配多次或
  • 由于处理拆分的代码中存在错误。