2016-03-31 113 views
3

我試圖在使用DCOS cli的mesos上啓動火花流作業。 我能夠開始工作。我的程序希望一個配置文件作爲cli參數傳遞。我如何實現這一點dcos spark run --submit-args使用mesos的火花提交dcos cli

我試過--files http://server/path/to//file希望它會下載文件,但沒有奏效。驅動程序啓動但失敗,因爲配置文件丟失。

我也嘗試將jar和配置文件作爲tar捲起來並提交。我可以在Mesos日誌中看到焦油被提取和解壓。 config和jar文件都可以在工作目錄中看到。但是,作業因ClassNotFoundException而失敗。我懷疑有關火花提交是如何開始的。

dcos spark run --submit-args="--supervise --deploy-mode cluster --class package.name.classname http://file-server:8000/Streaming.tar.gz Streaming.conf" 

任何提示如何進行?另外,在哪個日誌文件中可以看到DCOS使用的基礎spark-submit命令?

回答

3

這裏是你應該爲了使啓動命令它工作的例子:

dcos spark run --submit-args='--conf spark.mesos.uris=https://s3-us-west-2.amazonaws.com/andrey-so-36323287/pi.conf --class JavaSparkPiConf https://s3-us-west-2.amazonaws.com/andrey-so-36323287/sparkPi_without_config_file.jar /mnt/mesos/sandbox/pi.conf'

--conf spark.mesos.uris=...驅動程序或執行程序由Mesos啓動時,要下載到沙箱的逗號分隔列表。這適用於粗粒度和細粒度模式。

/mnt/mesos/sandbox/pi.conf下載文件的路徑,您的主類接收爲第0個參數(請參閱下面的代碼段)。 /mnt/mesos/sandbox/是映射到corespondent mesos任務沙箱的容器內的標準路徑。

public final class JavaSparkPiConf { 

    public static void main(String[] args) throws Exception { 
    SparkConf sparkConf = new SparkConf().setAppName("JavaSparkPi"); 
    JavaSparkContext jsc = new JavaSparkContext(sparkConf); 

    Scanner scanner = new Scanner(new FileInputStream(args[0])); 
    int slices; 
    if (scanner.hasNextInt()) { 
     slices = scanner.nextInt(); 
    } else { 
     slices = 2; 
    } 
    int n = 100000 * slices; 
    List<Integer> l = new ArrayList<>(n); 
    for (int i = 0; i < n; i++) { 
     l.add(i); 
    } 

    JavaRDD<Integer> dataSet = jsc.parallelize(l, slices); 

    int count = dataSet.map(new Function<Integer, Integer>() { 
     @Override 
     public Integer call(Integer integer) { 
     double x = Math.random() * 2 - 1; 
     double y = Math.random() * 2 - 1; 
     return (x * x + y * y < 1) ? 1 : 0; 
     } 
    }).reduce(new Function2<Integer, Integer, Integer>() { 
     @Override 
     public Integer call(Integer integer, Integer integer2) { 
     return integer + integer2; 
     } 
    }); 

    System.out.println("Pi is roughly " + 4.0 * count/n); 

    jsc.stop(); 
    } 
} 
+0

就是這樣。缺失的部分是在/ mnt/mesos/sandbox中查找下載的文件。 – Cheeko

2

Streaming.conf只是一個字符串,將傳遞給您的驅動程序。您的驅動程序必須能夠看到它。最簡單的方法是將其放置在一個可訪問的位置,指定要通過spark.mesos.uris [1]將其下載到沙盒中。您可以交替編寫應用程序以支持從遠程位置讀取數據,只需在CLI上傳遞位置即可。

--files用於在執行文件中放置文件,但是您嘗試將文件傳遞給驅動程序,因此無法正常工作。

[1] http://spark.apache.org/docs/latest/running-on-mesos.html

邁克爾Gummelt
中層

+0

我知道的參數傳遞給程序:) 驅動程序字符串已經讀取該文件。我試圖讓它可用。我會嘗試你的建議。 URI中指定的鏈接在什麼時候被下載?我在啓動spark上下文之前閱讀conf文件。 – Cheeko

+0

多一個,如果我需要在執行器中放置額外的文件( - 文件)或罐子( - 罐子),我該如何實現? – Cheeko

+0

spark.mesos.uris does not download the file。我可以在mesos fetcher日誌中看到。但它不在當前目錄或類路徑中。我無法在代碼中「查看」該文件。我已經使用直接從共享位置閱讀,但知道如何管理和共享資源將是一件好事。 – Cheeko