ApacheFlink:Python流式API中的Kafka连接器;无法加载用户类";

ApacheFlink:Python流式API中的Kafka连接器;无法加载用户类";,python,apache-kafka,apache-flink,flink-streaming,pyflink,Python,Apache Kafka,Apache Flink,Flink Streaming,Pyflink,我正在试用Flink的新Python流式API,并尝试使用/Flink-1.6.1/bin/pyflink-stream.sh examples/read_from_kafka.py运行我的脚本。python脚本相当简单,我只是尝试使用现有主题并将所有内容发送到stdout(或日志目录中的*.out文件,默认情况下输出方法在该目录中发送数据) 我从maven repos抓取了一些jar文件,即flink-connector-kafka-0.9_2.11-1.6.1.jar,flink-conne

我正在试用Flink的新Python流式API,并尝试使用
/Flink-1.6.1/bin/pyflink-stream.sh examples/read_from_kafka.py
运行我的脚本。python脚本相当简单,我只是尝试使用现有主题并将所有内容发送到stdout(或日志目录中的*.out文件,默认情况下输出方法在该目录中发送数据)

我从maven repos抓取了一些jar文件,即
flink-connector-kafka-0.9_2.11-1.6.1.jar
flink-connector-kafka-base_2.11-1.6.1.jar
kafka-clients-0.9.0.1.jar
,并将它们复制到flink的
lib
目录中。除非我误解了文档,否则这应该足以让Flink加载kafka连接器。事实上,如果我移除这些JAR中的任何一个,导入都会失败,但这似乎不足以实际调用该计划。 添加for循环以动态地将它们添加到
sys.path
也不起作用。以下是控制台中打印的内容:

Starting execution of program
Failed to run plan: null
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/tmp/flink_streaming_plan_9cfed4d9-0288-429c-99ac-df02c86922ec/read_from_kafka.py", line 32, in main
    at org.apache.flink.client.program.rest.RestClusterClient.submitJob(RestClusterClient.java:267)
    at org.apache.flink.client.program.ClusterClient.run(ClusterClient.java:486)
    at org.apache.flink.streaming.api.environment.StreamContextEnvironment.execute(StreamContextEnvironment.java:66)
    at org.apache.flink.streaming.api.environment.StreamExecutionEnvironment.execute(StreamExecutionEnvironment.java:1511)
    at org.apache.flink.streaming.python.api.environment.PythonStreamExecutionEnvironment.execute(PythonStreamExecutionEnvironment.java:245)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)

org.apache.flink.client.program.ProgramInvocationException: org.apache.flink.client.program.ProgramInvocationException: Job failed. (JobID: bbcc0cb2c4fe6e3012d228b06b270eba)

The program didn't contain a Flink job. Perhaps you forgot to call execute() on the execution environment.
开始执行程序
无法运行计划:null
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/tmp/flink_streaming_plan_9cfed4d9-0288-429c-99ac-df02c86922ec/read_from_kafka.py”,第32行,主文件
位于org.apache.flink.client.program.rest.RestClusterClient.submitJob(RestClusterClient.java:267)
在org.apache.flink.client.program.ClusterClient.run(ClusterClient.java:486)
位于org.apache.flink.streaming.api.environment.StreamContextEnvironment.execute(StreamContextEnvironment.java:66)
位于org.apache.flink.streaming.api.environment.StreamExecutionEnvironment.execute(StreamExecutionEnvironment.java:1511)
位于org.apache.flink.streaming.python.api.environment.PythonStreamExecutionEnvironment.execute(PythonStreamExecutionEnvironment.java:245)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:498)
org.apache.flink.client.program.ProgramInvocationException:org.apache.flink.client.program.ProgramInvocationException:作业失败。(作业ID:bbcc0cb2c4fe6e3012d228b06b270eba)
该程序不包含Flink作业。也许您忘记在执行环境中调用execute()。
这是我在日志中看到的:

