Apache spark 如何将数据流与非流文件连接?

Apache spark 如何将数据流与非流文件连接?,apache-spark,spark-streaming,Apache Spark,Spark Streaming,我想用一个非流、不变的引用文件将每个RDD加入到一个数据流中。这是我的密码: val sparkConf = new SparkConf().setAppName("LogCounter") val ssc = new StreamingContext(sparkConf, Seconds(2)) val sc = new SparkContext() val geoData = sc.textFile("data/geoRegion.csv") .map(_

我想用一个非流、不变的引用文件将每个RDD加入到一个数据流中。这是我的密码:

val sparkConf = new SparkConf().setAppName("LogCounter") 
val ssc =  new StreamingContext(sparkConf, Seconds(2)) 

val sc = new SparkContext() 
val geoData = sc.textFile("data/geoRegion.csv") 
            .map(_.split(',')) 
            .map(line => (line(0), (line(1),line(2),line(3),line(4)))) 

val topicMap = topics.split(",").map((_,numThreads.toInt)).toMap 
val lines = KafkaUtils.createStream(ssc, zkQuorum, group, topicMap).map(_._2) 

val goodIPsFltrBI = lines.filter(...).map(...).filter(...) // details removed for brevity 
val vdpJoinedGeo = goodIPsFltrBI.transform(rdd =>rdd.join(geoData)) 
我犯了很多错误,最常见的是:

14/11/19 19:58:23 WARN TaskSetManager: Loss was due to java.io.FileNotFoundException
java.io.FileNotFoundException: http://10.102.71.92:40764/broadcast_1
我认为我应该广播geoData,而不是在每个任务中读取它(这是一个100MB的文件),但我不确定第一次初始化geoData的代码应该放在哪里

此外,我也不确定geoData的定义是否正确(也许它应该使用ssc而不是sc?)。我看到的文档只列出了转换和连接,但没有显示静态文件是如何创建的

关于如何广播地理数据,然后将其加入到每个流式RDD中,您有什么想法吗?

  • FileNotFound异常:
从提供的位置(“data/geroRegion.csv”)向所有工人加载geoData文本文件。最有可能的情况是,此文件仅在驱动程序中可用,因此工作人员无法加载它,并引发“未找到文件”异常

  • 广播变量:
广播变量在驱动程序上定义,并通过展开广播容器来获取内容,在工作者上使用。 这意味着在定义作业之前,驱动程序应该加载广播变量包含的数据

在这种情况下,这可能会解决两个问题:假设geoData.csv文件位于驱动程序节点中,它将允许在驱动程序上正确加载此数据,并在集群中有效分布

在上面的代码中,将地理数据加载替换为本地文件读取版本:

val geoData = Source.fromFile("data/geoRegion.csv").getLines 
            .map(_.split(',')) 
            .map(line => (line(0), (line(1),line(2),line(3),line(4)))).toMap 

val geoDataBC = sc.broadcast(geoData)
要使用它,可以访问闭包中的广播内容。请注意,您可以访问之前包装在广播变量中的映射:它是一个简单的对象,而不是RDD,因此在这种情况下,您不能使用
join
合并这两个数据集。您可以改用flatMap:

val vdpJoinedGeo = goodIPsFltrBI.flatMap{ip => geoDataBC.value.get(ip).map(data=> (ip,data)}

你太棒了!!我在网上的任何地方都找不到这个,但它马上就起作用了。谢谢。PySpark中的最后一行是什么意思?