apache - Apache Phoenix UDF 在服务器端不起作用
问题描述
1我用自定义 UDF 函数创建了 jar,并将 jar 复制到dynamic.jar.dir中,所以当我使用我的 UDF 函数作为SELECT
我获得结果的一部分时,我没有问题。
2但是,当函数是WHERE
子句的一部分时,我收到错误,即找不到自定义函数的类。
select PK FROM "my.custom.view" where MY_FUN(ARRAY["COLF"."COL1"], 'SOMEPARAM') limit 1;
Caused by: org.apache.hadoop.hbase.DoNotRetryIOException: BooleanExpressionFilter failed during reading: java.lang.ClassNotFoundException: com.myCompany.phoenix.MyCustomFunction
at org.apache.phoenix.util.ServerUtil.createIOException(ServerUtil.java:96)
at org.apache.phoenix.util.ServerUtil.throwIOException(ServerUtil.java:62)
at org.apache.phoenix.filter.BooleanExpressionFilter.readFields(BooleanExpressionFilter.java:109)
at org.apache.phoenix.filter.SingleKeyValueComparisonFilter.readFields(SingleKeyValueComparisonFilter.java:133)
at org.apache.hadoop.hbase.util.Writables.getWritable(Writables.java:131)
at org.apache.hadoop.hbase.util.Writables.getWritable(Writables.java:101)
at org.apache.phoenix.filter.SingleCQKeyValueComparisonFilter.parseFrom(SingleCQKeyValueComparisonFilter.java:50)
... 16 more
基本站点.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://localhost:57000/user/hbase</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>localhost</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>21081</value>
</property>
<property>
<name>hbase.client.keyvalue.maxsize</name>
<value>0</value>
</property>
<!-- SEP is basically replication, so enable it -->
<property>
<name>hbase.replication</name>
<value>true</value>
</property>
<property>
<name>hbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily</name>
<value>128</value>
</property>
<property>
<name>hbase.fs.tmp.dir</name>
<value>/tmp/hbase</value>
</property>
<property>
<name>phoenix.functions.allowUserDefinedFunctions</name>
<value>true</value>
</property>
<property>
<name>hbase.dynamic.jars.dir</name>
<value>${hbase.rootdir}/lib/</value>
</property>
<property>
<name>fs.hdfs.impl</name>
<value>org.apache.hadoop.hdfs.DistributedFileSystem</value>
</property>
</configuration>
手动添加jar:
hdfs dfs -copyFromLocal -f /my.jar hdfs:///user/hbase/lib/my.jar
对于函数创建使用:
CREATE FUNCTION MY_FUN(BINARY[], VARCHAR) RETURNS BOOLEAN as 'com.myCompany.phoenix.MyCustomFunction' using jar 'hdfs://localhost:57000/user/hbase/lib/my.jar';
解决方案
当我从 4.7 升级到 Phoenix 5.0 时,我遇到了类似的情况。我收到一个异常,指出由于权限问题,我现在需要将我的 UDF .jar 放入 /apps/hbase/data/lib。在旧环境中,我能够使用 /apps/hbase/lib 目录摆脱困境。也许这也发生在你身上,但它并没有提醒你注意新的路径变化。
推荐阅读
- java - 如果在 java 中的并发映射之外修改对象会发生什么?
- python - 如何在 Python 的 OpenPyxl 旁边使用 R 的 Reticulate 包来隐藏 excel 中的行
- python - 修复“AttributeError:模块'pandas.compat'没有属性'string_types'”错误
- pine-script - RSI 高于/低于先前柱交易视图 Pines 脚本
- docker - 如何设置 google cloud Cloudbuild.yaml 来复制 jenkins 作业?
- oracle - 如何在 Oracle PLSQL 中声明 Windows 路径
- android - 使用 APK 跟踪应用程序安装推荐
- arrays - 如何在字典中附加一个数组(名称)和一个字典项在 plist 中的同一数组下?
- javascript - 如何根据我所在的页面突出显示导航栏
- python - 根据列表中下一个值的距离从列表末尾删除值