一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 如何為Spark Application指定不同的JDK版本詳解

如何為Spark Application指定不同的JDK版本詳解

2021-02-23 11:17StanZhai Java教程

這篇文章主要給大家介紹了關于如何為Spark Application指定不同的JDK版本的相關資料,文中通過示例代碼將解決的方法介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友下面來隨著小編一起學習學習吧。

前言

隨著企業內部業務系統越來越多,基于JVM的服務,通常情況線上環境可能會有多套JDK跑不同的服務。大家都知道基于高版本的Java規范編寫的服務跑在低版本的JVM上會出現:java.lang.UnsupportedClassVersionError的異常。

Spark 2.2開始移除了對Java 7的支持,大多數情況下,我們的Spark Application是和Hadoop系統公用的JDK,如果Hadoop依賴的JDK版本是7,那我們基于JDK 8編寫的Application跑在上面就會出問題。

該文主要介紹在不同的場景下,如何為Spark Application指定不同的JDK版本。

集群已部署了指定的JDK版本

假設集群中每個節點JDK的部署路徑為:/usr/java/jdk1.8

Spark提供了spark.executorEnv.[EnvironmentVariableName]配置,可以用來給Executor進程添加環境變量,如果Spark Application使用的集群管理器是Standalone,只需要通過spark.executorEnv.JAVA_HOME制定Executor端的jdk路徑即可,如下:

?
1
2
3
$SPARK_HOME/bin/spark-submit \
 --conf "spark.executorEnv.JAVA_HOME=/usr/java/jdk1.8" \
 ...

在YARN模式下,還需要為Application Master指定不同的JAVA_HOME環境變量,如下:

?
1
2
3
4
$SPARK_HOME/bin/spark-submit \
 --conf "spark.executorEnv.JAVA_HOME=/usr/java/jdk1.8" \
 --conf "spark.yarn.appMasterEnv.JAVA_HOME=/usr/java/jdk1.8" \
 ...

以cluster的方式部署在YARN上的時候,spark.yarn.appMasterEnv.JAVA_HOME相當于為Spark Application的Driver設置了特定的JDK版本;

以client的模式部署時,spark.yarn.appMasterEnv.JAVA_HOME僅僅是為Executor Launcher設置了特定的JDK版本。

Driver端的JDK版本和spark-submit所在的機器中的SPARK_HOME環境變量一致,直接在spark-env.sh中指定即可。

集群缺失特定的JDK版本,且對集群無管理權限

某些特殊的場景下,我們對集群沒有管理權限,只能通過YARN提交Application,并且集群里沒有部署我們需要的JDK版本,這種情形就需要將JDK的安裝包也一并提交了。

這里要求我們的JDK安裝包必須為gz格式的,和你代碼打包后的jar包放在同一目錄下,假設我們下載的JDK的安裝包為:jdk-8u141-linux-x64.tar.gz。

關鍵配置如下:

?
1
2
3
4
5
$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/jdk1.8.0_141" \
 --conf "spark.yarn.appMasterEnv.JAVA_HOME=./jdk-8u141-linux-x64.tar.gz/jdk1.8.0_141" \
 ...

我們可以通過指定spark.yarn.dist.archives配置,將JDK的安裝包分發到所有Executor的工作目錄下(包括Application Master的Executor),另外tar.gz的壓縮包也會被自動解壓,假設jdk-8u141-linux-x64.tar.gz解壓后的目錄為jdk1.8.0_141,那么我們特定的JDK的目錄就是:./jdk-8u141-linux-x64.tar.gz/jdk1.8.0_141,不同的JDK版本以此類推即可。

注意:由于Spark Standalone沒有提供分發JDK安裝包并自動解壓的功能,所以,這種方式只能用在YARN下。

驗證

通過ps -ef grep查詢相關進程信息,可以看到java的啟動路徑為我們特定JDK目錄的java表示配置成功。

如下是我在YARN模式下,單獨指定JDK版本的Executor的進程啟動信息:

