2016-03-30 71 views
0

使用阿帕奇火花1.6獨立的集羣模式幾個工人具有Windows 7操作系統一個單機阿帕奇星火工人節點無法找到我的應用程序類

我創建火花上下文Java應用程序中,爲了對數據進行變換寫幾個類(例如MyFunction的延伸org.apache.spark.api.java.function.Function)。我稱它像是

javaRDD.map(new MyFunction()); 

不幸的是,星火工人沒有找到的MyFunction類和作業終止的ClassNotFoundException ...

我做了一些研究,發現一種方法SparkConf.setJars(罐) 。所以,我建我的申請,罐子(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. 如何使應用程序自身的類文件阿瓦伊標籤爲Spark Spark Driver Program的工作人員

  2. 如果我需要提供我的應用程序的Spark到Spark Driver Program, 我該怎麼做。

+0

您在項目中使用了哪些構建工具? –

+0

@Ernest Kiwele我正在使用Maven作爲此項目的構建工具 –

+0

好的,我會根據答案更新答案,並給出您的評論。 –

回答

0

簡短的回答都1和2是可以簡化代碼的包裝(包括驅動程序代碼,什麼是由需要(如上述 的sparkConf.setJars()評判失敗對我來說)工人)通過創建一個用於司機和工人的胖子/超級罐子。

正如'提交應用程序'頁面(http://spark.apache.org/docs/latest/submitting-applications.html)所述,解決這些問題的方法是構建項目的代碼,將其所有依賴項捆綁到一個jar文件中,然後您可以像在你的代碼。

在這個頁面:

如果你的代碼依賴於其他項目,則需要將它們打包到一起你的應用程序,以便將代碼分配到星火集羣。爲此,創建一個包含代碼及其依賴關係的組裝jar(或「超級」jar)。 sbt和Maven都有組裝插件。在創建組件jar時,將Spark和Hadoop列爲提供的依賴關係;這些不需要捆綁在一起,因爲它們是由集羣管理器在運行時提供的。一旦你有一個組裝的jar,你可以調用bin/spark-submit腳本,如圖所示,同時傳遞你的jar。

然後,您可以使用胖罐運行驅動程序並提供工人需要的所有類。

UPDATE(在註釋中給出詳細說明): 當你部署Web應用程序到應用服務器,來解決這個你最好的辦法是(IMO):

  1. 結構化你的項目從Spark客戶端代碼中分離特定於Web的代碼(驅動程序和工作人員的代碼)
  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依賴項,因爲它們在依賴項中被標記爲'provided',但實際上可能在運行時需要。

現在,您的Sark驅動程序代碼必須位於Web項目中,因爲這是您期望運行驅動程序的那個(如您所建議的那樣)。

有了這個,你所要做的就是調用setJars和com.company.foo:foo-spark-client工件的超級罐子的路徑。該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應用程序。我在同一臺本地機器上手動運行火花集羣(通過命令提示符)。然後我在我的web應用程序中創建SparkContext,並使用'sparkConf.setJars(jars);'在Spark上下文中設置jar;當我執行作業時,spark上下文無法找到** myapp.jar **。你能在這方面幫助我嗎? –