2015-04-07 70 views
0

我設置了兩個虛擬機在分佈式設置中測試Spark。看來我的作業只能在一個節點上本地運行,這是我用來提交作業的一個節點。Spark不分配工作

一個節點作爲datanode/worker節點運行,第二個節點另外還有namenode/secondary-namenode 我配置了底層hadoop以使用Yarn。 jps命令確認各種服務在我預計在hadoop/spark中啓動* -script後正確啓動並基本可用。

我使用htop來「跟蹤」如果使用其他節點,但CPU使用率在2%-3%之間跳轉 - >可能不使用。我想知道我在這裏錯過了什麼。

我開始我的工作,用這個命令: ./spark-submit --class COM .... DistributedTest --master紗客戶myJar.jar

這是我執行類(數據.txt文件是關於1GB純文本)

public class DistributedTest 
    { 
     public static void main(String[] args) 
      throws IOException 
     { 

      SparkConf conf = new SparkConf().setAppName("Simple Application"); 
      JavaSparkContext sc = new JavaSparkContext(conf); 
      JavaRDD<String> logData = sc.textFile("hdfs://woodpecker:10001/husr/data.txt");// .persist(StorageLevel.DISK_ONLY()); 

      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(); 

      sc.close(); 

      String s = "Lines with a: " + numAs + ", lines with b: " + numBs; 
      System.out.println(s); 


     } 
    } 

任何人任何想法,爲什麼我的設置不分發

+1

你確定你的機器都在同一個火花簇上? – eliasah

+0

我該如何確認?我假設兩個節點都知道對方,因爲啓動start-all腳本也會啓動節點及其所有服務?他們怎麼可能不在同一個集羣? – toobee

+0

你看到兩個工人在同一個貴? – eliasah

回答

0

filter操作肯定是分佈式的,count部分計算一個工人,而總的C ount計算回主。伯爵的結果也在主人身上。

過濾一個GB的數據並不是真的會給Spark帶來任何壓力,所以你應該只能看到一個CPU上短暫的CPU峯值。請看看I/O使用情況。

你的應用程序很好,你的設置肯定有問題。

+0

'count()'是在master上完成的?怎麼樣? – maasg

+1

當然,當然只有一部分RDD的長度是分佈式的,但它會將主節點上的所有子長度相加。 –

+0

你有什麼建議如何在節點上使用更多的CPU時間?我的主人是100%,而第二個節點是徘徊。我仍然懷疑這是對的。我希望在我的節點上至少看到更多的cpu使用情況。 – toobee

0

首先,您需要檢查Spark UI並確保您有多個工作人員,這也取決於您在Rdd中擁有多少分區。