org.apache.flink.streaming.runtime.tasks.StreamTaskException: Cannot load user class:    org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer09
ClassLoader info: URL ClassLoader:
    file: '/tmp/blobStore-9f6930fa-f1cf-4851-a0bf-2e620391596f/job_ca486746e7feb42d2d162026b74e9935/blob_p-9321896d165fec27a617d44ad50e3ef09c3211d9-405ccc9b490fa1e1348f0a76b1a48887' (valid JAR)
Class not resolvable through given classloader.
    at org.apache.flink.streaming.api.graph.StreamConfig.getStreamOperator(StreamConfig.java:236)
    at org.apache.flink.streaming.runtime.tasks.OperatorChain.<init>(OperatorChain.java:104)
    at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:267)
    at org.apache.flink.runtime.taskmanager.Task.run(Task.java:711)
    at java.lang.Thread.run(Thread.java:748)
org.apache.flink.streaming.runtime.tasks.StreamTaskException:无法加载用户类:org.apache.flink.streaming.connectors.kafka.flinkkaConsumer09
类加载器信息:URL类加载器:
文件:'/tmp/blobStore-9f6930fa-f1cf-4851-a0bf-2e620391596f/job_ca486746e7feb42d2d162026b74e9935/blob_p-9321896d165fec27a617d44ad50e3ef09c3211d9-405CC9B490FA1E1348F0A76B1A48887'(有效JAR)
类无法通过给定的类加载器解析。
位于org.apache.flink.streaming.api.graph.StreamConfig.getStreamOperator(StreamConfig.java:236)
位于org.apache.flink.streaming.runtime.tasks.OperatorChain.(OperatorChain.java:104)
位于org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:267)
位于org.apache.flink.runtime.taskmanager.Task.run(Task.java:711)
运行(Thread.java:748)

有没有办法解决这个问题并使连接器可用于Python?我怀疑这是Jython的类加载器问题,但我不知道如何进一步调查(同时考虑到我对Java一无所知)。非常感谢。

您在这里使用了错误的卡夫卡消费者。在您的代码中,它是
FlinkKafkaConsumer09
,但您正在使用的库是
flink-connector-kafka-0.11_2.11-1.6.1.jar
,它用于
FlinkKafkaConsumer011
。试着用这个
flinkkafsumer011
替换
flinkkafsumer09
,或者使用lib文件
flink-connector-kafka-0.9_2.11-1.6.1.jar

我认为jar文件可能有内置的导入或依赖项,所以这三个jar文件是不够的。至于如何找出java jar依赖关系,这就是JavaMaven所做的。您可以查看官方网站“project build setup”以获取帮助。 在我的例子中,我遵循正式的java项目设置,使用“from org.apache.flink.streaming.connectors.kafka import flinkkafconsumer”并添加依赖项 org.apache.flink
flink-clients_2.11

1.8.0“到pom.xml,然后我可以用Python API将卡夫卡记录输出到标准输出。抱歉,我的
lib
目录中有
0.11
,而不是
0.11
,实际上我的帖子(现在编辑)中有
flink-connector-kafka-0.9_2.11-1.6.1.jar
,这只是一个打字错误。最初的问题仍然存在。
org.apache.flink.streaming.runtime.tasks.StreamTaskException: Cannot load user class:    org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer09
ClassLoader info: URL ClassLoader:
    file: '/tmp/blobStore-9f6930fa-f1cf-4851-a0bf-2e620391596f/job_ca486746e7feb42d2d162026b74e9935/blob_p-9321896d165fec27a617d44ad50e3ef09c3211d9-405ccc9b490fa1e1348f0a76b1a48887' (valid JAR)
Class not resolvable through given classloader.
    at org.apache.flink.streaming.api.graph.StreamConfig.getStreamOperator(StreamConfig.java:236)
    at org.apache.flink.streaming.runtime.tasks.OperatorChain.<init>(OperatorChain.java:104)
    at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:267)
    at org.apache.flink.runtime.taskmanager.Task.run(Task.java:711)
    at java.lang.Thread.run(Thread.java:748)