ApachePhoenix连接查询性能

ApachePhoenix连接查询性能,apache,hadoop,join,hbase,phoenix,Apache,Hadoop,Join,Hbase,Phoenix,几个月前我开始使用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来评估ApachePhoenix。我们在Oracle DB上有12个不同表中的数据。我们使用OracleGoldenGate将数据导入Hadoop系统 有12个不同的Phoenix表,每个表有40-100列和

几个月前我开始使用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来评估ApachePhoenix。我们在Oracle DB上有12个不同表中的数据。我们使用OracleGoldenGate将数据导入Hadoop系统

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

一切都很顺利,我们能够实现整个ETL过程。我对它的易用性和实现性非常满意

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

中间转换过程使区域服务器崩溃:连接两个表,每个表有2000万行。在我要加入的列上创建的二级索引。这两张桌子用9桶盐腌制。如果联接产生的行数小于~200k,则该方法性能良好。执行200k行需要10分钟以上。如果生成的行数更多,则区域服务器开始崩溃。 测试代码 解释从salted.b\u acct2 ba中选择可用的bal 内连接 从salted.m_items 2中选择c_item_id,其中s_info_id=12345作为mi 在ba.c_项_id=mi.c_项_id

+---------------------+ |计划| +---------------------+ |SALTED.S2_BA_CI_IDX上的客户端9块并行9路全扫描| |服务器聚合成一行| |并行内部联接表0跳过合并| |SALTED.S_MI_SI_IDX上的客户端9块并行9路范围扫描[0,19266]| |客户端合并排序| |根据MI.C\u ITEM\u ID中的TO\u BIGINTC\u ITEM\u ID进行动态服务器筛选| +---------------------+

为最终转换连接6个表将挂起:在索引列上连接6个表将返回少于1M行的数据。这需要10-12分钟。但是,如果联接结果大约超过1M,它将挂起,并且结果不会返回。最初我遇到了内存不足异常,我通过更改配置和增加可用内存来解决这个问题。我没有再次收到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
摘要:核心问题是连接查询的执行速度慢,当数据超过一百万行时,区域服务器最终会崩溃。执行有限制吗?请帮助我解决这些问题,因为我们正在经历一个评估过程,我不想放弃凤凰城!如果我能够在短时间内执行上述查询,那么我会毫不犹豫地使用Phoenix

问候,,
Shivamohan默认情况下,Phoenix使用散列联接,需要将数据放入内存中。如果您在使用非常大的表时遇到问题,您可以增加分配给Phoenix配置设置的内存量,或设置查询提示,即SELECT/*+USE\U SORT\U MERGE\U JOIN*/FROM。。。使用不具有相同要求的排序合并联接。他们计划在将来自动检测理想的连接算法。此外,Phoenix目前仅支持连接操作的子集。

您是否尝试过在Phoenix文档中描述为性能优化功能的LHS和RHS概念?如果是内部联接,联接的RHS将作为哈希表构建在服务器缓存中,因此请确保较小的表构成内部联接的RHS。 您在查询中选择的列是否是您创建的二级索引的一部分?
如果您尝试了上述方法,但在几分钟内仍有延迟,则需要检查Hbase region服务器的内存,以及它们是否足以满足您的查询。

谢谢kliew!我确实尝试过更改配置设置,并参考了问题中我的最新设置,使其正常工作,但仅达到一定的限制。由于性能问题,我无法超越一百万条记录。最终放弃了Phoenix作为一个成熟的SQL over HBase。现在我们正在评估原始HBase。并且可以根据需要使用Phoenix。use_SORT_MERGE_JOIN查询提示添加到sql查询中,而不是添加到配置设置中。您是否尝试过使用此查询提示运行联接?设置此查询提示时,Phoenix将使用不需要太多内存的备用连接算法。