使用jar

时间:2015-07-03 15:41:23

标签: apache-spark

我正在尝试理解必须编译jar以使用Spark的扩展。

我通常在IDE中编写临时分析代码,然后通过单击(在IDE中)在本地针对数据运行它。如果我使用Spark的实验给了我正确的指示,那么我必须将我的脚本编译成一个jar,并将其发送到所有Spark节点。即我的工作流程是

  1. 编写分析脚本,它将上传一个罐子(已创建 下面)
  2. 去做罐子。
  3. 运行脚本。
  4. 对于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))
      }
    }
    

3 个答案:

答案 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!