SHC:使用 Spark SQL 高效地读写 HBase

Posted 过往记忆大数据

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SHC:使用 Spark SQL 高效地读写 HBase相关的知识,希望对你有一定的参考价值。

本文原文(点击下面阅读原文即可进入) https://www.iteblog.com/archives/2522.html

Apache Spark 和 Apache HBase 是两个使用比较广泛的大数据组件。很多场景需要使用 Spark 分析/查询 HBase 中的数据,而目前 Spark 内置是支持很多数据源的,其中就包括了 HBase,但是内置的读取数据源还是使用了 TableInputFormat 来读取 HBase 中的数据。这个 TableInputFormat 有一些缺点:

  • 一个 Task 里面只能启动一个 Scan 去 HBase 中读取数据;

  • TableInputFormat 中不支持 BulkGet;

  • 不能享受到 Spark SQL 内置的 catalyst 引擎的优化。

基于这些问题,来自 Hortonworks 的工程师们为我们带来了全新的 Apache Spark—Apache HBase Connector,下面简称 SHC。通过这个类库,我们可以直接使用 Spark SQL 将 DataFrame 中的数据写入到 HBase 中;而且我们也可以使用 Spark SQL 去查询 HBase 中的数据,在查询 HBase 的时候充分利用了 catalyst 引擎做了许多优化,比如分区修剪(partition pruning),列修剪(column pruning),谓词下推(predicate pushdown)和数据本地性(data locality)等等。因为有了这些优化,通过 Spark 查询 HBase 的速度有了很大的提升。

注意:SHC 同时还提供了将 DataFrame 中的数据直接写入到 HBase 中,但是整个代码并没有什么优化的地方,所以本文对这部分不进行介绍。感兴趣的读者可以直接到这里查看相关写数据到 HBase 的代码。

SHC 是如何实现查询优化的呢

SHC 主要使用下面的几种优化,使得 Spark 获取 HBase 的数据扫描范围得到减少,提高了数据读取的效率。

将使用 Rowkey 的查询转换成 get 查询

我们都知道,HBase 中使用 Get 查询的效率是非常高的,所以如果查询的过滤条件是针对 RowKey 进行的,那么我们可以将它转换成 Get 查询。为了说明这点,我们使用下面的例子进行说明。假设我们定义好的 HBase catalog 如下:

那么如果有类似下面的查询

SHC:使用 Spark SQL 高效地读写 HBase

因为查询条件直接是针对 RowKey 进行的,所以这种情况直接可以转换成 Get 或者 BulkGet 请求的。第一个 SQL 查询过程类似于下面过程

SHC:使用 Spark SQL 高效地读写 HBase

如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop

后面两条 SQL 查询其实是等效的,在实现上会把 key in (x1, x2, x3..) 转换成 (key == x1) or (key == x2) or ... 的。整个查询流程如下:

SHC:使用 Spark SQL 高效地读写 HBase

如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop

如果我们的查询里面有 Rowkey 还有其他列的过滤,比如下面的例子

sqlContext.sql( "select id, col6, col8 from iteblog_table where id = 1 and col7 = 'xxx'" )

以上是关于SHC:使用 Spark SQL 高效地读写 HBase的主要内容,如果未能解决你的问题,请参考以下文章

spark DataFrame 读写和保存数据

在 Spark 中高效地连接一个大表(1TB)和另一个小表(250GB)

使用 .NET for Spark 在数据帧中高效地填充数据

直接高效地读写硬盘扇区[重复]

spark踩坑——dataframe写入hbase连接异常

spark sql读写hive的过程

(c)2006-2024 SYSTEM All Rights Reserved IT常识