Làm thế nào để truyền tham số -D hoặc biến môi trường cho công việc Spark?


83

Tôi muốn thay đổi cấu hình Typeafe của công việc Spark trong môi trường dev / prod. Đối với tôi, dường như cách dễ nhất để đạt được điều này là vượt qua -Dconfig.resource=ENVNAMEcông việc. Sau đó, thư viện cấu hình Typeafe sẽ thực hiện công việc cho tôi.

Có cách nào để chuyển tùy chọn đó trực tiếp vào công việc không? Hoặc có thể có cách tốt hơn để thay đổi cấu hình công việc trong thời gian chạy?

BIÊN TẬP:

  • Không có gì xảy ra khi tôi thêm --conf "spark.executor.extraJavaOptions=-Dconfig.resource=dev"tùy chọn vào lệnh spark-submit .
  • Tôi nhận được Error: Unrecognized option '-Dconfig.resource=dev'.khi tôi chuyển -Dconfig.resource=devđến lệnh spark-submit .

1
Vui lòng nêu rõ bạn đang bắt đầu công việc của mình như thế nào. Nói chung, bạn có thể chỉ cần dính -Dx=yvào dòng lệnh.
Daniel Darabos

@DanielDarabos Tôi bắt đầu công việc của mình với spark-submit trên YARN.
kopiczko

@kopiczko Bạn có thể chấp nhận câu trả lời không?
Don Branson

@DonBranson Tôi đã thử tất cả các câu trả lời ở đây và không có câu trả lời nào phù hợp với tôi trên spark 1.6.0! Tôi có vấn đề chính xác này. Tôi dường như không thể ghi đè thuộc tính cấu hình trong tệp cấu hình An toàn loại của mình thông qua tham số -D.
nemo

@kopiczko Bạn đã tìm ra giải pháp chưa?
nemo

Câu trả lời:


58

Thay đổi spark-submitdòng lệnh thêm ba tùy chọn:

  • --files <location_to_your_app.conf>
  • --conf 'spark.executor.extraJavaOptions=-Dconfig.resource=app'
  • --conf 'spark.driver.extraJavaOptions=-Dconfig.resource=app'

19
Lưu ý rằng việc sử dụng --conf 'spark.executor.extraJavaOptions=-Dconfig.resource=app'tùy chọn sẽ không hoạt động khi tia lửa gửi trình điều khiển ở chế độ máy khách. Sử dụng --driver-java-options "-Dconfig.resource=app"thay thế. Xem Cấu hình Spark .
YoYo

2
Trên Yarn tôi đã sử dụng: --files <location_to_your.conf>#application.conf --driver-java-options -Dconfig.file=your.conf Tệp #in cung cấp tên liên quan đến các trình thực thi; vì vậy họ sẽ thấy tệp được chỉ định là application.conf.
vpipkt

Ngoài raspark-submit --driver-java-options='-Dmy.config.path=myConfigValue'
Jean-Adrien

@kopiczko Điều này không phù hợp với tôi ... điều này có giải quyết được vấn đề của bạn không?
nemo

Nó đã hoạt động cho tôi vào năm 2015. ATM Tôi thậm chí không thể biết nó là phiên bản Spark nào.
kopiczko

21

Đây là chương trình tia lửa của tôi chạy với tùy chọn java bổ sung

/home/spark/spark-1.6.1-bin-hadoop2.6/bin/spark-submit \
--files /home/spark/jobs/fact_stats_ad.conf \
--conf spark.executor.extraJavaOptions=-Dconfig.fuction.conf \
--conf 'spark.driver.extraJavaOptions=-Dalluxio.user.file.writetype.default=CACHE_THROUGH -Dalluxio.user.file.write.location.policy.class=alluxio.client.file.policy.MostAvailableFirstPolicy -Dconfig.file=/home/spark/jobs/fact_stats_ad.conf' \
--class jobs.DiskDailyJob \
--packages com.databricks:spark-csv_2.10:1.4.0 \
--jars /home/spark/jobs/alluxio-core-client-1.2.0-RC2-jar-with-dependencies.jar \
--driver-memory 2g \
/home/spark/jobs/convert_to_parquet.jar \
AD_COOKIE_REPORT FACT_AD_STATS_DAILY | tee /data/fact_ad_stats_daily.log

