2015-04-04 29 views
9

Tôi muốn để xác định tất cả các đặc tính của Spark trong một tập tin cấu hình, và sau đó tải tập tin cấu hình khi chạy.Xác định một tập tin cấu hình bên ngoài cho Apache Spark

~~~~~~~~~~ Sửa ~~~~~~~~~~~

Hóa ra tôi đã khá bối rối về cách đi về việc này. Bỏ qua phần còn lại của câu hỏi này. Để xem một giải pháp đơn giản (trong Java Spark) về cách tải một tệp .properties vào một cụm tia lửa, hãy xem câu trả lời của tôi bên dưới.

câu hỏi ban đầu dưới đây chỉ cho mục đích tham khảo.

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

Tôi muốn

  • file cấu hình khác nhau tùy thuộc vào môi trường (địa phương, AWS)
  • tôi muốn để xác định các thông số ứng dụng cụ thể

là một ví dụ đơn giản, chúng ta hãy tưởng tượng tôi muốn lọc dòng trong một tập tin đăng nhập tùy thuộc vào một chuỗi . Dưới đây tôi có một chương trình Java Spark đơn giản đọc dữ liệu từ một tệp và lọc nó tùy thuộc vào chuỗi mà người dùng xác định. Chương trình lấy một đối số, tệp nguồn đầu vào.

Java Spark Mã

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

Config file

tập tin cấu hình được dựa trên https://spark.apache.org/docs/1.3.0/configuration.html và có vẻ như:

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

Vấn đề

tôi thực hiện các ứng dụng sử dụng các đối số sau đây:

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

Tuy nhiên, điều này không làm việc, kể từ khi ngoại lệ

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

bị ném. Đối với tôi có nghĩa là tập tin cấu hình không được tải.

Câu hỏi của tôi là:

  1. Điều gì là sai với thiết lập của tôi?
  2. Xác định các thông số cụ thể của ứng dụng trong tập tin cấu hình tia lửa thực hành tốt?

Trả lời

7

Vì vậy, sau một chút thời gian, tôi nhận ra tôi đã khá bối rối. Cách dễ nhất để lấy tệp cấu hình vào bộ nhớ là sử dụng tệp thuộc tính tiêu chuẩn, đặt nó vào tệp hdfs và tải tệp đó từ đó. Đối với hồ sơ, đây là đoạn code để làm điều đó (trong Java Spark):

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

Nó không hiệu quả với tôi. Vẫn nhận được FileNotFoundException. – nish

+0

bạn có đang đặt tệp ở định dạng hdfs không? Bạn đang sử dụng aws? – Alexander

+0

Có, tôi đặt tệp ở định dạng hdfs. Có, tôi đang sử dụng aws EMR – nish

4
  1. --conf chỉ đặt một tài sản Spark duy nhất, nó không phải để đọc file.
    Ví dụ: --conf spark.shuffle.spill=false.
  2. Thông số ứng dụng không đi vào các giá trị mặc định, nhưng được chuyển thành chương trình args (và được đọc từ phương thức chính của bạn). spark-defaults nên chứa các thuộc tính SparkConf áp dụng cho hầu hết hoặc tất cả các công việc. Nếu bạn muốn sử dụng tệp cấu hình thay vì tham số ứng dụng, hãy xem Typesafe Config. Nó cũng hỗ trợ các biến môi trường.
3

FWIW, sử dụng thư viện typesafe Config, tôi chỉ xác nhận rằng công việc này trong ScalaTest:

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

Làm thế nào để bạn đề cập đến đường dẫn tệp thuộc tính? Nó tìm tập tin theo mặc định ở đâu? Điều gì sẽ xảy ra nếu nút chính và nút mà bạn chạy ứng dụng khác nhau? –

4

thử này

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

sau đó truy cập vào chương trình scala như

sc.getConf.get("spark.app.name") 
Các vấn đề liên quan