apache phoenix加入查询性能

时间:2016-01-22 08:48:59

标签: apache hadoop join hbase phoenix

几个月前我开始使用凤凰几个月。以下是环境和版本详细信息。

Hadoop - Cloudera CDH 5.4.7-1。 凤凰城 - 4.3 - 凤凰城,作为CDH5.4.7-1的包裹。 HBase版本 - HBase 1.0.0 JDK - 1.7.0_67 1个主服务器和3个区域服务器。

我们开始做POC来评估Apache Phoenix。我们在Oracle DB上有12个不同的表中的数据。我们使用Oracle golden gate将数据导入Hadoop系统。

有12个不同的Phoenix表,每个表有40-100列,有几百行。我们进行转换过程,然后加载到最终表中。这是我们正在做的基本ETL。转换过程经历了几个中间阶段,我们填充中间表。因此表之间存在“连接”。

一切都很好,我们能够实现整个ETL流程。我对易用性和实施​​感到非常满意。

当我们开始使用数百万行的性能测试时,问题就出现了。以下是问题。

  1. 中间转换过程崩溃了区域服务器:连接两个表,每个表有2000万行。在我加入的列上创建的二级索引。这两张桌子上有9个桶。如果连接产生的行数小于〜200k,则表现良好。 200k行需要10多分钟才能执行。如果产生的行数更多,则区域服务器开始崩溃。 测试代码 从salted.b_acct2 ba解释选择计数(available_bal) 内部联接 (从salted.m_item2 mi中选择c_item_id,其中s_info_id = 12345)为mi 在ba.c_item_id = mi.c_item_id;

    + ------------------------------------------ + |计划| + ------------------------------------------ + |客户9-CHUNK PARALLEL 9-WAY全面扫描盐水.2_BA_CI_IDX | |服务器整合到单行| | PARALLEL INNER-JOIN表0(SKIP MERGE)| |客户9-CHUNK并行TALLED的9路RANGE扫描._MI_SI_IDX [0,19,266] | |客户合并排序| | TO_BIGINT的动态服务器过滤器(" C_ITEM_ID")IN(MI.C_ITEM_ID)| + ------------------------------------------ +

  2. 为最终转换连接6个表会挂起:在索引列上连接6个表会返回少于1M行的数据。这需要10-12分钟。但是如果连接结果大约超过1M,它会挂起并且结果不会返回。最初我得到了InsufficientMemoryException,我通过更改配置和增加可用内存来解决这个问题。我没有再次获得InsufficientMemoryException,但查询执行时间超过20分钟。我们期待在几秒钟内执行。

  3. 以下是参数:

    jvm.bootoptions= -Xms512m –Xmx9999M.
    hbase.regionserver.wal.codec : org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec 
    hbase.rpc.timeout 600000 
    phoenix.query.timeoutMs 360000000 
    phoenix.query.maxServerCacheBytes 10737418240 
    phoenix.coprocessor.maxServerCacheTimeToLiveMs 900000 
    hbase.client.scanner.timeout.period 600000 
    phoenix.query.maxGlobalMemoryWaitMs 100000 
    phoenix.query.maxGlobalMemoryPercentage 50 
    hbase.regionserver.handler.count 50
    

    总结:核心问题是当数据超过100万行时,加入查询的执行速度很慢,并最终导致区域服务器崩溃。执行是否有限制?在我们进行评估过程中,请帮助我解决这些问题,我不想放开凤凰城!如果我能够在快速时间内执行上述查询,那么我会毫不犹豫地使用Phoenix。

    此致 Shivamohan

2 个答案:

答案 0 :(得分:2)

默认情况下,Phoenix使用散列连接,要求数据适合内存。如果遇到问题(使用非常大的表),可以增加分配给Phoenix的内存量(配置设置)或设置查询“提示”(即SELECT /*+ USE_SORT_MERGE_JOIN*/ FROM ...)以使用排序合并连接没有相同的要求。他们计划在未来自动检测理想的连接算法。此外,Phoenix目前仅支持一部分连接操作。

答案 1 :(得分:0)

你试过LHS& RHS概念已在凤凰文档中描述为性能优化功能(http://phoenix.apache.org/joins.html)?连接的LHS的内部连接将被构建为服务器缓存中的哈希表,因此请确保您的较小table形成内连接的LHS。 如果您在查询中选择的列是您创建的二级索引的一部分吗? 如果您已经尝试了上述内容并且仍然在几分钟内获得延迟,那么您需要检查Hbase区域服务器的内存以及它们是否足以满足您的查询。