相信很多公司遇到跟我们类似的问题:要将Oracle的应用迁移到Hadoop平台中,遭遇到大量的Oracle存储过程需要改造。最便捷的解决方式就是使用HPL/SQL,其大部分语法兼容Oracle。可惜,这只是看上去很美好,在经过是各种测试之后发现HPL/SQL的Bug实在太多,太不成熟,应用在生产上需要规避很多的坑。我把我们在实际使用过程中遇到的HPL/SQL各种坑记录下来,提供大家参考。
Hadoop环境:CDH 5.14.2
HPL/SQL版本:0.3.31
HPL/SQL的安装相对比较简单,按照官方文档操作即可。
1. 去官网下载最新的版本
http://www.hplsql.org/
2. 系统需求
Java 1.6 or higher
Hadoop 1.x. and 2.x
3. 安装
1)解压
[root@node1 install]# mkdir /hadoop/hplsql
[root@node1 install]# tar -zxvf hplsql-0.3.31.tar.gz-C /hadoop/hplsql/
[root@node1 install]# cd /hadoop/hplsql/
创建一个Link以实现后续版本升级的方便性:
[root@node1 hplsql]# ln -s hplsql-0.3.31 hplsql
2)修改配置
[root@node1 hplsql]# chmod +x hplsql
针对CDH版本,编辑hplsql,删除所有包含“export "HADOOP_CLASSPATH=..."”的行,增加一行:
export"HADOOP_CLASSPATH=/hadoop/cloudera/parcels/CDH/jars/*"
3)测试是否可以正常执行
[root@node1 hplsql]# ./hplsql --version
HPL/SQL 0.3.314)将HPLSQL添加到PATH中
[root@node1 ~]# vi /etc/profile
PATH=/hadoop/hplsql/hplsql:$PATH
[root@node1 ~]#source /etc/profile5)修改hplsql-site.xml
定义YARN job queue和HiveServer2的地址(修改蓝色字体的部分):
set mapred.job.queue.name=default;
sethive.execution.engine=mr;
use default;
……..
简单的HPL/SQL函数测试:
[root@node1 ~]# hplsql -e "CURRENT_DATE+1"
HPL/SQL执行Hive SQL的测试:
[root@node1 ~]# hplsql -e "select count(1) from test01"如果都执行成功,恭喜你,HPL/SQL安装成功!
问题:
如果在部署了HiveServer2的节点上安装HPL/SQL,运行 "CURRENT_DATE+1"是OK的,但是运行 "select count(1) from test01"这种SQL语句,会报错:
Exception in thread "main"java.lang.IncompatibleClassChangeError: classorg.apache.hive.service.cli.thrift.TCLIService$Client has interfaceorg.apache.thrift.TServiceClient as super class
解决方法:
根据hplsql文件里面的设置:export"HADOOP_CLASSPATH=/hadoop/cloudera/parcels/CDH/jars/*"
在对应目录中将“libthrift-0.5.0.jar,libthrift-0.9.0.jar,libthrift-0.9.3.jar”三个包移走,问题就可以解决。
有兴趣一起讨论HPL/SQL和Hive技术的,可以加入QQ群:689163852