Impala 2.x的新patch -- IMPALA-6812 Kudu Read Mode

Impala 2.x接下来要cherry-pick的patch是 IMPALA-6812:https://gerrit.cloudera.org/c/10503

在此之前Kudu相关的一些测试时好时坏(flaky),主要的表现是从kudu读出来的结果不完整。好几个其它的ticket也汇报了这个问题:IMPALA-7036, IMPALA-6922, IMPALA-7028

在Gerrit(Impala的Code Review平台)上有不少讨论:https://gerrit.cloudera.org/c/10503
关于修正Kudu的flaky tests还提出了另外两条路:

  • 修改所有Kudu相关的测试,加上重试。Concerns是后续加的测试可能忘了遵从这个原则而又成为flaky tests.
  • 引入Mock框架来测试Kudu,这样能更专注于Impala这边的工作

这都是比较基本的思想吧,但最后还是集中在对Kudu read mode的讨论上来。当前默认的模式是 READ_LATEST,还有另一种模式是READ_AT_SNAPSHOT。根据Kudu的文档 “Transaction Semantics in Apache Kudu” 中的解释:

  • READ_LATEST是Kudu客户端默认采用的模式,拥有 “Read Committed” 级别的隔离性,即只能读到已经提交(Committed)的数据。
  • READ_AT_SNAPSHOT模式需要一个时间戳,要么由Kudu server选定,要么由客户端显示设定(通过 KuduScanner::SetSnapshotMicros() 接口),Kudu会返回在此时间戳之前提交的数据。

关于READ_AT_SNAPSHOT有一点值得强调:如果指定的时间戳比较晚,Kudu会等到该时间戳之前的所有写请求都完成后,再返回客户端此时能看到的数据。
因此READ_AT_SNAPSHOT的结果是可重复的,只要设定的时间戳不变,查询结果也不变。而READ_LATEST会读到当前的结果,有可能写请求还没提交成功,此时就可能读到空的或者不完整的数据。Impala中挂掉的测试大多是加载完Kudu数据之后就要读,使用READ_LATEST确实有可能读到不完整的数据,从而引入了flakiness。

Gerrit中还提到了READ_YOUR_WRITES (RYW),因为Impala之前的commit把READ_AT_SNAPSHOT当成了READ_YOUR_WRITES (即IMPALA-4829,后来这个patch被revert了:commit),造成了一些误解。实际上READ_YOUR_WRITES还在开发中,并不推荐使用。讨论在Kudu dev的参与下,最终还是用上了READ_AT_SNAPSHOT。

总结

Kudu相关的一些测试经常因为结果不一致而挂掉,修正的方式是把一些写完立马要读的测试的kudu read mode设为READ_AT_SNAPSHOT(之前默认是READ_LATEST)。为此引入了一个query option (KUDU_READ_MODE)来自定义这个模式,默认情况下是READ_LATEST,有些测试可以设置成READ_AT_SNAPSHOT。同时还加了一个使用READ_LATEST但带重试的测试。

猜你喜欢

转载自blog.csdn.net/huang_quanlong/article/details/87691978
今日推荐