工作中遇到問題以及解決方法
問題一:eclipse的maven工程在構建的時候報了source 7 或更高版本來支援diamon的運算子。
解決方法:在pom.xml中新增
Spark:java.net.BindException: Address already in use: Service 'SparkUI' failed after 16 retries!
錯誤原因:
每一個Spark任務都會佔用一個SparkUI埠,預設為4040,如果被佔用則依次遞增埠重試。但是有個預設重試次數,為16次。16次重試都失敗後,會放棄該任務的執行。
解決方法
初始化SparkConf時,新增conf.set(“spark.port.maxRetries”,“100”)語句
使用spark-submit提交任務時,在命令列中新增-Dspark.port.maxRetries=100
在spark-defaults.conf中新增spark.port.maxRetries 100
解決方案:Kafka consumer中設定fetch.message.max.bytes為大一點的記憶體
比如設定為50M:1024*1024*50
fetch.message.max.bytes=52428800
解決方法:
在程式中給Configuration做以下設定:
conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem"
git提交的時候 this exceeds file size limit of 100.0 MB
Github只允許上傳最大100MB的檔案,如果超過,則會被server reject
則需:
git filter-branch --force --index-filter "git rm --cached --ignore-unmatch target/lib/spark-assembly-1.6.1-cdh5.3.2-hadoop2.5.0-cdh5.3.2.jar" --prune-empty --tag-name-filter cat -- --all
git commit --amend -CHEAD
git push origin master
Maven build的java普通工程的jar包想在linux上面使用shell命令執行jar包的方法:
第一種方法:shell命令執行
例如:
Nohup java -cp /home/hadoop/azkaban/testjobforshenzhonghu/patternToRedis/pattern/lib/commons-pool2-2.4.2.jar:/home/hadoop/azkaban/testjobforshenzhonghu/patternToRedis/pattern/lib/junit-3.8.1.jar:/home/hadoop/azkaban/testjobforshenzhonghu/patternToRedis/pattern/lib/jedis-2.9.0.jar:/home/hadoop/azkaban/testjobforshenzhonghu/patternToRedis/pattern/lib/cn.com.cennavi-0.0.1-SNAPSHOT_beijing.jar cn.com.cennavi.java.WriteRedis_beijing >beijing.log &
Java -cp 依賴的jar1:依賴的jar2:.....:工程jar包 主函式名 linux系統用:分割,windows用;
第二種方法;修改pom.xml檔案,使其build的時候可以把主函式告知到jar中
<build>
<sourceDirectory>src/main/java</sourceDirectory>
<testSourceDirectory>src/test/java</testSourceDirectory>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<archive>
<manifestEntries>
<Class-Path>spark-assembly-1.6.1-hadoop2.5.0-cdh5.3.2.jar scala-reflect-2.10.3.jar</Class-Path>
</manifestEntries>
<manifest>
<addClasspath>true</addClasspath>
<!--<classpathPrefix>lib</classpathPrefix>--> <!--字首,例如配置lib,則MANIFEST中Class-Path: lib/scala-library-2.10.4.jar-->
<mainClass>cn.com.cennavi.java.WriteRedis_liuzhou</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
Job aborted due to stage failure: Task serialization failed: java.lang.StackOverflowError
java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1506)
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1429)
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1175)
java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1375)
這種錯誤報出是程式碼當中記憶體溢位原因導致的,檢查程式碼中使用記憶體的步驟,進行修改,當時報這個錯誤的原因是:
是這個原因,計算半個月的hdfs資料不報錯,但是計算一個月的資料的時候這個union操作就會使用的記憶體超過自己的配置就出現了這個錯誤。當時解決方法就是控制每次計算半個月的資料或者更低的資料。
Exception in thread "Thread-0" java.lang.RuntimeException: Job HistoryCntfToLocal does not have cancel method cancel
24-10-2018 14:18:30 CST HistoryCntfToLocal ERROR - at azkaban.jobtype.JavaJobRunnerMain.cancelJob(JavaJobRunnerMain.java:249)
24-10-2018 14:18:30 CST HistoryCntfToLocal ERROR - at azkaban.jobtype.JavaJobRunnerMain$1.run(JavaJobRunnerMain.java:78)
解決方法:(1)缺少jar包,把與這個工程相類似的工程使用到的jar包全部匯入到該工程下面進行引用。完美解決,但是還是不知道缺少了什麼jar包。
- 檢查讀取的配置檔案(比如 spark kafka 其他的配置檔案)是否路徑有錯誤
ERROR Failed to set setXIncludeAware(true) for parser
解決方法:jar包衝突
刪除自己的xercesImpl.jar,用jdk自身的編譯器,問題解決了
java.io.InvalidClassException: ** local class incompatible: stream classdesc serialVersionUID = -9117779196120965598, local class serialVersionUID = 2841008943488659566
解決方法:
1、spark執行的jar包的類和叢集上的jars包不一致
在執行spark程式的時候,需要把執行的jar包上傳到叢集上,即通過sparkconf.setJars()將jar包裡的類上傳到叢集,並分散到各個Worker節點,才能實現並行處理。
所以要保證命令列執行的jar(java -jar …或者spark-submit…)和叢集上設定的sparkconf.setJars()要是同一個jar包。
- 編譯執行的類的jdk版本和spark叢集上的jdk版本不一致導致的。
修改jdk的編輯路徑重新編譯打包專案,完美解決
java.lang.OutOfMemoryError: Java heap space
什麼都不要去改,無疑問的就是程式碼中出現一個很大的變數導致記憶體溢位了,比如說spark中的廣播變數特別的大,消耗很大的記憶體,這時候直接就是修改jvm的引數:
比如我之前的引數:Xmx: 1024m Xms:512m
修改之後
完美解決