Apache spark Apache Spark Streaming-流没有更多数据时正常关闭

Apache spark Apache Spark Streaming-流没有更多数据时正常关闭,apache-spark,spark-streaming,Apache Spark,Spark Streaming,我正在开发Spark Streaming API,我希望连续地流式传输一组预下载的web日志文件,以模拟实时流。我编写了一个脚本,将压缩的日志压缩并通过管道将输出传输到7777端口的nc 脚本如下所示: BASEDIR=/home/mysuer/data/datamining/internet\u traffic\u archive zipped_files=`find$BASEDIR-name“*.gz”` 用于$zipped_文件中的zfile 做 echo“解压缩$zfile…” gunz

我正在开发Spark Streaming API,我希望连续地流式传输一组预下载的web日志文件,以模拟实时流。我编写了一个脚本,将压缩的日志压缩并通过管道将输出传输到7777端口的nc

脚本如下所示:

BASEDIR=/home/mysuer/data/datamining/internet\u traffic\u archive
zipped_files=`find$BASEDIR-name“*.gz”`
用于$zipped_文件中的zfile
做
echo“解压缩$zfile…”
gunzip-c$zfile | nc-l-p 7777-q 20
完成
我有用Scala编写的流代码来处理流。它在大多数情况下运行良好,但当流式处理的文件用完时,我似乎会出现以下错误:

16/02/19 23:04:35 WARN ReceiverSupervisorImpl: 
Restarting receiver with delay 2000 ms: Socket data stream had no more data
16/02/19 23:04:35 ERROR ReceiverTracker: Deregistered receiver for stream 0: 
Restarting receiver with delay 2000ms: Socket data stream had no more data
16/02/19 23:04:35 WARN BlockManager: Block input-0-1455941075600 replicated to only 0 peer(s) instead of 1 peers
....
16/02/19 23:04:40 ERROR Executor: Exception in task 2.0 in stage 15.0 (TID 47)
java.util.NoSuchElementException: None.get
at scala.None$.get(Option.scala:313)
at scala.None$.get(Option.scala:311)
at com.femibyte.learningsparkaddexamples.scala.StreamingLogEnhanced$$anonfun$2.apply(StreamingLogEnhanced.scala:42)
at com.femibyte.learningsparkaddexamples.scala.StreamingLogEnhanced$$anonfun$2.apply(StreamingLogEnhanced.scala:42)
如何实现优雅的关闭,以便程序在不再检测到流中的任何数据时优雅地退出

我的scala代码如下所示:

objectstreaminglogenhanced{
def main(参数:数组[字符串]){
val master=args(0)
val conf=new SparkConf().setMaster(master).setAppName(“StreamingLogEnhanced”)
//创建第二批大小为n的StreamingContext
val ssc=新的StreamingContext(形态,秒(10))
//从端口7777上的所有输入创建一个数据流
val log=Logger.getLogger(getClass.getName)
sys.shutdownhook线程{
log.info(“优雅地停止Spark流媒体应用程序”)
ssc.停止(正确,正确)
log.info(“应用程序已停止”)
}
val line=ssc.sockettextream(“localhost”,7777)
//按ip创建日志命中数
var ipCounts=countByIp(行)
ipCounts.print()
//启动流媒体上下文并等待它“完成”
ssc.start()
//等待600秒,然后退出
子系统控制器(10000*600)
ssc.停止()
}
def countByIp(行:数据流[字符串])={
val parser=新的AccessLogParser
val accessLogDStream=lines.map(line=>parser.parseRecord(line))
val ipDStream=accessLogDStream.map(entry=>(entry.get.clientIpAddress,1))
ipDStream.reduceByKey((x,y)=>x+y)
}
}

我认为当脚本在循环上迭代时,spark试图从套接字读取数据,但数据不可用时,您会遇到异常。您可以共享Scala代码吗?特别是关于
StreamingLogEnhanced.scala:42
?看起来上一个错误是由您在
None
对象上调用
get
的代码引起的,但是如果不查看代码,我真的无法判断。我认为当脚本在循环上迭代时,spark尝试从套接字读取数据,但数据不可用,您会遇到异常。您可以共享Scala代码吗?特别是关于
StreamingLogEnhanced.scala:42
?看起来上一个错误是由您在
None
对象上调用
get
的代码引起的,但是如果没有看到代码,我真的无法判断。