Spark用のJavaプログラムを作成しました。Unixコマンドラインから実行およびコンパイルする方法です。実行用のコンパイル中にjarを含める必要がありますか
公式の クイックスタートガイド と YARNでのSparkの起動 の手順を組み合わせると、次のようになります。
非常に単純なSparkアプリケーションSimpleApp.Javaを作成します。
/*** SimpleApp.Java ***/
import org.Apache.spark.api.Java.*;
import org.Apache.spark.api.Java.function.Function;
public class SimpleApp {
public static void main(String[] args) {
String logFile = "$YOUR_SPARK_HOME/README.md"; // Should be some file on your system
JavaSparkContext sc = new JavaSparkContext("local", "Simple App",
"$YOUR_SPARK_HOME", new String[]{"target/simple-project-1.0.jar"});
JavaRDD<String> logData = sc.textFile(logFile).cache();
long numAs = logData.filter(new Function<String, Boolean>() {
public Boolean call(String s) { return s.contains("a"); }
}).count();
long numBs = logData.filter(new Function<String, Boolean>() {
public Boolean call(String s) { return s.contains("b"); }
}).count();
System.out.println("Lines with a: " + numAs + ", lines with b: " + numBs);
}
}
このプログラムは、テキストファイル内の「a」を含む行数と「b」を含む行数をカウントするだけです。 $ YOUR_SPARK_HOMEをSparkがインストールされている場所に置き換える必要があることに注意してください。 Scalaの例と同様に、SparkContextを初期化しますが、特殊なJavaSparkContextクラスを使用してJavaに優しいクラスを取得します。また、RDD(JavaRDDで表される)を作成し、それらに対して変換を実行します。最後に、spark.api.Java.function.Functionを拡張するクラスを作成して、関数をSparkに渡します。 Javaプログラミングガイドでは、これらの違いについて詳しく説明しています。
プログラムをビルドするには、Sparkを依存関係としてリストするMaven pom.xml ファイルも作成します。 SparkアーティファクトにはScalaバージョンのタグが付けられていることに注意してください。
<project>
<groupId>edu.berkeley</groupId>
<artifactId>simple-project</artifactId>
<modelVersion>4.0.0</modelVersion>
<name>Simple Project</name>
<packaging>jar</packaging>
<version>1.0</version>
<repositories>
<repository>
<id>Akka repository</id>
<url>http://repo.akka.io/releases</url>
</repository>
</repositories>
<dependencies>
<dependency> <!-- Spark dependency -->
<groupId>org.Apache.spark</groupId>
<artifactId>spark-core_2.10</artifactId>
<version>0.9.0-incubating</version>
</dependency>
</dependencies>
</project>
HadoopのHDFSからデータを読み取る場合は、HDFSのバージョンに応じてhadoop-clientへの依存関係を追加する必要もあります。
<dependency>
<groupId>org.Apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>...</version>
</dependency>
これらのファイルは、標準のMavenディレクトリ構造に従ってレイアウトします。
$ find .
./pom.xml
./src
./src/main
./src/main/Java
./src/main/Java/SimpleApp.Java
これで、Mavenを使用してアプリケーションを実行できます。
$ mvn package
$ mvn exec:Java -Dexec.mainClass="SimpleApp"
...
Lines with a: 46, Lines with b: 23
そして、 YARNでのSparkの起動 からの手順に従います。
YARN対応アセンブリJARの構築
YARNクラスターでSparkジョブを実行するには、統合されたSpark JAR(必要なすべての依存関係をバンドル)が必要です。これは、次のようにHadoopバージョンとSPARK_YARN環境変数を設定することで構築できます。
SPARK_HADOOP_VERSION=2.0.5-alpha SPARK_YARN=true sbt/sbt Assembly
アセンブルされたJARは、。/ Assembly/target/scala-2.10/spark-Assembly_0.9.0-incubating-hadoop2.0.5.jarのようなものになります。
ビルドプロセスは、新しいYARNバージョン(2.2.x)もサポートするようになりました。下記参照。
準備
YARN展開モードをテストする場合は、現在のSparkの例を使用できます。 spark-examples_2.10-0.9.0-incubatingファイルは以下を実行することで生成できます:
sbt/sbt Assembly
注:読んでいるドキュメントはSparkバージョン0.9.0-incubatingのものであるため、ここではSpark 0.9.0-incubating、またはソース管理からチェックアウトしました。 Sparkの異なるバージョンを使用している場合、sbt packageコマンドによって生成されるjarのバージョン番号は明らかに異なります。
構成
YARNのSparkのほとんどの構成は、他のデプロイと同じです。それらの詳細については、構成ページを参照してください。これらは、YARNのSPARKに固有の構成です。
環境変数:
SPARK_YARN_USER_ENV="Java_HOME=/jdk64,FOO=bar"
システムプロパティ:
YARNでのSparkの起動
HADOOP_CONF_DIRまたはYARN_CONF_DIRが(client側)hadoopクラスターの構成ファイル。これは、クラスターに接続し、dfsに書き込み、ジョブをリソースマネージャーに送信するために使用されます。
YARNでsparkアプリケーションを起動するために使用できる2つのスケジューラモードがあります。
糸スタンドアロンモードでYARNクライアントによってsparkアプリケーションを起動します。
YARNクライアントを起動するコマンドは次のとおりです。
SPARK_JAR=<SPARK_Assembly_JAR_FILE> ./bin/spark-class org.Apache.spark.deploy.yarn.Client \
--jar <YOUR_APP_JAR_FILE> \
--class <APP_MAIN_CLASS> \
--args <APP_MAIN_ARGUMENTS> \
--num-workers <NUMBER_OF_WORKER_MACHINES> \
--master-class <ApplicationMaster_CLASS>
--master-memory <MEMORY_FOR_MASTER> \
--worker-memory <MEMORY_PER_WORKER> \
--worker-cores <CORES_PER_WORKER> \
--name <application_name> \
--queue <queue_name> \
--addJars <any_local_files_used_in_SparkContext.addJar> \
--files <files_for_distributed_cache> \
--archives <archives_for_distributed_cache>
例えば:
# Build the Spark Assembly JAR and the Spark examples JAR
$ SPARK_HADOOP_VERSION=2.0.5-alpha SPARK_YARN=true sbt/sbt Assembly
# Configure logging
$ cp conf/log4j.properties.template conf/log4j.properties
# Submit Spark's ApplicationMaster to YARN's ResourceManager, and instruct Spark to run the SparkPi example
$ SPARK_JAR=./Assembly/target/scala-2.10/spark-Assembly-0.9.0-incubating-hadoop2.0.5-alpha.jar \
./bin/spark-class org.Apache.spark.deploy.yarn.Client \
--jar examples/target/scala-2.10/spark-examples-Assembly-0.9.0-incubating.jar \
--class org.Apache.spark.examples.SparkPi \
--args yarn-standalone \
--num-workers 3 \
--master-memory 4g \
--worker-memory 2g \
--worker-cores 1
# Examine the output (replace $YARN_APP_ID in the following with the "application identifier" output by the previous command)
# (Note: YARN_APP_LOGS_DIR is usually /tmp/logs or $HADOOP_HOME/logs/userlogs depending on the Hadoop version.)
$ cat $YARN_APP_LOGS_DIR/$YARN_APP_ID/container*_000001/stdout
Pi is roughly 3.13794
上記は、デフォルトのアプリケーションマスターを起動するYARNクライアントプログラムを起動します。その後、SparkPiはApplication Masterの子スレッドとして実行され、YARN Clientは定期的にApplication Masterをポーリングしてステータスの更新を確認し、それらをコンソールに表示します。アプリケーションの実行が終了すると、クライアントは終了します。
このモードでは、アプリケーションは実際にアプリケーションマスターが実行されているリモートマシンで実行されます。したがって、ローカルの相互作用を伴うアプリケーションはうまく機能しません。スパークシェル。
数日前に同じ質問がありましたが、昨日それをなんとか解決しました。
それが私がやったことです。
sbt package
を使用してパッケージをビルドしますSPARK_HOME_DIR/sbin/spark_master.sh
を使用するサーバーlocalhost:8080
に移動し、サーバーが実行されていることを確認します。 URLからリンクをコピーします(ローカルホストではなく、サーバーの説明から。ポート7077またはそれと類似したものである必要があります)SPARK_HOME_DIR/bin/spark-class org.Apache.spark.deploy.worker.Worker spark://IP:PORT
を使用してワーカーを開始します。ここで、IP:PORTは6でコピーしたURLですSPARK_HOME_DIR/bin/spark-submit --class "SimpleApp" --master URL target/scala-2.10/simple-project_2.10-1.0.jar
それは私のために働いたし、希望があなたを助けるだろう。
Pawel
さらに、選択した回答に加えて、外部のスタンドアロンSparkインスタンスに接続する場合:
SparkConf conf =
new SparkConf()
.setAppName("Simple Application")
.setMaster("spark://10.3.50.139:7077");
JavaSparkContext sc = new JavaSparkContext(conf);
ここでは、Sparkが実行されている場所に応じて、より多くの「マスター」構成を見つけることができます: http://spark.Apache.org/docs/latest/submitting-applications.html#master -urls
この回答は、Spark 2.3に対するものです。Sparkアプリケーションをローカルでテストする場合、つまりHadoopクラスターの前提条件を使用せず、スタンドアロンを起動する必要がない場合Sparkサービス、これを行うことができます:
JavaSparkContext jsc = new JavaSparkContext(new SparkConf().setAppName("Simple App"));
そして、アプリケーションをローカルで実行するには:
$SPARK_HOME/bin/spark-submit --class SimpleApp --master local target/scala-2.10/simple-project_2.10-1.0.jar
これを機能させるには、Spark tarファイルを$ SPARK_HOMEに抽出し、$ SPARK_HOMEをSparkユーザーの.profileに設定するだけです。