我在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文件创建中没有问题。
我不知道我错过了什么?
遵循以下文档
这是我的观察
类似“spark:// ...”的主URL适用于Spark Standalone,但EMR在YARN上使用Spark,因此主URL应该只是“yarn”。这已在spark-defaults.conf,
中为您配置更多调查结果。 当我试图从spark-shell提交我得到以下错误
User class threw exception: java.lang.UnsupportedOperationException: empty collection.
我认为我的代码也可能存在一些问题。
但是当我从Zeppelin
运行时,我得到了正确的结果。
答案 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.html和https://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