web-dev-qa-db-ja.com

Spark =Javaプログラムを実行する方法

Spark用のJavaプログラムを作成しました。Unixコマンドラインから実行およびコンパイルする方法です。実行用のコンパイル中にjarを含める必要がありますか

41
Pooja3101

公式の クイックスタートガイド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対応アセンブリの構築(上記を参照)。
  • 組み立てられたjarは、HDFSにインストールするか、ローカルで使用できます。
  • アプリケーションコードは、個別のJARファイルにパッケージ化する必要があります。

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、YARNで起動されたSparkプロセスに環境変数を追加します。これは、環境変数のコンマ区切りのリストにすることができます。
SPARK_YARN_USER_ENV="Java_HOME=/jdk64,FOO=bar"

システムプロパティ:

  • spark.yarn.applicationMaster.waitTries、ApplicationMasterがsparkマスターを待機する回数と、待機する試行回数を設定するプロパティSpark初期化されるコンテキスト。デフォルトは10です。
  • spark.yarn.submit.file.replication、アプリケーションのHDFSにアップロードされたファイルのHDFSレプリケーションレベル。これには、spark jar、アプリjar、および分散キャッシュファイル/アーカイブなどが含まれます。
  • spark.yarn.preserve.staging.files、ジョブの終了時にステージングされたファイル(スパークjar、アプリjar、分散キャッシュファイル)を保持するためにtrueに設定し、削除するのではなく、それら。
  • spark.yarn.scheduler.heartbeat.interval-ms、SparkアプリケーションマスターがYARN ResourceManagerにハートビートする間隔(ミリ秒)。デフォルトは5秒です。
  • spark.yarn.max.worker.failures、アプリケーションに障害が発生するまでのワーカー障害の最大数。デフォルトは、要求されたワーカーの数に2を掛けた数であり、最小は3です。

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をポーリングしてステータスの更新を確認し、それらをコンソールに表示します。アプリケーションの実行が終了すると、クライアントは終了します。

このモードでは、アプリケーションは実際にアプリケーションマスターが実行されているリモートマシンで実行されます。したがって、ローカルの相互作用を伴うアプリケーションはうまく機能しません。スパークシェル。

57

数日前に同じ質問がありましたが、昨日それをなんとか解決しました。
それが私がやったことです。

  1. Sbtをダウンロードし、それを解凍してuntar :http://www.scala-sbt.org/download.html
  2. Spark Hadoop 2のPrebuildパッケージを解凍し、解凍しました: http://www.Apache.org/dyn/closer.cgi/spark/spark-1.0。 2/spark-1.0.2-bin-hadoop2.tgz
  3. http://spark.Apache.org/docs/latest/quick-start.html#standalone-applications で説明されているように、適切なsimple.sbtファイルでスタンドアロンアプリケーションSimpleApp.scalaを作成しました(説明からコピーしただけ)と適切なディレクトリレイアウト
  4. PATHにsbtがあることを確認してください。アプリケーションのあるディレクトリに移動し、sbt packageを使用してパッケージをビルドします
  5. 開始Spark SPARK_HOME_DIR/sbin/spark_master.shを使用するサーバー
  6. localhost:8080に移動し、サーバーが実行されていることを確認します。 URLからリンクをコピーします(ローカルホストではなく、サーバーの説明から。ポート7077またはそれと類似したものである必要があります)
  7. SPARK_HOME_DIR/bin/spark-class org.Apache.spark.deploy.worker.Worker spark://IP:PORTを使用してワーカーを開始します。ここで、IP:PORTは6でコピーしたURLです
  8. サーバーにアプリケーションをデプロイします:SPARK_HOME_DIR/bin/spark-submit --class "SimpleApp" --master URL target/scala-2.10/simple-project_2.10-1.0.jar

それは私のために働いたし、希望があなたを助けるだろう。
Pawel

8
psmith

さらに、選択した回答に加えて、外部のスタンドアロン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

5
Alexis Gamarra

この回答は、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に設定するだけです。

1
Binita Bharati