ローカルモードで問題なく動作するSparkアプリがありますが、Sparkクラスタに送信するときにいくつか問題があります。
エラーメッセージは次のとおりです。
16/06/24 15:42:06 WARN scheduler.TaskSetManager: Lost task 2.0 in stage 0.0 (TID 2, cluster-node-02): Java.lang.ExceptionInInitializerError
at GroupEvolutionES$$anonfun$6.apply(GroupEvolutionES.scala:579)
at GroupEvolutionES$$anonfun$6.apply(GroupEvolutionES.scala:579)
at scala.collection.Iterator$$anon$14.hasNext(Iterator.scala:390)
at org.Apache.spark.util.Utils$.getIteratorSize(Utils.scala:1595)
at org.Apache.spark.rdd.RDD$$anonfun$count$1.apply(RDD.scala:1157)
at org.Apache.spark.rdd.RDD$$anonfun$count$1.apply(RDD.scala:1157)
at org.Apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1858)
at org.Apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1858)
at org.Apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66)
at org.Apache.spark.scheduler.Task.run(Task.scala:89)
at org.Apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1145)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:615)
at Java.lang.Thread.run(Thread.Java:745)
Caused by: org.Apache.spark.SparkException: A master URL must be set in your configuration
at org.Apache.spark.SparkContext.<init>(SparkContext.scala:401)
at GroupEvolutionES$.<init>(GroupEvolutionES.scala:37)
at GroupEvolutionES$.<clinit>(GroupEvolutionES.scala)
... 14 more
16/06/24 15:42:06 WARN scheduler.TaskSetManager: Lost task 5.0 in stage 0.0 (TID 5, cluster-node-02): Java.lang.NoClassDefFoundError: Could not initialize class GroupEvolutionES$
at GroupEvolutionES$$anonfun$6.apply(GroupEvolutionES.scala:579)
at GroupEvolutionES$$anonfun$6.apply(GroupEvolutionES.scala:579)
at scala.collection.Iterator$$anon$14.hasNext(Iterator.scala:390)
at org.Apache.spark.util.Utils$.getIteratorSize(Utils.scala:1595)
at org.Apache.spark.rdd.RDD$$anonfun$count$1.apply(RDD.scala:1157)
at org.Apache.spark.rdd.RDD$$anonfun$count$1.apply(RDD.scala:1157)
at org.Apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1858)
at org.Apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1858)
at org.Apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66)
at org.Apache.spark.scheduler.Task.run(Task.scala:89)
at org.Apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1145)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:615)
at Java.lang.Thread.run(Thread.Java:745)
上記のコードでは、GroupEvolutionES
がメインクラスです。エラーメッセージには "あなたの設定にはマスターURLを設定しなければならない"と書かれていますが、私はspark-submit
に "--master"パラメータを与えました。
この問題を解決する方法を知っている人は誰ですか?
スパークバージョン:1.6.1
SparkContextオブジェクトはどこで定義されていますか?それはmain関数の中にありますか?
私も同じ問題に直面しました、私がした間違いは私がメイン関数の外側とクラスの内側のsparkContextを始めたことでした。
私がmain関数の中でそれを始めたとき、それはうまくいきました。
TLDR:
.config("spark.master", "local")
spark 2.2.1のspark.masterのオプション一覧
私はローカルモードで簡単なSpark SQL Javaプログラムを実行しようとした後にこのページに行きました。これを行うには、spark.masterを次のように設定します。
SparkSession spark = SparkSession
.builder()
.appName("Java Spark SQL basic example")
.config("spark.master", "local")
.getOrCreate();
私の答えへの更新:
明確にするために、これは実稼働環境でするべきことではありません。実稼働環境では、spark.masterは他の2つの場所のいずれかで指定する必要があります。$ SPARK_HOME/conf/spark-defaults.conf(これはclouderaマネージャが置く場所です)、または送信時にコマンドラインで指定する必要があります。アプリ。 (ex spark-submit - マスターヤーン).
この方法でspark.masterを 'local'に指定すると、下記のコメントに示すように、sparkは単一のjvmで実行しようとします。その後、--deploy-mode clusterを指定しようとすると、「クラスターのデプロイモードはマスターの「ローカル」と互換性がありません」というエラーが表示されます。これは、spark.master = localを設定すると、クラスタモードで実行していないことになるためです。
代わりに、プロダクションアプリの場合は、メイン関数内(またはメイン関数によって呼び出される関数内)で、単に使用する必要があります。
SparkSession
.builder()
.appName("Java Spark SQL basic example")
.getOrCreate();
これはコマンドラインで/ configファイルで指定された設定を使用します。
また、これも明確にするために、--masterと "spark.master"はまったく同じパラメータで、異なる方法で指定されています。上記の私の答えのように、コードでspark.masterを設定すると、--masterを設定しようとする試みが上書きされ、spark-defaults.confの値が上書きされるので、本番では行わないでください。テストには最適です。
また、 この答え も参照してください。これは spark.masterのオプション一覧 にリンクしていて、それぞれが実際に何をしているのでしょうか。
交換した後私のために働きました
SparkConf sparkConf = new SparkConf().setAppName("SOME APP NAME");
と
SparkConf sparkConf = new SparkConf().setAppName("SOME APP NAME").setMaster("local[2]").set("spark.executor.memory","1g");
Stackoverflowの他のスレッドでこの解決策を見つけました。
"spark.master"のデフォルト値はspark:// Host:PORTです。次のコードは、Host:PORTで実行されているスタンドアロンクラスタからセッションを取得しようとし、そのホストを想定しています。 :スパーク設定ファイルに含まれるPORT値。
SparkSession spark = SparkSession
.builder()
.appName("SomeAppName")
.getOrCreate();
"org.Apache.spark.SparkException:設定にマスターURLを設定する必要があります"と表示されますHost:PORTはspark設定に設定されていませんファイル。
"Host:PORT"の値を気にしないためには、spark.masterをlocalに設定してください。
SparkSession spark = SparkSession
.builder()
.appName("SomeAppName")
.config("spark.master", "local")
.getOrCreate();
ここ はマスターURLをspark.masterに渡すことができるフォーマットのリストへのリンクです。
スタンドアロンアプリケーションを実行している場合は、SparkContext
の代わりにSparkSession
を使用する必要があります。
val conf = new SparkConf().setAppName("Samples").setMaster("local")
val sc = new SparkContext(conf)
val textData = sc.textFile("sample.txt").cache()
アプリケーション内のスパークコンテキストは、どのようにしてスパークマスターの値を選択しますか?
SparkConf
を使用して明示的に指定します。System.getProperties
(SparkSubmitが--master
引数を読んだ後にそれを先に置いた場所)から選びます。これで、SparkSubmit
がドライバ上で実行されます。この場合、ドライバはspark-submit
スクリプトを実行している場所のマシンです。そしてこれはおそらくあなたにも期待通りに働いています。
しかし、あなたが投稿した情報から、エクゼキュータに送られるコードでスパークコンテキストを作成しているように見えます - そしてそこに利用可能なspark.master
システムプロパティがないとすれば、それは失敗します。 (もしそうであれば、実際にそうすべきではありません。)
GroupEvolutionES
コードを投稿してください(特にSparkContext(s)
を作成している場所)。
私は同じ問題を抱えていた、これは修正前の私のコードです:
package com.asagaama
import org.Apache.spark.SparkContext
import org.Apache.spark.SparkConf
import org.Apache.spark.rdd.RDD
/**
* Created by asagaama on 16/02/2017.
*/
object Word {
def countWords(sc: SparkContext) = {
// Load our input data
val input = sc.textFile("/Users/Documents/spark/testscase/test/test.txt")
// Split it up into words
val words = input.flatMap(line => line.split(" "))
// Transform into pairs and count
val counts = words.map(Word => (Word, 1)).reduceByKey { case (x, y) => x + y }
// Save the Word count back out to a text file, causing evaluation.
counts.saveAsTextFile("/Users/Documents/spark/testscase/test/result.txt")
}
def main(args: Array[String]) = {
val conf = new SparkConf().setAppName("wordCount")
val sc = new SparkContext(conf)
countWords(sc)
}
}
そして交換した後:
val conf = new SparkConf().setAppName("wordCount")
と:
val conf = new SparkConf().setAppName("wordCount").setMaster("local[*]")
それはうまくいった!
var appName:String ="test"
val conf = new SparkConf().setAppName(appName).setMaster("local[*]").set("spark.executor.memory","1g");
val sc = SparkContext.getOrCreate(conf)
sc.setLogLevel("WARN")
交換します。
SparkConf sparkConf = new SparkConf().setAppName("SOME APP NAME");
WITH
SparkConf sparkConf = new SparkConf().setAppName("SOME APP NAME").setMaster("local[2]").set("spark.executor.memory","1g");
魔法をしました。
これを試して
特色をつける
import org.Apache.spark.sql.SparkSession
trait SparkSessionWrapper {
lazy val spark:SparkSession = {
SparkSession
.builder()
.getOrCreate()
}
}
それを拡張する
object Preprocess extends SparkSessionWrapper {
設定するsetMaster( "local [*]")がありません。追加したら問題は解決します。
問題:
val spark = SparkSession
.builder()
.appName("Spark Hive Example")
.config("spark.sql.warehouse.dir", warehouseLocation)
.enableHiveSupport()
.getOrCreate()
解決策:
val spark = SparkSession
.builder()
.appName("Spark Hive Example")
.config("spark.sql.warehouse.dir", warehouseLocation)
.enableHiveSupport()
.master("local[*]")
.getOrCreate()
以下のコードを使用している場合
val sc = new SparkContext(master, "WordCount", System.getenv("SPARK_HOME"))
それから次の行に置き換えます
val jobName = "WordCount";
val conf = new SparkConf().setAppName(jobName);
val sc = new SparkContext(conf)
Spark 2.0では、次のコードを使うことができます。
val spark = SparkSession
.builder()
.appName("Spark SQL basic example")
.config("spark.some.config.option", "some-value")
.master("local[*]")// need to add
.getOrCreate()
ここでlocalを実行すると*すべてのノードを意味する場合は、.master( "local [*]")を追加する必要があります。
クラスタの場合はマスターURLを設定する必要があります