scala udf 在 flink sql 客户端中抱怨“java.lang.ClassNotFoundException”

Posted

技术标签:

【中文标题】scala udf 在 flink sql 客户端中抱怨“java.lang.ClassNotFoundException”【英文标题】:scala udf complains"java.lang.ClassNotFoundException"in flink sql client 【发布时间】:2021-01-30 08:05:52 【问题描述】:

UDF 的整个 scala 项目在这里:

Flink_SQL_Client_UDF/Scala_fixed/

我注册udf的操作是这样的:

①mvn scala:compile package
②cp table_api-1.0-SNAPSHOT.jar $FLINK_HOME/lib
③add the following sentence into $FLINK_HOME/conf/flink-conf.yaml
flink.execution.jars: $FLINK_HOME/lib/table_api-1.0-SNAPSHOT.jar
④create temporary function scalaupper as 'ScalaUpper';
⑤CREATE TABLE orders (
    order_uid  BIGINT,
    product_name String,
    price      DECIMAL(32, 2),
    order_time TIMESTAMP(3)
) WITH (
    'connector' = 'datagen'
);
⑥select scalaupper(product_name) from orders;

然后我得到了

java.lang.ClassNotFoundException: ScalaUpper

需要您的帮助,谢谢!

【问题讨论】:

【参考方案1】:

@需要帮助。感谢您重现问题的详细步骤。我想我们可以通过在sql客户端[1]中使用-j命令将jar添加到java类路径中来解决这个问题。在我当地的环境中,它可以工作。但是我在文档 [2] 中没有找到有关“flink.execution.jars”的任何信息。因此,我不确定此选项是否适用于 sql 客户端。

将函数注册到表环境时,函数目录只是做一个简单的验证,并将添加到map中。它不会将类加载到运行时。只有当作业调用函数时,函数目录才会将类加载到运行时中。

[1]https://ci.apache.org/projects/flink/flink-docs-master/dev/table/sqlClient.html#configuration [2]https://ci.apache.org/projects/flink/flink-docs-master/deployment/config.html

【讨论】:

以上是关于scala udf 在 flink sql 客户端中抱怨“java.lang.ClassNotFoundException”的主要内容,如果未能解决你的问题,请参考以下文章

Flink SQL 客户端如何使用

Flink UDF

案例说明flink的udf

95-910-144-源码-FlinkSQL-Flink的UDF

Apache-Flink 1.11 无法在 SQL 函数 DDL 中使用 Python UDF

使用 scala 在 spark sql 中编写 UDF