可以使用 hbase-spark 连接器按性能良好的列对 hbase 行进行排序吗?
Posted
技术标签:
【中文标题】可以使用 hbase-spark 连接器按性能良好的列对 hbase 行进行排序吗?【英文标题】:Can hbase-spark connector be used for sorting hbase rows by some column with good performance? 【发布时间】:2018-04-27 13:56:30 【问题描述】:问题的标题说明了一切。我有一个要求,需要获取与特定列中的前 X(例如前 10)值相对应的行键。因此,我需要按所需的列值对 hbase 行进行排序。我不明白我应该怎么做,甚至是否可行。看来 hbase 并没有很好地迎合这一点。此外,它不允许开箱即用的任何此类功能。
Q1.我可以使用hbase-spark connector,在spark rdd中加载整个hbase数据,然后在里面进行排序吗?这会很快吗?连接器和火花将如何处理它?它会在单个节点或多个节点上获取全部数据并以分布式方式排序吗?
Q2。还有没有更好的方法来做到这一点?
Q3. 在 hbase 中完全可以撤消吗?我应该选择完全不同的框架/技术吗?
【问题讨论】:
基本上没有,这只是 HBase 如何存储数据的一个方面。如果您希望它更快,请将您的数据以 Parquet 之类的列格式存储。 HBase 针对随机访问进行了高度优化:为您的用例选择数据存储。 【参考方案1】:A3. 如果您需要按某列(而不是行键)对数据进行排序,则使用 HBase 并没有任何好处。这与从 hive/hdfs 读取原始文件并排序相同,但速度较慢。
A1. 当然,您可以使用 SHC 或任何其他 spark-hbase 库来解决这个问题,但 A3 仍然适用。它将作为 Spark RDD 加载每个区域服务器上的整个数据,只是为了在整个集群中对其进行洗牌。
A2. 与任何其他编程/架构问题一样,根据您的资源和要求,有许多可能的解决方案。
Spark会在单个节点上加载所有数据并在单个节点上进行排序还是在不同节点上进行排序?
这取决于两个因素:
您的表有多少个区域:这决定了从您的表中读取的并行度(分区数)。spark.sql.shuffle.partitions
配置值:从表中加载数据后,该值决定了排序阶段的并行度。
还有比 SHC 更好的 [库] 吗?
至于今天有多个用于集成 Spark 和 HBase 的库,每个库都有自己的优缺点,而 TMO 没有一个是完全成熟的,也没有提供完整的覆盖(例如,与 Spark-Hive 集成相比)。要通过 HBase 充分利用 Spark,您应该非常了解您的用例并选择最合适的库。
【讨论】:
正如您在 A3 中所说,似乎仅使用 hbase java api 不会提供太多性能,因为它将在单个节点中加载整个列(对吗?)。我有大量数据,我想要该数据中的前 10 列值。使用 SHC 真的会更快吗?我没有理解您所说的“仅”洗牌的意思……似乎我无法理解 apache spark 集群上将如何进行洗牌和排序。 spark会在单个节点上加载所有数据并在单个节点上进行排序还是在不同节点上进行排序? 还有你说的“任何其他 spark-hbase 库”,还有比 SHC 更好的吗? @anir 请参阅我的回答中的附加段落。 您知道我是否可以更好地在 hbase 中选择 secondary indexes? @anir 不,我不知道,应该为每个用例仔细规划 hbase 模式设计。【参考方案2】:第二季度。还有没有更好的方法来做到这一点?
如果重新设计 HBase 表是一个选项,并将此特定列值作为 rowkey
的一部分,这将允许快速访问这些值,因为 HBase 针对行键过滤器而不是列过滤器进行了优化。
然后您可以创建existing_rowkey + this_col_value
的行键连接。然后使用行过滤器查询它会有更好的性能结果。
【讨论】:
恐怕无法重新设计行键。实际上,我们将时间序列数据存储在 hbase 中。所以目前我们有时间戳作为我们行键的一部分,我们的数据按这个时间戳排序。将列值添加到行键将更改行键排序顺序。 secondary indices呢?以上是关于可以使用 hbase-spark 连接器按性能良好的列对 hbase 行进行排序吗?的主要内容,如果未能解决你的问题,请参考以下文章
0540-5.15.0-Spark2使用HBase-Spark访问HBase