مقدمة
مع وجود المزيد والمزيد من أنظمة الأعمال الداخلية في الخدمات المستندة إلى المؤسسة و JVM ، قد يكون هناك مجموعات متعددة من JDKs تدير خدمات مختلفة في البيئة عبر الإنترنت. يعلم الجميع أن الخدمات المكتوبة استنادًا إلى الإصدار الأعلى من مواصفات Java ستظهر في الإصدار السفلي من JVM: java.lang.UnsupportedClassVersionError استثناء.
بدأت Spark 2.2 في إزالة دعم Java 7. في معظم الحالات ، يكون تطبيق Spark الخاص بنا عبارة عن JDK مشتركة مع نظام Hadoop. إذا كان الإصدار 7 JDK الذي يعتمد عليه 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 Launcher.
إصدار JDK من جانب السائق هو نفس متغير بيئة Spark_Home في الجهاز الذي يوجد فيه مُقالة الشرارة ، ويمكن تحديده مباشرة في 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-x64.tar.gz "Spark.yarn.appmasterenv.java_home =.
يمكننا توزيع حزمة تثبيت JDK على دليل العمل لجميع المنفذين (بما في ذلك Application Master's Executor) من خلال تحديد تكوين spark.yarn.dist.archives . بالإضافة إلى ذلك ، سيتم إلغاء ضغط حزمة Tar.GZ المضغوط تلقائيًا. على افتراض أن الدليل المضغوط لـ JDK-8U141-Linux-X64.Tar.GZ هو JDK1.8.0_141 ، ثم دليل JDK الخاص بنا هو:.
ملاحظة: نظرًا لأن Spark Standalone لا يوفر وظيفة توزيع حزم تثبيت JDK وإزالة الضغط تلقائيًا ، لا يمكن استخدام هذه الطريقة إلا تحت الغزل.
يؤكد
من خلال ps -ef grep ، يمكنك أن ترى أن مسار بدء تشغيل Java تم تكوينه بنجاح لـ Java في دليل JDK الخاص بنا.
فيما يلي معلومات بدء تشغيل العملية لـ Executor I حدد إصدار JDK في وضع الغزل:
ستان 590751 590745 0 20:45؟ 00:00:14. -xx: itingheapoccupancypercent = 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_000004/tmp -dspark.orter -dspark.yarn.app.container.log.dir =/home/stan // hadoop-2.6.4/logs/userlogs/application_1508397483453_0095/container_1508397483453_0095_01_000004 -xx: onOutoToFMERROR = KILL org.apache.spark.executor.coarsegrainedexecutorbackend-Driver-url Spark: //[email protected]: 52986-executor-id 3-hostname stan-cores 1-app-id application_1508397483453_0095- ملف:/home/stan/tmp/hadoop-stan/nm-local-dir/usercache/stan/appcache/application_1508397483453_0095/container_1508397483453_0095_01_000004/__ __
المرفق: حل للخطأ غير المتوافق لإصدار وقت تشغيل تطبيق Spark
17/06/27 14:34:41 إهمال المعلومات: mapred.map.tasks تم إهمالها. بدلاً من ذلك ، استخدم mapreduce.job.maps 17/06/27 14:34:41 Info MemoryStore: block broadcast_0 مخزنة كقيم في الذاكرة (المقدرة المقدرة 788.8 كيلو بايت ، 1246.5 ميغابايت مجانًا) 17/06/27 14:34:41 info memorystor 17/06/27 14:34:41 Info blockmanagerinfo: أضيفت Broadcast_0_piece0 في الذاكرة في 10.50.70.121:37335 (الحجم: 54.0 كيلو بايت ، مجاني: 1247.2 ميغابايت) 17/06/27 14:34:41 معلومات: تم إنشاؤها بُعد 0. java.lang.nosuchmethoderror: scala.reflect.api.javauniverse.runtimemirror (ljava/lang/classloader ؛) lscala/appi/api/javauniverse $ javamirror ؛ في com.fangdd.data.profile.outlier.tradeinfooutlier $ .main (tradeinfooutlier.scala: 30) في com.fangdd.data.profile.outlier.tradeinfooutlier Sun.Reflect.NativeMethodAccessorImpl.Invoke (NativeMethodAccessorImpl.Java:62) في Sun.Reflect.DelegatingMethodAccessorImpl.invoke (DevingMethodAccessorImpl.java:43) org.apache.spark.deploy.sparksubmit $ .org $ Apache $ Spark $ Deploy $ sparksubmit $$ RunMain (sparksubmit.scala: 745) at org.apache.spark.deploy.sparksubmit $ .dorunmain $ 1 (sparksubmit.scala: 181) at org.apache.spark.deploy.sparksubmit $ .Submit (Sparksubmit.scala: 206) at org.apache.spark.deploy.sparksubmit $ .main (sparksubmit.scala: 121) at org.spark.spark.deploy.splaks.main. 14:34:42 Info SparkContext: استدعاء Stop () من خطاف الإغلاق
هذا الخطأ يرجع إلى أن بيئة الإنتاج تستخدم بيئة تشغيل Scala 2.10 + Spark1.6.3 ، وتستخدم جرة التطبيق المحلية بيئة تجميع Scala 2.11 + Spark.1.6.3. لذلك ، تم الإبلاغ عن الخطأ أعلاه في مجموعة بيئة الإنتاج. بعد تغيير إصدار Scala وإعادة إشراك حزمة JAR ، تم الإبلاغ عن الخطأ أعلاه.
لخص
ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون لمحتوى هذه المقالة قيمة مرجعية معينة لدراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل. شكرا لك على دعمك إلى wulin.com.