我正在尝试理解必须编译jar以使用Spark的扩展。
我通常在IDE中编写临时分析代码,然后通过单击(在IDE中)在本地针对数据运行它。如果我使用Spark的实验给了我正确的指示,那么我必须将我的脚本编译成一个jar,并将其发送到所有Spark节点。即我的工作流程是
对于ad-hoc迭代工作,这看起来有点多,而且我不明白REPL如果没有它就会离开。
更新
这是一个例子,除非我将它编译成jar并且sc.addJar
,否则我无法工作。但我必须这样做的事实似乎很奇怪,因为只有简单的Scala和Spark代码。
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import org.apache.spark.SparkFiles
import org.apache.spark.rdd.RDD
object Runner {
def main(args: Array[String]) {
val logFile = "myData.txt"
val conf = new SparkConf()
.setAppName("MyFirstSpark")
.setMaster("spark://Spark-Master:7077")
val sc = new SparkContext(conf)
sc.addJar("Analysis.jar")
sc.addFile(logFile)
val logData = sc.textFile(SparkFiles.get(logFile), 2).cache()
Analysis.run(logData)
}
}
object Analysis{
def run(logData: RDD[String]) {
val numA = logData.filter(line => line.contains("a")).count()
val numB = logData.filter(line => line.contains("b")).count()
println("Lines with 'a': %s, Lines with 'b': %s".format(numA, numB))
}
}
答案 0 :(得分:1)
虽然创建JAR是处理长时间运行的Spark作业的最常用方法,但对于交互式开发工作,Spark可以直接在Scala,Python和& R.目前的快速入门指南(https://spark.apache.org/docs/latest/quick-start.html)仅提及Scala& Python shell,但SparkR指南也讨论了如何以交互方式使用SparkR(参见https://spark.apache.org/docs/latest/sparkr.html)。当您发现自己正在使用更大的数据集时,最好还是运行Spark:)
答案 1 :(得分:1)
您正在使用'过滤器':
创建一个匿名函数scala> (line: String) => line.contains("a")
res0: String => Boolean = <function1>
除非将jar分发给工作人员,否则该函数生成的名称不可用。工人上的堆栈跟踪是否突出显示缺少的符号?
如果您只想在本地进行调试而无需分发jar,则可以使用本地&#39;主:
val conf = new SparkConf().setAppName("myApp").setMaster("local")
答案 2 :(得分:1)
您可以使用SparkContext.jarOfObject(Analysis.getClass)自动包含您要分发的jar,而无需自行打包。
找到加载了给定类的JAR,以便于使用 用户将他们的JAR传递给SparkContext。
def jarOfClass(cls: Class[_]): Option[String]
def jarOfObject(obj: AnyRef): Option[String]
你想做类似的事情:
sc.addJar(SparkContext.jarOfObject(Analysis.getClass).get)
HTH!