วิธีการทั้งหมดที่เก็บรวบรวมด้วยตัวอย่าง
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)
คุณสามารถทำได้มากขึ้นเพียงแค่ใช้log4jAPI
ที่มา: [ เอกสารการกำหนดค่า Log4J , ส่วนการกำหนดค่า]
# 2 ผ่านlog4j.propertiesระหว่างspark-submit
อันนี้ยากมาก แต่ก็เป็นไปไม่ได้ และสิ่งที่ฉันโปรดปราน
Log4J ระหว่างการเริ่มต้นแอปมักจะมองหาและโหลดlog4j.propertiesไฟล์จาก classpath
อย่างไรก็ตามเมื่อใช้spark-submitclasspath ของ 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 แต่ต้องการที่จะกำหนดมันต่อการประยุกต์ใช้จริงคุณสามารถคัดลอกโฟลเดอร์แก้ไขเนื้อหาและระบุการกำหนดค่ารากในช่วงconfspark-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 ฉันในความคิดเห็น!
สนุกกับวิธีของคุณ!