คำนำ
ด้วยระบบธุรกิจภายในมากขึ้นในบริการที่ใช้ Enterprise และ JVM อาจมี JDK หลายชุดที่ให้บริการที่แตกต่างกันในสภาพแวดล้อมออนไลน์ ทุกคนรู้ว่าบริการที่เขียนขึ้นตามข้อกำหนด Java เวอร์ชันที่สูงขึ้นจะปรากฏขึ้นในรุ่นล่างของ JVM: java.lang.UnsupportedClassVersionError ยกเว้น
Spark 2.2 ได้เริ่มลบการสนับสนุนสำหรับ Java 7 ในกรณีส่วนใหญ่แอปพลิเคชัน Spark ของเราคือ JDK ที่ใช้ร่วมกับระบบ Hadoop หาก JDK เวอร์ชัน 7 ที่ Hadoop ขึ้นอยู่กับคือ 7 แล้วจะมีปัญหากับแอปพลิเคชันที่เขียนขึ้นอยู่กับ JDK 8
บทความนี้ส่วนใหญ่แนะนำวิธีการระบุเวอร์ชัน JDK ที่แตกต่างกันสำหรับแอปพลิเคชัน Spark ในสถานการณ์ต่าง ๆ
คลัสเตอร์ได้ปรับใช้เวอร์ชัน JDK ที่ระบุ
สมมติว่าเส้นทางการปรับใช้ของ JDK สำหรับแต่ละโหนดในคลัสเตอร์คือ: /usr/java/jdk1.8
Spark ให้ spark.executorEnv.[EnvironmentVariableName] การกำหนดค่าซึ่งสามารถใช้เพื่อเพิ่มตัวแปรสภาพแวดล้อมในกระบวนการของผู้บริหาร หากตัวจัดการคลัสเตอร์ที่ใช้โดยแอปพลิเคชัน Spark เป็นแบบสแตนด์อโลนคุณจะต้องกำหนดเส้นทาง JDK ของฝ่ายบริหารผ่าน spark.executorEnv.JAVA_HOME ดังนี้:
$ spark_home/bin/spark-submit/--conf "Spark.executorenv.java_home =/usr/java/jdk1.8"/...
ในโหมดเส้นด้ายคุณต้องระบุตัวแปรสภาพแวดล้อม Java_home ที่แตกต่างกันสำหรับแอปพลิเคชันมาสเตอร์ดังนี้:
$ spark_home/bin/spark-submit/--conf "Spark.executorenv.java_home =/usr/java/jdk1.8"/--conf "Spark.yarn.appmasterenv.java_home =/usr/java/jdk1.8"/...
เมื่อปรับใช้กับเส้นด้ายในโหมดคลัสเตอร์ spark.yarn.appMasterEnv.JAVA_HOME เทียบเท่ากับการตั้งค่า JDK เฉพาะสำหรับไดรเวอร์ของแอปพลิเคชัน Spark;
เมื่อปรับใช้ในโหมดไคลเอนต์ spark.yarn.appMasterEnv.JAVA_HOME เพียงแค่ตั้งค่ารุ่น JDK เฉพาะสำหรับตัวเรียกใช้งาน Executor
รุ่นไดรเวอร์ของ JDK นั้นเหมือนกับตัวแปรสภาพแวดล้อมของ Spark_home ในเครื่องที่มีจุดประกาย submit และสามารถระบุได้โดยตรงใน Spark-Env.sh
คลัสเตอร์ไม่มีเวอร์ชัน JDK ที่เฉพาะเจาะจงและไม่มีสิทธิ์ในการดูแลระบบในคลัสเตอร์
ในสถานการณ์พิเศษบางอย่างเราไม่มีสิทธิ์การจัดการสำหรับคลัสเตอร์และสามารถส่งแอปพลิเคชันผ่านเส้นด้ายและเวอร์ชัน JDK ที่เราต้องการไม่ได้ถูกนำไปใช้ในคลัสเตอร์ ในกรณีนี้เราต้องส่งแพ็คเกจการติดตั้ง JDK เข้าด้วยกัน
ที่นี่เราต้องการให้แพ็คเกจการติดตั้ง JDK ของเราต้องอยู่ในรูปแบบ GZ และถูกวางไว้ในไดเรกทอรีเดียวกับแพ็คเกจ JAR หลังจากแพ็ครหัสของคุณ สมมติว่าแพ็คเกจการติดตั้ง JDK ที่เราดาวน์โหลดคือ: JDK-8U141-LINUX-X64.tar.gz
关键配置如下:
$ spark_home/bin/spark-submit/--conf "Spark.yarn.dist.archives = jdk-8u141-linux-x64.tar.gz"/--conf "spark.executorenv.java_home =./jdk-8u141-linux-x --conf "Spark.yarn.appmasterenv.java_home =./jdk-8u141-linux-x64.tar.gz/jdk1.8.0_141"/...
เราสามารถแจกจ่ายแพ็คเกจการติดตั้ง JDK ไปยังไดเรกทอรีการทำงานของผู้บริหารทั้งหมด (รวมถึงผู้ดำเนินการของ Application Master) โดยการระบุการกำหนดค่า spark.yarn.dist.archives นอกจากนี้แพ็คเกจบีบอัด TAR.GZ จะถูกบีบอัดโดยอัตโนมัติ สมมติว่าไดเรกทอรีที่บีบอัดของ JDK-8U141-linux-x64.tar.gz คือ JDK1.8.0_141 จากนั้นไดเรกทอรีของ JDK เฉพาะของเราคือ: ./jdk-8u141-linux-x64.tar.gz/jdk1.8.8.0_141
หมายเหตุ: เนื่องจาก Spark Standalone ไม่ได้ให้ฟังก์ชั่นของการแจกจ่ายแพ็คเกจการติดตั้ง JDK และคลายการบีบอัดโดยอัตโนมัติวิธีนี้สามารถใช้ภายใต้เส้นด้ายเท่านั้น
ตรวจสอบ
ผ่าน PS -EF GREP คุณจะเห็นว่าเส้นทางการเริ่มต้น Java ได้รับการกำหนดค่าให้สำเร็จสำหรับ Java ในไดเรกทอรี JDK เฉพาะของเรา
ต่อไปนี้เป็นข้อมูลการเริ่มต้นกระบวนการสำหรับผู้ดำเนินการฉันระบุเวอร์ชัน JDK ในโหมดเส้นด้าย:
Stan 590751 590745 0 20:45? 00:00:14 ./jdk-8u141-linux-x64.tar.gz/jdk1.8.0_141/bin/java -server -xmx512m -xx:+useg1gc -xx:+unlockdiagnosticvmoptions -xx -xx: itiatientHeapocCupancypercent = 35 -xx: permsize = 256m -xx:+printgcdetails -xx:+printgcdatestamps -xloggc: ./ gc.log -verbose: gc -djava.io.tmpdir =/home/stan/tmp/hadoop-stan/nm-local-dir/usercache/stan/appcache/application_1508397483453_0095/container_1508397483453_0095_01_000004/TMP -DSPARK.YARN.APP.CONTAINER.LOG.DIR =/home/stan // hadoop-2.6.4/logs/userlogs/application_1508397483453_0095/container_1508397483453_0095_01_000004 -xx org.apache.spark.executor.coarsegrainedExecutorbackend-driver-url Spark: //[email protected]: 52986-Executor-id 3-Hostname Stan--Cores 1 ไฟล์:/home/stan/tmp/hadoop-stan/nm-local-dir/usercache/stan/appcache/application_1508397483453_0095/container_1508397483453_0095_01_000004/__ แอพ __
เอกสารแนบ: การแก้ปัญหาข้อผิดพลาดที่เข้ากันไม่ได้ของ Spark Application Runtime เวอร์ชัน
17/06/27 14:34:41 การคัดค้านข้อมูล: mapred.map.tasks เลิกใช้แล้ว ใช้ mapreduce.job.maps 17/06/27 14:34:41 ข้อมูลหน่วยความจำสโตร์: บล็อก Broadcast_0 ที่เก็บไว้เป็นค่าในหน่วยความจำ (ขนาดประมาณ 788.8 kb ฟรี 1246.5 MB) 17/06/27 14:34:41 ข้อมูลหน่วยความจำ MB) 17/06/27 14:34:41 ข้อมูล BlockManagerInfo: เพิ่ม Broadcast_0_Piece0 ในหน่วยความจำที่ 10.50.70.121:37335 (ขนาด: 54.0 kb, ฟรี: 1247.2 MB) 17/06/27 14:341 "Main" java.lang.nosuchmethoderror: scala.reflect.api.javauniverse.runtimemirror (ljava/lang/classloader;) lscala/revel/api/javauniverse $ javamirror; ที่ com.fangdd.data.profile.outlier.tradeinfooutlier $ .main (TradeInfooutlier.scala: 30) ที่ com.fangdd.data.profile.outlier.tradeinfooutlier.main sun.reflect.nativemethodaccessorimpl.invoke (nativemethodaccessorimpl.java:62) ที่ sun.reflect.delegatingmethodaccessorimpl.invoke (มอบหมาย Methodaccessorimpl.java:43) org.apache.spark.deploy.sparksubmit $ .org $ apache $ spark $ ปรับใช้ $ sparksubmit $$ runmain (sparksubmit.scala: 745) ที่ org.apache.spark.deploy.sparksubmit $ .dorunmain $ 1 org.apache.spark.deploy.sparksubmit $ .submit (sparksubmit.scala: 206) ที่ org.apache.spark.deploy.sparksubmit $ .main (sparksubmit.scala: 121) ที่ org.apache.spache.deplult.sparks 17/06/27 14:34:42 Info SparkContext: การเรียกใช้หยุด () จากการปิดเบ็ด
ข้อผิดพลาดนี้เป็นเพราะสภาพแวดล้อมการผลิตใช้สภาพแวดล้อมการทำงานของ Scala 2.10 + Spark1.6.3 และ Jar แอปพลิเคชันท้องถิ่นใช้สภาพแวดล้อมการรวบรวมของ Scala 2.11 + Spark.1.6.3 ดังนั้นจึงมีการรายงานข้อผิดพลาดข้างต้นในคลัสเตอร์สภาพแวดล้อมการผลิต หลังจากเปลี่ยนเวอร์ชัน Scala และมีส่วนร่วมในแพ็คเกจ JAR อีกครั้งจะมีการรายงานข้อผิดพลาดด้านบน
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะมีค่าอ้างอิงบางอย่างสำหรับการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com