必须在配置中设置主URL,这会产生很多混乱

时间:2018-01-15 10:43:04

标签: apache-spark amazon-emr spark-submit

我在eclipse中编译了我的spark-scala代码。 我正在尝试使用spark-submit选项在EMR( 5.9.0 Spark 2.2.0 )中运行我的jar。 但是当我跑步时我得到一个错误:

Details : Exception in thread "main" org.apache.spark.SparkException: A master URL must be set in your configuration

在阅读了大量StackOverflow解决方案后,我感到困惑,并没有找到关于如何以及为何设置应用程序主数据的正确解释。

这就是我运行jar的方式。我已经尝试了以下所有选项

spark-submit --class financialLineItem.FinancialLineItem s3://trfsmallfffile/AJAR/SparkJob-0.1-jar-with-dependencies.jar

spark-submit --master yarn --class financialLineItem.FinancialLineItem s3://trfsmallfffile/AJAR/SparkJob-0.1-jar-with-dependencies.jar

spark-submit  --master yarn-client --class financialLineItem.FinancialLineItem s3://trfsmallfffile/AJAR/SparkJob-0.1-jar-with-dependencies.jar

spark-submit --deploy-mode cluster --master yarn --class financialLineItem.FinancialLineItem s3://trfsmallfffile/AJAR/SparkJob-0.1-jar-with-dependencies.jar

spark-submit --deploy-mode cluster --master yarn-client --class financialLineItem.FinancialLineItem s3://trfsmallfffile/AJAR/SparkJob-0.1-jar-with-dependencies.jar

spark-submit --master local[*] --deploy-mode cluster --class financialLineItem.FinancialLineItem s3://trfsmallfffile/AJAR/SparkJob-0.1-jar-with-dependencies.jar
spark-submit --master local[1] --deploy-mode cluster --class financialLineItem.FinancialLineItem s3://trfsmallfffile/AJAR/SparkJob-0.1-jar-with-dependencies.jar
spark-submit --master local[2] --deploy-mode cluster --class financialLineItem.FinancialLineItem s3://trfsmallfffile/AJAR/SparkJob-0.1-jar-with-dependencies.jar
spark-submit --master local[3] --deploy-mode cluster --class financialLineItem.FinancialLineItem s3://trfsmallfffile/AJAR/SparkJob-0.1-jar-with-dependencies.jar
spark-submit --master local[4] --deploy-mode cluster --class financialLineItem.FinancialLineItem s3://trfsmallfffile/AJAR/SparkJob-0.1-jar-with-dependencies.jar
spark-submit --master local[5] --deploy-mode cluster --class financialLineItem.FinancialLineItem s3://trfsmallfffile/AJAR/SparkJob-0.1-jar-with-dependencies.jar

我没有在我的Scala代码中设置任何app master。

  package financialLineItem

import org.apache.spark.SparkConf
import org.apache.spark._
import org.apache.spark.sql.SQLContext
import org.apache.spark.rdd.RDD
import org.apache.spark.sql._
import org.apache.spark.sql.functions.rank
import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions._
import org.apache.spark.{ SparkConf, SparkContext }
import java.sql.{ Date, Timestamp }
import org.apache.spark.sql.Row
import org.apache.spark.sql.types._
import org.apache.spark.sql.functions.input_file_name
import org.apache.spark.sql.functions.regexp_extract
import org.apache.spark.sql.functions.udf
import org.apache.spark.sql.expressions._

object FinancialLineItem {

