Apache Drill 集群中的动态 UDF
Dynamic UDF in Apache Drill cluster
我有钻头组,有 4 个钻头(钻头 1.14)。但由于某种原因,我无法在集群中使用动态 UDF 功能。每次,我都遇到了麻烦。
让我展示 2 个场景:
场景一
这是配置(所有钻头的配置都相同):
drill.exec: {
cluster-id: "drill-test",
zk: {
connect: "vm29.local:2181,vm32.local:2181,vm39.local:2181",
root: "drill"
},
sys.store.provider.zk.blobroot: "hdfs://vm29.local:9000/apps/drill/pstore/",
http: {
enabled: true,
ssl_enabled: false,
port: 8047
session_max_idle_secs: 3600, # Default value 1hr
cors: {
enabled: true,
allowedOrigins: ["*"],
allowedMethods: ["GET", "POST", "HEAD", "OPTIONS"],
allowedHeaders: ["X-Requested-With", "Content-Type", "Accept", "Origin"],
}
}
}
drill.exec.udf: {
retry-attempts: 5,
directory: {
fs: "hdfs://vm29.local:9000/",
root: "/drill",
base: "/udf",
local: ${drill.exec.udf.directory.base}"/local",
staging: ${drill.exec.udf.directory.base}"/staging",
registry: ${drill.exec.udf.directory.base}"/registry",
tmp: ${drill.exec.udf.directory.base}"/tmp"
}
}
如您所见,我在那种情况下将 hdfs 用于 UDF。
当我将 jar 文件放入 'staging' 文件夹和 运行 'CREATE FUNCTION USING JAR' - 它成功注册了函数。但是然后我只能在我注册它的钻头上使用它。
例如,如果我在 vm29 中的 web UI 中使用 运行 命令 - 我只能在 vm29 中使用函数。
如果另外,我尝试在不同的钻头中注册 jar - 我收到 'already registered' 错误 - 但无法使用它。(未找到错误)
hdfs://vm29.local:9000/drill/udf/registry
中的 JAR 文件和 ZK 注册表中的元数据。
场景二
配置相同,唯一不同的是 - 所有钻头都将其本地文件系统用于 UDF 文件夹。
在那种情况下 - 我可以 register/unregister 发挥作用 - 但我不能在每个钻头上使用它(未发现错误)。 /UDF/registry 文件夹中的 Jar 文件和 zk 注册表中的元数据 - 但不起作用。
我做错了什么?
我找不到关于在集群中使用动态 UDF 功能的分步说明的任何描述。也许你知道一个?
谢谢。
更新:
我只是想:
我使用网络控制台进行查询。也许它有区别 - 通过网络控制台或 jdbc:zk 连接创建功能? (我会测试)
原因与结果
这是 drill 1.14
中的错误
已在 Drill Jira
中报告
修复并说明:Drill GitHub repository
这是自1.13以来的回归,我们开了一个Jira ticket - https://issues.apache.org/jira/browse/DRILL-6762. Meanwhile, you can add custom udfs manually - https://drill.apache.org/docs/manually-adding-custom-functions-to-drill/.
我有钻头组,有 4 个钻头(钻头 1.14)。但由于某种原因,我无法在集群中使用动态 UDF 功能。每次,我都遇到了麻烦。
让我展示 2 个场景:
场景一
这是配置(所有钻头的配置都相同):
drill.exec: {
cluster-id: "drill-test",
zk: {
connect: "vm29.local:2181,vm32.local:2181,vm39.local:2181",
root: "drill"
},
sys.store.provider.zk.blobroot: "hdfs://vm29.local:9000/apps/drill/pstore/",
http: {
enabled: true,
ssl_enabled: false,
port: 8047
session_max_idle_secs: 3600, # Default value 1hr
cors: {
enabled: true,
allowedOrigins: ["*"],
allowedMethods: ["GET", "POST", "HEAD", "OPTIONS"],
allowedHeaders: ["X-Requested-With", "Content-Type", "Accept", "Origin"],
}
}
}
drill.exec.udf: {
retry-attempts: 5,
directory: {
fs: "hdfs://vm29.local:9000/",
root: "/drill",
base: "/udf",
local: ${drill.exec.udf.directory.base}"/local",
staging: ${drill.exec.udf.directory.base}"/staging",
registry: ${drill.exec.udf.directory.base}"/registry",
tmp: ${drill.exec.udf.directory.base}"/tmp"
}
}
如您所见,我在那种情况下将 hdfs 用于 UDF。
当我将 jar 文件放入 'staging' 文件夹和 运行 'CREATE FUNCTION USING JAR' - 它成功注册了函数。但是然后我只能在我注册它的钻头上使用它。
例如,如果我在 vm29 中的 web UI 中使用 运行 命令 - 我只能在 vm29 中使用函数。
如果另外,我尝试在不同的钻头中注册 jar - 我收到 'already registered' 错误 - 但无法使用它。(未找到错误)
hdfs://vm29.local:9000/drill/udf/registry
中的 JAR 文件和 ZK 注册表中的元数据。
场景二
配置相同,唯一不同的是 - 所有钻头都将其本地文件系统用于 UDF 文件夹。
在那种情况下 - 我可以 register/unregister 发挥作用 - 但我不能在每个钻头上使用它(未发现错误)。 /UDF/registry 文件夹中的 Jar 文件和 zk 注册表中的元数据 - 但不起作用。
我做错了什么?
我找不到关于在集群中使用动态 UDF 功能的分步说明的任何描述。也许你知道一个?
谢谢。
更新:
我只是想: 我使用网络控制台进行查询。也许它有区别 - 通过网络控制台或 jdbc:zk 连接创建功能? (我会测试)
原因与结果
这是 drill 1.14
中的错误
已在 Drill Jira
中报告
修复并说明:Drill GitHub repository
这是自1.13以来的回归,我们开了一个Jira ticket - https://issues.apache.org/jira/browse/DRILL-6762. Meanwhile, you can add custom udfs manually - https://drill.apache.org/docs/manually-adding-custom-functions-to-drill/.