phoenix是否适用于etl和聚合?
我正在尝试对我的数据进行一些etl。现在我正在使用hbase来存储我的数据(在我们的网站上的足迹)。我需要对这些数据做一些聚合,比如每个url上的页面视图…等等。
根据我的研究,我知道hive可以用于hbase数据的etl,加上hql提供了sql语言,所以我们不需要自己编写map-reduce代码。但是,当我尝试使用hive(pyhive)查询hbase时,需要很长时间才能完成。此外,如果我让phoenix在hbase上执行sql,那么我的hbase上还需要hive吗。
现在,当我尝试使用一些复杂的sql时,phoenix将超时。Hive非常慢。那么,对hbase数据进行etl的好方法是什么呢?
1条答案
按热度按时间wkftcu5l1#
如果您有oltp类型的查询,即您的查询模式仅限于点获取或小范围查询,那么hbase是一个合适的选择。
phoenix只是hbase之上的一个sql层,它为用户提供了使用sql构造在hbase中查询数据的能力。
当您提交任何sql查询时,phoenix将对其进行解析并创建一个执行计划,该计划可以根据您查询的内容将查询分解为完全扫描、范围扫描或点获取。
对于处理结果,phoenix使用 predicate 下推(predicate push down),因此hbase执行所有处理(扫描并从所有regionserver获取所需的行),phoenix聚合/整理结果行并将它们返回给用户。
现在回答您的问题“phoenix是否适合etl和聚合?”—否如果您需要对聚合执行大扫描(全范围或大范围扫描),并且希望在几秒钟或几秒钟内处理结果,则不适合。如果表占用空间很小(几百gbs),这些查询可能工作得很好,但是随着时间的推移,表的大小会增加,最终会导致严重的性能问题。这是olap场景,您应该寻找其他替代方案。
我假设当您说将hive与hbase一起使用时,您计划在hbase表的顶部创建一个hive外部表,该表可以使用hivehbasetableinputformat直接查询hfiles。这将使用mapreduce来处理查询,而您不能真正通过分区、bucketing等来利用性能优化。
我建议考虑对点获取和小范围查询使用hbase+phoenix选项,对于大型聚合/etl类型的查询考虑使用spark,它将比hive选项更好、更快。
如果您的数据是只附加的,您可以考虑使用其他支持olap的存储选项,如driud、clickhouse或tez上的hive、hive with impala或presto选项,而不是hbase。
根据评论更新-
spark将比hive(mapreduce)选项更快;spark仅用于使用大范围或完全扫描(后跟聚合)的查询。
尽管phoenix利用协处理器和 predicate 下推到hbase区域,但可用资源的数量可能会成为一个限制,phoenix将以块的形式并行化查询,这些块由guide\u posts\u width决定,对于大型表,这很容易从几个100到1000,并为rpc队列创建争用,此外,在扫描过程中,将读取hfiles并将其加载到regionserver堆中,如果扫描无法匹配分配堆中的结果,则可能会遇到gc或oom问题。扫描仪可能会受到rpc等待时间和可用内存的限制,从而导致超时。
您可以在一定程度上调整上述情况,但hbase/phoenix不适用于olap。使用spark可以直接读取hfiles并应用过滤器,这将消除超时问题。如果一次又一次地查询相同的数据子集,您可以尝试使用外部rdd/Dataframe缓存来触发。
我想补充一点,在寻找替代方案之前,您应该分析如何在hbase中存储数据它是否与您的查询模式一致?重新检查行键设计如果查询计划正在创建完全扫描,请尝试重新设计行键或查询以避免完全扫描?检查您的数据是否分布在所有地区?你的高写速率会影响你的读性能吗?
如果您有需要分析的clickstream类型的数据,请查看clickhouse,yandex为类似的用例开发并开源了它,但它也适用于其他olap用例。
希望这有帮助。