วิธีการทั้งหมดที่เก็บรวบรวมด้วยตัวอย่าง
Intro
อันที่จริงมีหลายวิธีที่จะทำมัน บางอย่างนั้นยากกว่าจากคนอื่น ๆ แต่ก็ขึ้นอยู่กับคุณว่าแบบไหนที่เหมาะกับคุณที่สุด ฉันจะพยายามแสดงให้พวกเขาทั้งหมด
# 1 โดยทางโปรแกรมในแอปของคุณ
ดูเหมือนจะง่ายที่สุด แต่คุณจะต้องคอมไพล์แอปใหม่เพื่อเปลี่ยนการตั้งค่าเหล่านั้น โดยส่วนตัวแล้วฉันไม่ชอบ แต่มันก็ใช้ได้ดี
ตัวอย่าง:
import org.apache.log4j.{Level, Logger}
val rootLogger = Logger.getRootLogger()
rootLogger.setLevel(Level.ERROR)
Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
Logger.getLogger("org.spark-project").setLevel(Level.WARN)
คุณสามารถทำได้มากขึ้นเพียงแค่ใช้log4j
API
ที่มา: [ เอกสารการกำหนดค่า Log4J , ส่วนการกำหนดค่า]
# 2 ผ่านlog4j.properties
ระหว่างspark-submit
อันนี้ยากมาก แต่ก็เป็นไปไม่ได้ และสิ่งที่ฉันโปรดปราน
Log4J ระหว่างการเริ่มต้นแอปมักจะมองหาและโหลดlog4j.properties
ไฟล์จาก classpath
อย่างไรก็ตามเมื่อใช้spark-submit
classpath ของ Spark Cluster มีความสำคัญเหนือกว่า classpath ของแอพ! นี่คือเหตุผลที่การวางไฟล์นี้ลงในขวดโหลของคุณจะไม่แทนที่การตั้งค่าของกลุ่ม!
เพิ่ม-Dlog4j.configuration=<location of configuration file>
ไปยัง
spark.driver.extraJavaOptions
(สำหรับไดรเวอร์)หรือ
spark.executor.extraJavaOptions
(สำหรับผู้บริหาร) (สำหรับผู้จัดการ)
โปรดทราบว่าถ้าใช้ไฟล์ที่file:
โปรโตคอลควรจะให้อย่างชัดเจนและไฟล์ความต้องการที่จะอยู่ภายในโหนดทั้งหมด
เพื่อตอบสนองเงื่อนไขสุดท้ายคุณสามารถอัปโหลดไฟล์ไปยังสถานที่ที่มีอยู่สำหรับโหนด (ชอบhdfs
) deploy-mode client
หรือการเข้าถึงในท้องถิ่นกับคนขับรถถ้าใช้ มิฉะนั้น:
อัปโหลดกำหนดเองlog4j.properties
โดยใช้ spark-submit โดยเพิ่มลงใน--files
รายการไฟล์ที่จะอัปโหลดด้วยแอปพลิเคชัน
ที่มา: Spark docs, Debugging
ขั้นตอน:
ตัวอย่างlog4j.properties
:
# Blacklist all to warn level
log4j.rootCategory=WARN, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n
# Whitelist our app to info :)
log4j.logger.com.github.atais=INFO
การดำเนินการspark-submit
สำหรับโหมดคลัสเตอร์:
spark-submit \
--master yarn \
--deploy-mode cluster \
--conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" \
--conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" \
--files "/absolute/path/to/your/log4j.properties" \
--class com.github.atais.Main \
"SparkApp.jar"
โปรดทราบว่าคุณต้องใช้--driver-java-options
หากใช้client
โหมด Spark docs, Runtime env
กำลังดำเนินการspark-submit
สำหรับโหมดไคลเอนต์:
spark-submit \
--master yarn \
--deploy-mode client \
--driver-java-options "-Dlog4j.configuration=file:/absolute/path/to/your/log4j.properties \
--conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" \
--files "/absolute/path/to/your/log4j.properties" \
--class com.github.atais.Main \
"SparkApp.jar"
หมายเหตุ:
- ไฟล์ที่อัพโหลดไป
spark-cluster
ด้วย--files
จะมีให้ที่ root dir ดังนั้นจึงไม่จำเป็นต้องเพิ่มเส้นทางใด ๆfile:log4j.properties
ใน
- ไฟล์ที่ระบุในนั้น
--files
จะต้องมีเส้นทางที่แน่นอน!
file:
คำนำหน้าในการกำหนดค่า URI จำเป็นต้องมี
# 3 แก้ไขของคลัสเตอร์ conf/log4j.properties
นี้จะเปลี่ยนการตั้งค่าไฟล์เข้าสู่ระบบทั่วโลก
อัปเดต$SPARK_CONF_DIR/log4j.properties
ไฟล์และมันจะถูกอัปโหลดโดยอัตโนมัติพร้อมกับการกำหนดค่าอื่น ๆ
ที่มา: Spark docs, Debugging
ในการค้นหาของSPARK_CONF_DIR
คุณคุณสามารถใช้spark-shell
:
atais@cluster:~$ spark-shell
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.1.1
/_/
scala> System.getenv("SPARK_CONF_DIR")
res0: String = /var/lib/spark/latest/conf
ตอนนี้เพียงแก้ไข/var/lib/spark/latest/conf/log4j.properties
(ด้วยตัวอย่างจากวิธีที่ # 2) และแอปทั้งหมดของคุณจะแชร์การกำหนดค่านี้
# 4 แทนที่ไดเรกทอรีการกำหนดค่า
ถ้าคุณชอบวิธีการแก้ # 3 แต่ต้องการที่จะกำหนดมันต่อการประยุกต์ใช้จริงคุณสามารถคัดลอกโฟลเดอร์แก้ไขเนื้อหาและระบุการกำหนดค่ารากในช่วงconf
spark-submit
หากต้องการระบุไดเรกทอรีการกำหนดค่าอื่นนอกเหนือจากค่าเริ่มต้น“SPARK_HOME/conf”
คุณสามารถตั้งค่าSPARK_CONF_DIR
ได้ Spark จะใช้การตั้งค่าไฟล์ ( spark-defaults.conf
, spark-env.sh
, log4j.properties
, ฯลฯ ) จากไดเรกทอรีนี้
ที่มา: Spark docs, Configuration
ขั้นตอน:
- คัดลอก
conf
โฟลเดอร์ของคลัสเตอร์(ข้อมูลเพิ่มเติมวิธี # 3)
- แก้ไข
log4j.properties
ในโฟลเดอร์นั้น (ตัวอย่างในวิธีที่ # 2)
ตั้งค่าSPARK_CONF_DIR
ไปยังโฟลเดอร์นี้ก่อนที่จะดำเนินการspark-submit
,
ตัวอย่างเช่น:
export SPARK_CONF_DIR=/absolute/path/to/custom/conf
spark-submit \
--master yarn \
--deploy-mode cluster \
--class com.github.atais.Main \
"SparkApp.jar"
ข้อสรุป
ฉันไม่แน่ใจว่ามีวิธีอื่นหรือไม่ แต่ฉันหวังว่านี่จะครอบคลุมหัวข้อจาก A ถึง Z หากไม่รู้สึกลังเลที่จะ ping ฉันในความคิดเห็น!
สนุกกับวิธีของคุณ!