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流程。我对易用性和实施感到非常满意。
当我们开始使用数百万行的性能测试时,问题就出现了。以下是问题。
中间转换过程崩溃了区域服务器:连接两个表,每个表有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)| + ------------------------------------------ +
为最终转换连接6个表会挂起:在索引列上连接6个表会返回少于1M行的数据。这需要10-12分钟。但是如果连接结果大约超过1M,它会挂起并且结果不会返回。最初我得到了InsufficientMemoryException,我通过更改配置和增加可用内存来解决这个问题。我没有再次获得InsufficientMemoryException,但查询执行时间超过20分钟。我们期待在几秒钟内执行。
以下是参数:
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
答案 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区域服务器的内存以及它们是否足以满足您的查询。