như bạn có thể thấy tệp cấu hình tùy chỉnh --files /home/spark/jobs/fact_stats_ad.conf

các tùy chọn java thực thi --conf spark.executor.extraJavaOptions=-Dconfig.fuction.conf

các tùy chọn java trình điều khiển. --conf 'spark.driver.extraJavaOptions=-Dalluxio.user.file.writetype.default=CACHE_THROUGH -Dalluxio.user.file.write.location.policy.class=alluxio.client.file.policy.MostAvailableFirstPolicy -Dconfig.file=/home/spark/jobs/fact_stats_ad.conf'

Hy vọng nó có thể giúp.


Câu trả lời này giúp hiển thị định dạng để chuyển nhiều tùy chọn dưới dạng danh sách các cặp -Dkey = value được phân tách bằng dấu cách.
Paul

9

Tôi đã gặp rất nhiều vấn đề với việc truyền tham số -D cho trình thực thi và trình điều khiển, tôi đã thêm một trích dẫn từ bài đăng trên blog của mình về điều đó: "Cách phù hợp để truyền tham số là thông qua thuộc tính:“ spark.driver.extraJavaOptions”và“ spark.executor.extraJavaOptions”: Tôi đã chuyển cả thuộc tính cấu hình log4J và tham số mà tôi cần cho các cấu hình. (Đối với Trình điều khiển, tôi chỉ có thể truyền cấu hình log4j). Ví dụ (được viết trong tệp thuộc tính được chuyển trong spark-submit với “- thuộc tính-tệp ”):“

spark.driver.extraJavaOptions –Dlog4j.configuration=file:///spark/conf/log4j.properties -
spark.executor.extraJavaOptions –Dlog4j.configuration=file:///spark/conf/log4j.properties -Dapplication.properties.file=hdfs:///some/path/on/hdfs/app.properties
spark.application.properties.file hdfs:///some/path/on/hdfs/app.properties

Bạn có thể đọc bài đăng trên blog của tôi về các cấu hình tổng thể của tia lửa. Tôi cũng đang chạy trên Yarn.


Vui lòng thêm một số nội dung vào nó và tránh câu trả lời chỉ liên kết.
Ajay Gupta

7

--files <location_to_your_app.conf> --conf 'spark.executor.extraJavaOptions=-Dconfig.resource=app' --conf 'spark.driver.extraJavaOptions=-Dconfig.resource=app'

Nếu bạn viết theo cách này, cái sau --confsẽ ghi đè cái trước, bạn có thể xác minh điều này bằng cách xem sparkUI sau khi công việc bắt đầu trong Environmenttab.

vì vậy cách chính xác là đặt các tùy chọn dưới cùng một dòng như thế này: --conf 'spark.executor.extraJavaOptions=-Da=b -Dc=d' nếu bạn làm điều này, bạn có thể thấy tất cả cài đặt của mình sẽ được hiển thị dưới sparkUI.


Tôi không tin rằng điều này đúng với cờ "--conf", mặc dù nó đúng với "--files".
Penumbra

Tôi đã thử nghiệm trên 2.1.0 và 2.1.1. theo sparkUI-> Environment, tôi chỉ thấy cái sau nếu chúng ta sử dụng --confhai lần.
linehrr

