Java 试图从MS SQL读取数据集时JDBCInputFormat.open中的NullPointerException
为了使用ApacheFlink,我尝试从Microsoft SQL数据库中提供的数据创建一个数据集。test_表有两列,“numbers”和“strings”,分别包含int和VARCHARsJava 试图从MS SQL读取数据集时JDBCInputFormat.open中的NullPointerException,java,sql-server,jdbc,apache-flink,Java,Sql Server,Jdbc,Apache Flink,为了使用ApacheFlink,我尝试从Microsoft SQL数据库中提供的数据创建一个数据集。test_表有两列,“numbers”和“strings”,分别包含int和VARCHARs // supply row type info TypeInformation<?>[] fieldTypes = new TypeInformation<?>[] { BasicTypeInfo.INT_TYPE_INFO, BasicTypeInfo.CHAR_
// supply row type info
TypeInformation<?>[] fieldTypes = new TypeInformation<?>[] {
BasicTypeInfo.INT_TYPE_INFO,
BasicTypeInfo.CHAR_TYPE_INFO,
};
RowTypeInfo rowTypeInfo = new RowTypeInfo(fieldTypes);
// create and configure input format
JDBCInputFormat inputFormat = JDBCInputFormat.buildJDBCInputFormat()
.setDrivername("com.microsoft.sqlserver.jdbc.SQLServerDriver")
.setDBUrl(serverurl)
.setUsername(username)
.setPassword(password)
.setQuery("SELECT numbers, strings FROM test_table")
.setRowTypeInfo(rowTypeInfo)
.finish();
// create and configure type information for DataSet
TupleTypeInfo typeInformation = new TupleTypeInfo(Tuple2.class, BasicTypeInfo.INT_TYPE_INFO, BasicTypeInfo.STRING_TYPE_INFO);
// Read data from a relational database using the JDBC input format
DataSet<Tuple2<Integer, String>> dbData = environment.createInput(inputFormat, typeInformation);
// write to sink
dbData.print();
这让我没有真正的线索在哪里以及如何寻找解决方案。奇怪的是,在我将Flink JDBC版本从0.10.2更改为1.1.3之前,这段代码就工作了。旧版本不需要RowTypeInfo部分,这意味着它可能会检查类型本身,但除了将其添加到代码中之外,没有任何更改
那么,它很可能与RowTypeInfo有关。我尝试对它们进行一些更改,例如使用BasicTypeInfo.CHAR\u TYPE\u INFO
而不是BasicTypeInfo.STRING\u TYPE\u INFO
(因为该列是VARCHAR列),但错误仍然存在
理想情况下,我希望修复空指针问题,并继续处理包含数据库信息的数据集。考虑到缺乏文档/教程和(工作)示例,我还提出了一个更一般的问题:在Flink中尝试处理SQL数据到底是一个好主意,还是根本不适合这样做?到目前为止,我开始认为,在开始Flink作业之前,创建一个从数据库读取并将其内容保存到CSV文件的例程可能更容易,尽管这很乏味 您说您已经将Flink JDBC版本更新为1.1.3,但是Flink的其余部分呢?建议如果你有Flink其他部分的旧版本,那么你可能会得到这样的NPE。你是对的。我的pom.xml通过一个变量引用了Flink版本,在测试了Flink JDBC的新版本后,我忘记了更改它。哦。非常感谢!
Exception in thread "main" org.apache.flink.runtime.client.JobExecutionException: Job execution failed.
at org.apache.flink.runtime.jobmanager.JobManager$$anonfun$handleMessage$1$$anonfun$applyOrElse$7.apply$mcV$sp(JobManager.scala:714)
at org.apache.flink.runtime.jobmanager.JobManager$$anonfun$handleMessage$1$$anonfun$applyOrElse$7.apply(JobManager.scala:660)
at org.apache.flink.runtime.jobmanager.JobManager$$anonfun$handleMessage$1$$anonfun$applyOrElse$7.apply(JobManager.scala:660)
at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:41)
at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:401)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
Caused by: java.lang.NullPointerException
at org.apache.flink.api.java.io.jdbc.JDBCInputFormat.open(JDBCInputFormat.java:231)
at org.apache.flink.runtime.operators.DataSourceTask.invoke(DataSourceTask.java:147)
at org.apache.flink.runtime.taskmanager.Task.run(Task.java:559)
at java.lang.Thread.run(Thread.java:745)