Hbase 上的 phoenix 和 hive ETL

phoenix and hive ETL on Hbase

phoenix是否适合ETL和聚合?

我正在尝试对我的数据进行一些 ETL。现在我正在使用 hbase 来存储我的数据(我们网站上的足迹)。我需要对这些数据进行一些聚合,例如每个 url 的页面浏览量......等

根据我的研究,我知道 hive 可以用于 hbase 数据的 ETL,而且 hql 提供了 sql 语言,因此我们不需要自己编写 map-reduce 代码。但是当我尝试使用 hive(pyhive) 查询 hbase 时,需要很长时间才能完成。此外,如果我有 phoenix 在 hbase 上做 sql,我的 hbase 上还需要 hive 吗?

现在当我尝试使用一些复杂的 sql 时,phoenix 会超时。而且蜂巢非常非常慢。那么对hbase数据做ETL有什么好的方法呢?

如果您有 OLTP 类型的查询,HBase 是一个合适的选择table,即您的查询模式仅限于点获取或小范围查询。

Phoenix 只是 HBase 之上的一个 SQL 层,它使用户能够使用 SQL 结构在 HBase 中查询数据。

当您提交任何 SQL 查询时,Phoenix 将解析它并创建一个执行计划,该计划可以根据您查询的内容将查询分解为全扫描、范围扫描或点获取。

对于处理结果,Phoenix 使用 Predicate Push down,因此 HBase 执行所有处理(扫描并从所有区域服务器获取必要的行),Phoenix aggregates/collates 结果行和 return 它们到用户。

现在回答你的问题“phoenix suitable是否用于ETL和聚合?” - NO 它不是 suitable 如果您需要使用聚合执行大型扫描(完整或大范围扫描)并期望在几秒或亚秒内处理结果。如果您的 table 占用空间很小(几百 GB),这些查询可能会正常工作,但随着 table 大小会随着时间的推移而增加,您最终会遇到严重的性能问题。 这是 OLAP 场景,您应该寻找其他替代方案。

我假设当您说将 Hive 与 HBase 结合使用时,您计划在 HBase table 之上创建一个外部 Hive Table,它可以使用 HiveHBaseTable 直接查询 HFile ] 输入格式。 这将使用 MapReduce 来处理查询,您无法通过分区、分桶等真正利用性能优化。

我建议考虑使用 HBase + Phoenix 选项进行点获取和小范围查询,对于大型 aggregation/ETL 类型的查询考虑使用 Spark,它会比 Hive 选项更好更快。

如果您的数据只是追加,您可以考虑使用一些替代的 OLAP 支持存储选项,例如 Driud、Clickhouse 或 Tez 上的 Hive,具有 Impala 或 Presto 选项的 Hive 而不是 HBase。

根据评论更新 -

Spark 将比 Hive (MapReduce) 选项更快;仅将 Spark 用于使用大范围或全扫描后跟聚合的查询。

虽然 Phoenix 利用协处理器并将谓词下推到 HBase 区域,但可用资源量可能成为限制,Phoenix 将并行化由 GUIDE_POSTS_WIDTH 决定的块中的查询,对于大型 tables 这可以很容易地从几百到几千秒不等,并为 RPC 队列创建争用,在扫描期间 HFiles 将被读取并加载到区域服务器堆中,如果扫描不适合,您可能 运行 陷入 GC 或 OOM 问题结果分配堆。扫描程序可能会受到 rpc 等待时间和可用内存的限制,从而导致超时。

您可以在一定程度上调整上述情况,但 HBase/Phoenix 不适用于 OLAP。使用 Spark,您可以直接读取 HFiles 并在之后应用过滤器,这将消除超时问题。如果相同的数据子集被一次又一次地查询,您可以尝试将外部 rdd/dataframe 缓存到 Ignite。

我想补充一点,在寻找替代方案之前,您应该分析如何将数据存储在 HBase 中,它是否与您的查询模式一致?如果您的查询计划正在创建全扫描,请重新审视您的 rowkey 设计,尝试重新设计 rowkey 或查询以避免全扫描?检查您的数据是否在所有区域分布良好?您的高写入速率会影响您的读取性能吗?

如果您有需要分析的点击流类型的数据,请查看 Clickhouse,Yandex 为类似用例开发并开源了它,但它也适用于其他 OLAP 用例。

希望这对您有所帮助。