1
Tôi nghĩ rằng ví dụ của bạn là thiếu sót. Bạn đang hiển thị hai khóa / giá trị riêng biệt và hoàn toàn khác nhau sau cờ "--conf" (một trình thực thi, một trình điều khiển). Chúng không thể ghi đè lên nhau. Nếu bạn đang nói rằng chỉ sự lặp lại cuối cùng của bất kỳ tùy chọn --conf nào mới có hiệu lực, bạn đã đúng nhưng ví dụ của bạn không cho thấy điều đó. Trong spark-submit: - Bạn có thể có một tùy chọn --files, tùy chọn cuối cùng trong số đó (nếu nhiều) sẽ được sử dụng và tùy chọn trước đó bị bỏ qua - Bạn có thể có nhiều tùy chọn --conf key = value, nhưng nếu bạn sao chép một khóa nó sẽ nhận giá trị cuối cùng
Penumbra

3

Tôi đang khởi động ứng dụng Spark của mình thông qua lệnh spark-submit được khởi chạy từ bên trong một ứng dụng Scala khác. Vì vậy, tôi có một Mảng như

Array(".../spark-submit", ..., "--conf", confValues, ...)

ở đâu confValues:

  • cho yarn-clusterchế độ:
    "spark.driver.extraJavaOptions=-Drun.mode=production -Dapp.param=..."
  • cho local[*]chế độ:
    "run.mode=development"

Tuy nhiên, sẽ hơi khó hiểu khi (không) thoát khỏi dấu ngoặc kép và dấu cách. Bạn có thể kiểm tra giao diện web Spark để biết các giá trị thuộc tính hệ thống.


Điều này đã làm việc cho tôi! (ít nhất là đối với local[*]chế độ). Tôi sẽ thử với yarn-clusterchế độ và cập nhật nhận xét (nếu tôi không quên ..: D)
acidghost

3
spark-submit --driver-java-options "-Denv=DEV -Dmode=local" --class co.xxx.datapipeline.jobs.EventlogAggregator target/datapipeline-jobs-1.0-SNAPSHOT.jar

Lệnh trên phù hợp với tôi:

-Denv=DEV=> để đọc tệp thuộc tính DEV env và
-Dmode=local=> để tạo SparkContext trong local - .setMaster ("local [*]")


0

Sử dụng phương pháp như trong lệnh dưới đây, có thể hữu ích cho bạn -

spark-submit --master local [2] --conf 'spark.driver.extraJavaOptions = Dlog4j.configuration = file: /tmp/log4j.properties' --conf 'spark.executor.extraJavaOptions = -Dlog4j.configuration = file: /tmp/log4j.properties ' --class com.test.spark.application.TestSparkJob target / application-0.0.1-SNAPSHOT-jar-with-dependencies.jar prod

Tôi đã thử và nó hiệu quả với tôi, tôi cũng khuyên bạn nên xem qua tiêu đề bên dưới bài đăng spark thực sự hữu ích - https://spark.apache.org/docs/latest/running-on-yarn.html


0

Tôi ban đầu có tệp cấu hình này:

my-app {
  environment: dev
  other: xxx
}

Đây là cách tôi đang tải cấu hình của mình trong mã scala tia lửa:

val config = ConfigFactory.parseFile(File<"my-app.conf">)
  .withFallback(ConfigFactory.load())
  .resolve
  .getConfig("my-app")

Với thiết lập này, bất chấp tài liệu Cấu hình an toàn loại và tất cả các câu trả lời khác nói gì, tính năng ghi đè thuộc tính hệ thống không hoạt động với tôi khi tôi khởi chạy công việc spark của mình như vậy:

spark-submit \
  --master yarn \
  --deploy-mode cluster \
  --name my-app \
  --driver-java-options='-XX:MaxPermSize=256M -Dmy-app.environment=prod' \
  --files my-app.conf \
  my-app.jar

Để nó hoạt động, tôi phải thay đổi tệp cấu hình của mình thành:

my-app {
  environment: dev
  environment: ${?env.override}
  other: xxx
}

và sau đó khởi chạy nó như vậy:

spark-submit \
  --master yarn \
  --deploy-mode cluster \
  --name my-app \
  --driver-java-options='-XX:MaxPermSize=256M -Denv.override=prod' \
  --files my-app.conf \
  my-app.jar

Tôi đang chạy spark 1.6.0 BTW
nemo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.