我试图了解必须编译 jar 才能使用 Spark 的范围。
我通常会在 IDE 中编写临时分析代码,然后通过单击(在 IDE 中)在本地针对数据运行它。如果我对 Spark 的实验给出了正确的指示,那么我必须将我的脚本编译成一个 jar,并将它发送到所有 Spark 节点。 IE。我的工作流程是
- 编写分析脚本,它将上传自己的 jar(已创建 下面)
- 去做 jar 。
- 运行脚本。
对于临时迭代工作,这似乎有点多,而且我不明白没有它 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))
}
}
最佳答案
您正在使用“过滤器”创建匿名函数:
scala> (line: String) => line.contains("a")
res0: String => Boolean = <function1>
除非将 jar 分发给工作人员,否则该函数的生成名称不可用。 worker 上的堆栈跟踪是否突出显示了缺失的符号?
如果您只想在本地调试而不必分发 jar,您可以使用“本地”主机:
val conf = new SparkConf().setAppName("myApp").setMaster("local")
关于apache-spark - 带有 jar 的 Spark 工作流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31210377/