使用 Scala 访问 HBase 的推荐方式

Recommended way to access HBase using Scala

现在SpyGlass is no longer being maintained, what is the recommended way to access HBase using Scala/Scalding? A similar question was asked in 2013, but most of the suggested links are either dead or to defunct projects. The only link that seems useful is to Apache Flink。这被认为是当今最好的选择吗?人们是否仍在为新项目推荐 SpyGlass,即使它没有得到维护?性能(大规模并行)和可测试性是优先事项。

根据我使用Flink Cassandra connector写数据Cassandra的经验,我认为最好的方式是使用Flink内置的connector。由于 Flink 1.4.3 您可以使用 HBase Flink 连接器。参见 here

我使用 java 在 Flink 中连接到 HBase。只需在 open 中创建 HBase Connection 对象并在 RichFunction(即 RichSinkFunction)的 close 方法中关闭它。这些方法由每个 flink 插槽调用一次。

我想你也可以在 Scala 中做这样的事情。

取决于你所说的"recommended",我猜是什么意思。

自己动手做

鳗鱼

如果您只想从 Scala 应用程序访问 HBase 上的数据,您可能想看看 Eel,其中包括用于与 [=54= 中的许多存储格式和系统交互的库]大数据 风景,原生用 Scala 编写。

您很可能会对使用 eel-hbase 模块感兴趣,该模块在一些版本中包含 HBaseSource class(以及 HBaseSink) .实际上是最近才注意到 README 仍然提到不支持 HBase。 Hive 没有明确的示例,但源和汇的工作方式类似。

风筝

另一种选择可能是 Kite, which also has a quite extensive set of examples 你可以从中汲取灵感(包括 HBase),但它看起来不像 Eel 那样活跃。


大数据框架

如果您想要一个可以帮助您的框架,而不是使用库来构建您自己的解决方案。当然,您必须考虑一些学习曲线。

火花

Spark 是一个相当成熟的项目,HBase 项目本身为 Spark 2.1.1 构建了一个连接器(Scaladocs here). Here 是一个可以为您提供帮助的介绍性演讲。

总体思路是您可以按照 this example:

中的建议使用此自定义数据源
sqlContext
  .read
  .options(Map(HBaseTableCatalog.tableCatalog->cat, HBaseRelation.HBASE_CONFIGFILE -> conf))
  .format("org.apache.spark.sql.execution.datasources.hbase")
  .load()

让您通过 Spark SQL API 访问 HBase 数据。这是一个简短的摘录 from the same example:

val df1 = withCatalog(cat1, conf1)
val df2 = withCatalog(cat2, conf2)
val s1 = df1.filter($"col0" <= "row120" && $"col0" > "row090").select("col0", "col2")
val s2 = df2.filter($"col0" <= "row150" && $"col0" > "row100").select("col0", "col5")
val result =  s1.join(s2, Seq("col0"))

撇开性能方面的考虑,正如您可能看到的那样,该语言对于数据操作来说感觉非常自然。

弗林克

两个答案已经涉及到 Flink,所以我不会添加更多,除了 a link to an example 来自撰写本文时最新的稳定版本 (1.4.2),您可能有兴趣一看。