我正在使用Spark结构化流从Kafka中读取消息,消息包含包含JSON文件的zip文件的路径,我将JSON并通过以下代码将其写入HDFS:
首先,我正在为kafka创建readStream。
Dataset<Row> dsRow = spark.readStream()
.format("kafka")
.options(/*KAFKA OPTIONS - Servers etc*/)
.load();
然后,我为ForeachQuery创建writeStream
dsRow.writeStream()
.queryName("ForEachQuery")
.outputMode(OutputMode.Update())
.foreach(writer)
.start()
.awaitTermination();
我的作家像:
ForeachWriter<Row> writer = new ForeachWriter() {
@Override
public void process(Row arg0) {
//Here I'm extracting the ZIP content (JSON files) to HDFS.
}
@Override
public boolean open(long arg0, long arg1) { return true; }
@Override
public void close(long arg0, long arg1) { }
}
我的问题有时是出现以下异常:
在/user/myuser/path/filefromzip.json(inode 1815182)上没有租约:文件 不存在。持有人DFSClient_NOMAPREDUCE_1932232_180没有 任何打开的文件。
我知道发生这种情况是因为我并行工作,但是我该如何解决呢?
也许是因为重复处理?如果是这样,如何防止使用open
方法?
谢谢。