1. 程式人生 > >工作中遇到問題以及解決方法

工作中遇到問題以及解決方法

問題一: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包。

  1. 檢查讀取的配置檔案(比如 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包。

  1. 編譯執行的類的jdk版本和spark叢集上的jdk版本不一致導致的。

修改jdk的編輯路徑重新編譯打包專案,完美解決

java.lang.OutOfMemoryError: Java heap space

什麼都不要去改,無疑問的就是程式碼中出現一個很大的變數導致記憶體溢位了,比如說spark中的廣播變數特別的大,消耗很大的記憶體,這時候直接就是修改jvm的引數:

比如我之前的引數:Xmx: 1024m Xms:512m

修改之後 

完美解決