2016-03-30 5 views
0

を見つけることがワーカーノードができスパーク。Apacheは<strong>Windows 7のOS</strong>を持つ<strong>単一のマシン</strong>に</strong><strong>マスター</strong>と<strong>少数の労働者との<strong>スタンドアロンクラスタモード</strong>で<strong>Apacheのスパーク1.6</strong>を使用して自分のアプリケーションクラス

Iは、Javaアプリケーション内でスパーク・コンテキストを作成し、データに変換を行うためにいくつかのクラス(例えばMyFunctionをorg.apache.spark.api.java.function.Functionを延びている)を書きました。私は、私はいくつかの研究を行なったし、方法SparkConf.setJars(瓶)を見つけ

...労働者のClassNotFoundExceptionで終了MyFunctionのクラスと仕事を見つけることができませんスパーク、残念ながら

javaRDD.map(new MyFunction()); 

のようにそれを呼ばれます。だから、私は(myapp.jar)瓶に自分のアプリケーションを構築し、ディレクトリに置かれ(例えばD:/スパーク

String[] jars = { "file:D:/spark/myappjar" }; 
sparkConf.setJars(jars); 

しかし、それは例外につながる:

2016-03-30 15:27:07 WARN TaskSetManager:70 
- Lost task 0.0 in stage 0.0 (TID 0, alivia): 
java.lang.ClassNotFoundException: com.ai.cache.spark.NumericFieldsToVector 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:274) 

質問:

  1. どのように私は、アプリケーション自身のクラスファイルのAvaIを作るのですかsparkドライバからの ワーカー

  2. 私のアプリケーションのjarファイルをSpark Driver Programに提供する必要がある場合は、 どうすればいいのですか? 1と2の両方への短い答えはあなたのコード(ドライバコード、何で必要なのは、両方のパッケージを簡素化することができるということです

+0

プロジェクトではどのビルドツールを使用していますか? –

+0

@Ernest Kiwele私はこのプロジェクトのビルドツールとしてMavenを使用しています –

+0

OK、答えの下にあなたのコメントがあればそれを更新します。 –

答えて

0

を( は、上述したようにsparkConf.setJars()優先mothodは私のために失敗しました)運転者と労働者の両方に使用される脂肪/宇宙瓶を作ることにより、

「提出するアプリケーション」のページ(http://spark.apache.org/docs/latest/submitting-applications.html)に文書化されるように、これらの問題を解決するための方法はあなたが行ったようにあなたがして設定することができ、単一のjarファイルにすべての依存関係とそれを束ねる、プロジェクトのコードを構築することですあなたのコード。そのページから、

あなたのコードは、他のプロジェクトに依存している場合、あなたはスパーククラスタにコードを配布するために、あなたのアプリケーションと一緒にそれらをパッケージ化する必要があります。これを行うには、コードとその依存関係を含むアセンブリjar(または "uber" jar)を作成します。 sbtとMavenの両方にアセンブリプラグインがあります。アセンブリのjarを作成するときは、提供された依存関係としてSparkとHadoopをリストします。実行時にクラスタ・マネージャによって提供されるため、これらをバンドルする必要はありません。アセンブルされたjarファイルを取得したら、Jarファイルを渡してbin/spark-submitスクリプトをここに示すように呼び出すことができます。

ドライバを実行し、ワーカーが必要とするすべてのクラスを提供するためにfat jarを使用できます。 (コメントで詳細を与えられた)

UPDATE

  1. 構造プロジェクトに:あなたは、アプリケーションサーバーにWebアプリケーションを配備していると 、これを解決するためにあなたの最善の方法は、(IMO)にあります
  2. WebプロジェクトをsparkクライアントJarに依存させてから、setJars()の呼び出しでJARファイルを使用します。
次のように行うことができます

は、JARのMavenプロジェクトを作成するために使用されるスパーク関連のコード

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.company.foo</groupId> 
    <artifactId>foo-spark-client</artifactId> 
    ... 
    <!--Add spark-related dependencies as per your current setup--> 
    <dependencies> 
    <dependency> 
     <groupId>org.apache.spark</groupId> 
     <artifactId>spark-core_2.11</artifactId> 
     <version>${spark.version}</version> 
     <scope>provided</scope> 
    </dependency> 
    <!-- Add the plugin to create the uber/fat jar file --> 
    <build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>2.3</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <artifactSet> 
         </artifactSet> 
         <filters> 
          <filter> 
           <artifact>*:*</artifact> 
           <excludes> 
            <exclude>META-INF/*.SF</exclude> 
            <exclude>META-INF/*.DSA</exclude> 
            <exclude>META-INF/*.RSA</exclude> 
           </excludes> 
          </filter> 
         </filters> 
         <outputFile>${project.build.directory}/${project.artifactId}-${project.version}-fat.jar</outputFile> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
    </build> 

前のアーティファクトに依存してWebプロジェクトを作成します。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.company.foo</groupId> 
    <artifactId>foo-web</artifactId> 
    <packaging>war</packaging> 
    ... 
    <!--Add spark client dependency --> 
    <dependencies> 
    <dependency> 
     <groupId>com.company.foo</groupId> 
     <artifactId>foo-spark-client</artifactId> 
     <version>1.0-SNAPSHOT</version> 
     <scope>compile</scope> 
    </dependency> 

ここで、spark依存関係は、依存関係に '提供されている'とマークされているため、実行時に実際に必要になる可能性があるため、再追加す​​る必要があることに注意してください。

ここで、Sarkドライバコードは、(希望どおり)ドライバを実行するために必要なものであるため、Webプロジェクト内になければなりません。

これで、com.company.foo:foo-spark-clientアーティファクトのuber jarへのパスでsetJarsを呼び出すだけで済みます。このjarは、foo-spark-clientプロジェクトのターゲットフォルダに作成されます(名前に「-fat.jar」が追加されます)。このJARをTomcatを実行しているサーバー上のアクセス可能なパスに置き、それに応じてWebコードを更新します。

String[] jars = { "file:D:/foo-spark-client/target/foo-spark-client-1.0-SNAPSHOT-fat.jar" }; 
sparkConf.setJars(jars); 
+0

ありがとうございます。私が開発しているアプリケーションは、tomcatサーバー上でホストされているWebアプリケーションです。私はsparkクラスタを同じローカルマシン上で手動で(コマンドプロンプト経由で)実行します。次に、私のWebアプリケーションでSparkContextを作成し、 'sparkConf.setJars(jars);を使用してsparkコンテキストでjarを設定し、ジョブを実行すると、sparkコンテキストが** myapp.jar **を見つけることができません。この点で私を助けてくれますか? –

関連する問題