?
1
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:+G1SummarizeConcMark -XX:InitiatingHeapOccupancyPercent=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.driver.port=52986 -Dspark.yarn.app.container.log.dir=/home/stan//hadoop-2.6.4/logs/userlogs/application_1508397483453_0095/container_1508397483453_0095_01_000004 -XX:OnOutOfMemoryError=kill %p org.apache.spark.executor.CoarseGrainedExecutorBackend --driver-url spark://[email protected]:52986 --executor-id 3 --hostname stan --cores 1 --app-id application_1508397483453_0095 --user-class-path file:/home/stan/tmp/hadoop-stan/nm-local-dir/usercache/stan/appcache/application_1508397483453_0095/container_1508397483453_0095_01_000004/__app__.jar

附:spark application運行時版本不兼容錯誤的解決方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
17/06/27 14:34:41 INFO deprecation: mapred.map.tasks is deprecated. Instead, use mapreduce.job.maps
17/06/27 14:34:41 INFO MemoryStore: Block broadcast_0 stored as values in memory (estimated size 788.8 KB, free 1246.5 MB)
17/06/27 14:34:41 INFO MemoryStore: Block broadcast_0_piece0 stored as bytes in memory (estimated size 54.0 KB, free 1246.4 MB)
17/06/27 14:34:41 INFO BlockManagerInfo: Added broadcast_0_piece0 in memory on 10.50.70.121:37335 (size: 54.0 KB, free: 1247.2 MB)
17/06/27 14:34:41 INFO SparkContext: Created broadcast 0 from rdd at TradeInfoOutlier.scala:30
Exception in thread "main" java.lang.NoSuchMethodError: scala.reflect.api.JavaUniverse.runtimeMirror(Ljava/lang/ClassLoader;)Lscala/reflect/api/JavaUniverse$JavaMirror;
at com.fangdd.data.profile.outlier.TradeInfoOutlier$.main(TradeInfoOutlier.scala:30)
at com.fangdd.data.profile.outlier.TradeInfoOutlier.main(TradeInfoOutlier.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at 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.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
17/06/27 14:34:42 INFO SparkContext: Invoking stop() from shutdown hook

這種錯誤是由于生產環境采用的是scala 2.10 + spark1.6.3的運行環境,本地打的application jar使用scala2.11 + spark.1.6.3的編譯環境,所以放入生產環境集群報了上述錯誤,更改scala版本重新打jar包后運行成功

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:http://www.cnblogs.com/jasondan/p/spark-specific-jdk-version.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 天天躁夜夜躁很很躁 | 欧美午夜视频一区二区 | 波多野结衣在线中文 | 免费观看无人区完整版 | 欧美激情精品久久久久久不卡 | jazz中国在线视频 | 成人免费体验区福利云点播 | 久久国产视频网 | 精选国产AV精选一区二区三区 | 肉色欧美久久久久久久蜜桃 | 久久精品亚洲精品国产欧美 | 美国雪白人妖sarina | 欧美丰满大乳大屁在线观看股 | 日韩免费一级片 | 成人性爱视频在线观看 | 日本小视频免费 | 国产亚洲精品一区二区在线播放 | gay台湾无套男同志可播放 | ffyybb免费福利视频 | 男人猛戳女人下部30分钟 | zol中关村在线 | 精品一区二区高清在线观看 | 四虎影视地址 | 日本人护士免费xxxx视频 | 国产v在线在线观看羞羞答答 | 国产精品制服丝袜白丝www | 国产精品色拉拉免费看 | 国产美女下面流出白浆视频 | 国产成人夜色91 | 99r视频 | 精品一区二区三区自拍图片区 | 亚洲国产一区二区a毛片 | 亚洲午夜大片 | 性欧美sexvideo另类 | 女教师巨大乳孔中文字幕免费 | 国产精彩视频 | 羞羞视频麻豆 | 亚洲乱亚洲乱妇41p 亚洲乱码一区二区三区国产精品 | 成人国产第一区在线观看 | 成人免费国产欧美日韩你懂的 | 日本亚欧乱色视频在线观看 |