【发布时间】:2019-02-27 17:52:13
【问题描述】:
我有一个 Spark Streaming 应用程序,它从 Kafka 的记录中读取 Hive 表名,例如表1..表2..表3..等
我想对 hive 表执行结构化查询并将结果流式传输到另一个 Kafka 主题。
我有这样的
val hqls = rdd
.filter(record => record.value() != null && record.value().trim.length > 0)
.foreach(tableName=> publishData(tableName, sparkSession, kafkaProducer))
我的publishData如下
val df = sparkSession.sql("select * from " + tableName)
df.foreach { row =>
// code to write to kafka
}
当我执行此操作时,我在sparkSession.sql 处得到一个NullPointerException 调用,如下所示:
org.apache.spark.SparkException: Job aborted due to stage failure: Task 13 in stage 12.0 failed 8 times, most recent failure: Lost task 13.7 in stage 12.0 (TID 838, cilhdwks0001.sys.cigna.com, executor 1): java.lang.NullPointerException
at org.apache.spark.sql.SparkSession.sessionState$lzycompute(SparkSession.scala:142)
at org.apache.spark.sql.SparkSession.sessionState(SparkSession.scala:140)
我在其他帖子中发现无法在rdd.foreach 中运行val df = sparkSession.sql(hql),但还没有找到正确的方法。
如果我将代码更改为使用collect,如下所示,它确实有效。为什么?
val tablenames = rdd
.filter(tableName => tableName != null && tableName.trim.length > 0)
.collect()
tablenames.foreach { tablename =>
publishData(tablename, sparkSession, kafkaProducer)
}
它是否高效,是否会将负载正确分配到集群?
【问题讨论】:
标签: apache-spark apache-spark-sql spark-streaming