  def main(args: Array[String]) {

    println("Enterin In to Spark Mode ")
    val conf = new SparkConf().setAppName("FinanicalLineItem");
    println("After conf")
    val sc = new SparkContext(conf); //Creating spark context
    println("After SC")
    val sqlContext = new org.apache.spark.sql.SQLContext(sc)

    import sqlContext.implicits._

     val get_cus_val = sqlContext.udf.register("get_cus_val", (filePath: String) => filePath.split("\\.")(3))

    val rdd = sc.textFile("s3://path/FinancialLineItem/MAIN")
    val header = rdd.filter(_.contains("LineItem.organizationId")).map(line => line.split("\\|\\^\\|")).first()
    val schema = StructType(header.map(cols => StructField(cols.replace(".", "_"), StringType)).toSeq)
    val data = sqlContext.createDataFrame(rdd.filter(!_.contains("LineItem.organizationId")).map(line => Row.fromSeq(line.split("\\|\\^\\|").toSeq)), schema)

    val schemaHeader = StructType(header.map(cols => StructField(cols.replace(".", "."), StringType)).toSeq)
    val dataHeader = sqlContext.createDataFrame(rdd.filter(!_.contains("LineItem.organizationId")).map(line => Row.fromSeq(line.split("\\|\\^\\|").toSeq)), schemaHeader)



    val df1resultFinal = data.withColumn("DataPartition", get_cus_val(input_file_name))
    val rdd1 = sc.textFile("s3://path/FinancialLineItem/INCR")
    val header1 = rdd1.filter(_.contains("LineItem.organizationId")).map(line => line.split("\\|\\^\\|")).first()
    val schema1 = StructType(header1.map(cols => StructField(cols.replace(".", "_"), StringType)).toSeq)
    val data1 = sqlContext.createDataFrame(rdd1.filter(!_.contains("LineItem.organizationId")).map(line => Row.fromSeq(line.split("\\|\\^\\|").toSeq)), schema1)

    val windowSpec = Window.partitionBy("LineItem_organizationId", "LineItem_lineItemId").orderBy($"TimeStamp".cast(LongType).desc)
    val latestForEachKey = data1.withColumn("rank", rank().over(windowSpec)).filter($"rank" === 1).drop("rank", "TimeStamp")

    val dfMainOutput = df1resultFinal.join(latestForEachKey, Seq("LineItem_organizationId", "LineItem_lineItemId"), "outer")
      .select($"LineItem_organizationId", $"LineItem_lineItemId",
        when($"DataPartition_1".isNotNull, $"DataPartition_1").otherwise($"DataPartition").as("DataPartition"),
        when($"FinancialConceptCodeGlobalSecondaryId_1".isNotNull, $"FinancialConceptCodeGlobalSecondaryId_1").otherwise($"FinancialConceptCodeGlobalSecondaryId").as("FinancialConceptCodeGlobalSecondaryId"),
        when($"FFAction_1".isNotNull, $"FFAction_1").otherwise($"FFAction|!|").as("FFAction|!|"))
      .filter(!$"FFAction|!|".contains("D|!|"))

    val dfMainOutputFinal = dfMainOutput.na.fill("").select($"DataPartition", $"StatementTypeCode", concat_ws("|^|", dfMainOutput.schema.fieldNames.filter(_ != "DataPartition").map(c => col(c)): _*).as("concatenated"))

    val headerColumn = dataHeader.columns.toSeq

    val headerLast = headerColumn.mkString("", "|^|", "|!|").dropRight(3)

    val dfMainOutputFinalWithoutNull = dfMainOutputFinal.withColumn("concatenated", regexp_replace(col("concatenated"), "|^|null", "")).withColumnRenamed("concatenated", headerLast)

    dfMainOutputFinalWithoutNull.repartition(1).write.partitionBy("DataPartition", "StatementTypeCode")
      .format("csv")
      .option("nullValue", "")
      .option("delimiter", "\t")
      .option("quote", "\u0000")
      .option("header", "true")
      .option("codec", "gzip")
      .save("s3://path/FinancialLineItem/output")

即使我尝试在spark-scala代码中设置主网址。

这适用于火花的EMR示例

spark-submit  --deploy-mode cluster --class org.apache.spark.examples.JavaSparkPi /usr/lib/spark/examples/jars/spark-examples.jar 5

如果这个工作那么为什么我的罐子不工作? 我在创建spark上下文之前尝试在我的scala类中打印语句并且正在打印,因此在jar文件创建中没有问题。

我不知道我错过了什么?

还要更新我的eclipse IDE设置。 Eclipse IDE set up

遵循以下文档

AWS add steps document

这是我的观察

类似“spark:// ...”的主URL适用于Spark Standalone,但EMR在YARN上使用Spark,因此主URL应该只是“yarn”。这已在spark-defaults.conf,

中为您配置

更多调查结果。 当我试图从spark-shell提交我得到以下错误

User class threw exception: java.lang.UnsupportedOperationException: empty collection.

我认为我的代码也可能存在一些问题。

但是当我从Zeppelin运行时,我得到了正确的结果。

2 个答案:

答案 0 :(得分:1)

在问题和第一个答案中,这里出现了很多混乱。如果您正在运行在YARN上运行Spark的EMR上运行,则根本不需要设置主URL。它自动默认为“yarn”,这是在YARN上运行Spark时的正确值(与Spark Standalone相反,后者将具有类似spark://:7077的主URL)。

正如其他一个答案所述,“ - local local”和“--deploy-mode cluster”也没有任何意义。 “--master local”应该仅用于本地开发和测试目的,并且在诸如EMR之类的机器集群上使用是没有意义的。它所做的就是在一个JVM中运行整个应用程序;它不会在YARN上运行,它不会在集群中分布,甚至在驱动程序代码和任务之间也不会分开。

对于“--deploy-mode cluster”,如另一个答案中所述,这意味着您的驱动程序与执行程序一起在集群上的YARN容器中运行,而不是默认的“--deploy” -mode client“,其中驱动程序在YARN之外的主节点上运行。

有关详细信息,请参阅Spark文档,主要是https://spark.apache.org/docs/latest/submitting-applications.htmlhttps://spark.apache.org/docs/latest/running-on-yarn.html

答案 1 :(得分:0)

正如documentation中所述,--deploy-mode cluster要求spark-submit在其中一个执行程序上运行驱动程序。

然而,这不适用于您的执行。因为你在本地运行。您应该使用client部署模式。为此,只需完全删除--deploy-mode参数。

您必须选择以下呼叫之一,具体取决于您希望如何运行驱动程序(或最后一个选项的执行程序)。重要的是要理解它们之间的差异。

如果要在群集上运行驱动程序(群集模式,master选择群集上的位置):

spark-submit --master master.address.com:7077 --deploy-mode cluster #other options

如果要在调用spark-submit的计算机上运行驱动程序(客户端模式,执行程序保留在集群上):

spark-submit --master master.address.com:7077 --deploy-mode client #other options

如果您在本地运行(驱动程序和执行程序),那么您的local主文件是合适的:

spark-submit --master local[*] #other options