1. 1. 问题分析
  2. 2. 解决方法
  3. 3. 问题结论

问题描述:当hbase数据量较大时,在windows下用phoenix查询出现异常问题(org.apache.phoenix.exception.PhoenixIOException 系统找不到指定的路径)

问题分析

当通过phoenix方式查询hbase数据时,hbase会通过多线程的方式并发查询结果,并由客户端进行合并。数据量增大会导致内存的需求增加,内存不足时会写入磁盘临时文件。
phoenix-core 4.6.0版本下磁盘的临时文件路径默认为/tmp目录,如下图所示,导致了在windows下找不到该目录,进而出现PhoenixIOException。

图1

在phoenix-core 4.7.0中已修复该问题,路径由java.io.tmpdir环境变量决定。

图2

解决方法

1、(推荐策略)在resin或tomcat所处的盘符(分区)的根路径下创建tmp文件夹,或者暴力地在每个分区的根路径下创建tmp文件夹!

2、(中等推荐)增加JVM的-Xmx配置,或增加hbase-site.xml中的maxGlobalMemoryPercentage,减少spoolThresholdBytes。麻烦!有时候不一定奏效!

Xmx设置的大小=50*spoolThresholdBytes(兆)/(maxGlobalMemoryPercentage/100)

3、升级phoenix-core版本

4、用反射的方法修改QueryServicesOptions中的static final DEFAULT_SPOOL_DIRECTORY的值,傻子才会这么做!不可行!

问题结论

Linux爽!Windows Low!不服?找