2015-04-04 73 views
9

我想在配置文件中指定Spark的所有屬性,然後在運行時加載該配置文件。指定Apache Spark的外部配置文件

~~~~~~~~~~編輯~~~~~~~~~~~

原來我很困惑如何去這樣做。忽略這個問題的其餘部分。要查看一個簡單的解決方案(在Java Spark中),瞭解如何將.properties文件加載到Spark集羣中,請參閱下面的答案。

原始問題僅供參考。

~~~~~~~~~~~~~~~~~~~~~~~~

我想

  • 根據環境不同的配置文件(本地,AWS)
  • 我想指定的應用程序特定參數

舉一個簡單的例子,讓我們想象一下,我想篩選依賴於字符串在日誌文件中的行。下面我有一個簡單的Java Spark程序,它從文件中讀取數據並根據用戶定義的字符串對其進行過濾。該程序需要一個參數,即輸入源文件。

的Java代碼星火

import org.apache.spark.SparkConf; 
import org.apache.spark.api.java.JavaRDD; 
import org.apache.spark.api.java.JavaSparkContext; 
import org.apache.spark.api.java.function.Function; 

public class SimpleSpark { 
    public static void main(String[] args) { 
     String inputFile = args[0]; // Should be some file on your system 

     SparkConf conf = new SparkConf();// .setAppName("Simple Application"); 
     JavaSparkContext sc = new JavaSparkContext(conf); 
     JavaRDD<String> logData = sc.textFile(inputFile).cache(); 

     final String filterString = conf.get("filterstr"); 

     long numberLines = logData.filter(new Function<String, Boolean>() { 
      public Boolean call(String s) { 
       return s.contains(filterString); 
      } 
     }).count(); 

     System.out.println("Line count: " + numberLines); 
    } 
} 

配置文件

配置文件是基於https://spark.apache.org/docs/1.3.0/configuration.html,它看起來像:

spark.app.name   test_app 
spark.executor.memory 2g 
spark.master   local 
simplespark.filterstr a 

的問題

我使用以下參數執行應用程序:

/path/to/inputtext.txt --conf /path/to/configfile.config 

然而,這不起作用,因爲異常

Exception in thread "main" org.apache.spark.SparkException: A master URL must be set in your configuration 

被拋出。對我來說意味着配置文件沒有被加載。

我的問題是:

  1. 什麼是錯我的設置?
  2. 是否在spark配置文件良好實踐中指定應用程序特定參數?

回答

7

那麼一點時間之後,我意識到我很困惑。將配置文件存入內存的最簡單方法是使用標準屬性文件,將其放入hdfs並從那裏加載。爲了記錄在案,這裏是代碼做(在Java中星火):

import java.util.Properties; 

import org.apache.hadoop.fs.FileSystem; 
import org.apache.hadoop.fs.Path; 

import org.apache.spark.SparkConf; 
import org.apache.spark.api.java.JavaSparkContext; 

SparkConf sparkConf = new SparkConf() 
JavaSparkContext ctx = new JavaSparkContext(sparkConf); 

InputStream inputStream; 
Path pt = new Path("hdfs:///user/hadoop/myproperties.properties"); 
FileSystem fs = FileSystem.get(ctx.hadoopConfiguration()); 
inputStream = fs.open(pt); 

Properties properties = new Properties(); 
properties.load(inputStream); 
+0

它不適合我。仍然得到FileNotFoundException。 – nish 2015-10-08 18:28:37

+0

你把文件放在hdfs中?你在使用aws嗎? – Alexander 2015-10-08 18:37:19

+0

是的,我把文件放在hdfs中。是的,我正在使用aws EMR – nish 2015-10-08 18:39:31

4
  1. --conf僅設置了星星之火的財產,它不是讀取文件。
    例如--conf spark.shuffle.spill=false
  2. 應用程序參數不會進入spark-defaults,而是作爲程序參數傳遞(並從您的主方法中讀取)。 spark-defaults應該包含適用於大多數或全部作業的SparkConf屬性。如果您想使用配置文件而不是應用程序參數,請查看Typesafe Config。它也支持環境變量。
3

FWIW,使用類型安全配置庫,我只是驗證了這項工作ScalaTest:

val props = ConfigFactory.load("spark.properties") 
    val conf = new SparkConf(). 
    setMaster(props.getString("spark.master")). 
    setAppName(props.getString("spark.app.name")) 
+0

你怎麼提屬性文件路徑?默認情況下它在哪裏查找文件?如果運行該應用程序的主節點和節點不同,該怎麼辦? – 2017-01-11 14:28:09

4

試試這個

--properties-file /path/to/configfile.config 

然後在scala程序訪問作爲

sc.getConf.get("spark.app.name")