Apache spark Spark文件流不使用foreachRDD
我是Spark的新手,我正在构建一个小样本应用程序,这是一个Spark文件流应用程序。我只想一次读取整个文件,而不是逐行读取(我想这就是textFileStream所做的) 代码如下:Apache spark Spark文件流不使用foreachRDD,apache-spark,Apache Spark,我是Spark的新手,我正在构建一个小样本应用程序,这是一个Spark文件流应用程序。我只想一次读取整个文件,而不是逐行读取(我想这就是textFileStream所做的) 代码如下: import org.apache.spark.SparkContext import org.apache.spark.SparkContext._ import org.apache.spark.streaming.{Seconds, StreamingContext} import org.apache.s
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.streaming.StreamingContext._
import org.apache.hadoop.io.LongWritable
import org.apache.hadoop.io.Text
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat
import scalax.io._
object SampleXML{
def main(args: Array[String]){
val logFile = "/home/akhld/mobi/spark-streaming/logs/sample.xml"
val ssc = new StreamingContext("spark://localhost:7077","XML Streaming Job",Seconds(5),"/home/akhld/mobi/spark-streaming/spark-0.8.0-incubating",List("target/scala-2.9.3/simple-project_2.9.3-1.0.jar"))
val lines = ssc.fileStream[LongWritable, Text, TextInputFormat]("/home/akhld/mobi/spark-streaming/logs/")
lines.print()
lines.foreachRDD(rdd => {
rdd.count() // prints counts
})
ssc.start()
}
}
此代码失败,出现异常,表示:
[error] /home/akhld/mobi/spark-streaming/samples/samplexml/src/main/scala/SampleXML.scala:31: value foreachRDD is not a member of org.apache.spark.streaming.DStream[(org.apache.hadoop.io.LongWritable, org.apache.hadoop.io.Text)]
[error] ssc.fileStream[LongWritable, Text, TextInputFormat]("/home/akhld/mobi/spark-streaming/logs/").foreachRDD(rdd => {
[error] ^
[error] one error found
[error] (compile:compile) Compilation failed
[error] Total time: 3 s, completed Feb 3, 2014 7:32:57 PM
如果这不是显示流中文件内容的正确方法,请帮我举个例子。我搜索了很多,但找不到使用fileStream的合适文件。好吧,Spark Streaming中的textFileStream更适合于连续读取和处理目录中正在写入的文件。因此,如果您必须一次性处理一个文件作为一个整体,那么直接使用Spark会更简单
val lines = sparkContext.textFile(<file URL>)
lines.foreach(line => println(line))
val lines=sparkContext.textFile()
lines.foreach(line=>println(line))
这将打印文件中的所有行 另外,我认为这里的问题是不能在forEach流中对RDD调用count()。原因是,如果您这样做,我认为它会阻止forEach块的进程,并且流消费者停止工作 我已经为此创造了一个JIRA
我认为在forEach块中引用rdd时,可以对rdd进行一些敏感的API调用,但还没有完全弄清楚所有细节 通过将Spark更新为最新版本0.9.0,该问题得以解决。不过,这些行将打印到executor输出流中。而不是应用程序的输出。