更新时间:2022-12-14 GMT+08:00

连上不同的JDBCServer,function不能正常使用

问题

场景一:

通过add jar的方式建立永久函数,当Beeline连上不同的JDBCServer或者JDBCServer重启后都需要重新add jar。

图1 场景一异常信息

场景二:

show functions能够查到相应的函数,但是无法使用,这是由于连接上的JDBC节点上没有相应路径的jar包,添加上相应的jar包能够查询成功。

图2 场景二异常信息

回答

场景一:

add jar语句只会将jar加载到当前连接的JDBCServer的jarClassLoader,不同JDBCServer不会共用。JDBCServer重启后会创建新的jarClassLoader,所以需要重新add jar。

添加jar包有两种方式:可以在启动spark-sql的时候添加jar包,如spark-sql --jars /opt/test/two_udfs.jar;也可在spark-sql启动后再添加jar包,如add jar /opt/test/two_udfs.jar。add jar所指定的路径可以是本地路径也可以是HDFS上的路径。

场景二:

show functions会从外部的Catalog获取当前database中所有的function。SQL中使用function时,JDBCServer会加载该function对应的jar。

若jar不存在,则该function无法使用,需要重新执行add jar命令。