1. 程式人生 > >編譯打包spark-1.6.0-cdh5.11.0-src詳細過程及問題記錄

編譯打包spark-1.6.0-cdh5.11.0-src詳細過程及問題記錄

簡介 要深入學習spark,閱讀原始碼,修改原始碼,學會自己編譯打包spark是必須邁過的一道坎。折騰了兩天,先後編譯打包了spark-1.6.0-cdh5.11.0-src,spark-1.6.0-cdh5.13.0-src版本,現在記錄過程,及遇到的問題如下。 環境準備     1.我編譯的平臺是CentOS7,並且能正常聯網(如果你能越過那道高高的山崗,那麼編譯速度就大大的快了)。             2.系統安裝的Java環境是JDK7和Scala2.10.4。官網有說明,Java環境應該是7或者更高(推薦使用8,7也快過時了)。儘量不要使用Scala2.11,如果要使用則要做另外一個步驟,詳見文末的官方編譯參考文件。
            3.採用的是maven方式編譯,因此準備maven軟體:apache-maven-3.5.0。官網有說明,maven版本應該是3.3.3或者更高 軟體下載 編譯步驟 1.安裝maven,Scala。安裝方式都型別,上傳解壓,修改環境變數。             2.jdk,Scala,maven等環境準備好後,上傳原始碼解壓。然後檢視解壓後的目錄,發現有一個make-distribution.sh指令碼,接下來要修改一下指令碼: vim make-distribution.sh 找到下面的片段,將其全部註釋如下: #VERSION=$("$MVN" help:evaluate -Dexpression=project.version
[email protected]
2>/dev/null | grep -v "INFO" | tail -n 1)
#SCALA_VERSION=$("$MVN" help:evaluate -Dexpression=scala.binary.version [email protected] 2>/dev/null\ #    | grep -v "INFO"\ #    | tail -n 1) #SPARK_HADOOP_VERSION=$("$MVN" help:evaluate -Dexpression=hadoop.version [email protected]
2>/dev/null\
#    | grep -v "INFO"\ #    | tail -n 1) #SPARK_HIVE=$("$MVN" help:evaluate -Dexpression=project.activeProfiles -pl sql/hive [email protected] 2>/dev/null\ #    | grep -v "INFO"\ #    | fgrep --count "<id>hive</id>";\ #    # Reset exit status to 0, otherwise the script stops here if the last grep finds nothing\ #    # because we use "set -o pipefail" #    echo -n)     然後新增如下內容 VERSION=1.6.0 SPARK_HADOOP_VERSION=2.6.0-cdh5.11.0 SPARK_HIVE=1 SCALA_VERSION=2.10.4  其中,VERSION代表spark版本,SPARK_HADOOP_VERSION代表Hadoop版本,SPARK_HIVE如果為1則代表需要支援hive,為0則不需要。SCALA_VERSION為Scala版本。這裡的各種版本根據自己的需要自行對應。 這裡修改指令碼的目的,是為了避免進行版本檢查,由自己指定版本,可以加快編譯時間。               3.修改完成後儲存指令碼。然後執行下面命令,避免記憶體溢位。 export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"                4.然後執行如下編譯命令 ./make-distribution.sh --tgz -Pyarn -Phadoop-2.6.0-cdh5.11.0 -Dhadoop.version=2.6.0-cdh5.11.0 -Phive-1.1.0 -Phive-thriftserver                然後就會自動下載許多的東東,如果一切順利,最後在當前目錄下,會生成一個spark-1.6.0-bin-2.6.0-cdh5.11.0.tgz檔案。當然這是一切順利,可是第一次編譯基本不可能順利,下面是其中一些問題的摘錄。 遇到的問題及解決 1.下載檔案或者依賴包時卡住。這是由於網路問題,可以ctrl+c停止編譯,然後再執行以下編譯命令,出現卡住不動就這樣,多試幾次,我重試了大概4,5次。輕功好的同學,翻山越嶺,編譯就順暢多了。               2。Hive-thriftserver編譯失敗。報錯大致如下: [error]/opt/spark-1.6.0-cdh5.11.0/sql/hive-thriftserver/src/main/scala/org/apache/spark/sql/hive/thriftserver/SparkExecuteStatementOperation.scala:42: class SparkExecuteStatementOperation needs to be abstract, since method cancel in class Operation of type (x$1: org.apache.hive.service.cli.OperationState)Unit is not defined [error] private[hive] class SparkExecuteStatementOperation( [error]                     ^ [error] /opt/spark-1.6.0-cdh5.11.0/sql/hive-thriftserver/src/main/scala/org/apache/spark/sql/hive/thriftserver/SparkExecuteStatementOperation.scala:252: method cancel overrides nothing. [error] Note: the super classes of class SparkExecuteStatementOperation contain the following, non final members named cancel: [error] def cancel(x$1: org.apache.hive.service.cli.OperationState): Unit [error]   override def cancel(): Unit = { [error]                ^ [error] /opt/spark-1.6.0-cdh5.11.0/sql/hive-thriftserver/src/main/scala/org/apache/spark/sql/hive/thriftserver/server/SparkSQLOperationManager.scala:42: method newExecuteStatementOperation overrides nothing. [error] Note: the super classes of class SparkSQLOperationManager contain the following, non final members named newExecuteStatementOperation: [error] def newExecuteStatementOperation(x$1: org.apache.hive.service.cli.session.HiveSession,x$2: String,x$3: java.util.Map[String,String],x$4: Boolean,x$5: Long): org.apache.hive.service.cli.operation.ExecuteStatementOperation [error]   override def newExecuteStatementOperation( [error]                ^ [error] three errors found [error] Compile failed at Nov 1, 2017 3:45:20 PM [3.198s]                     這個問題,cloudera官方社群給出的解釋是不支援,下面是回覆截圖
                        解決辦法是不編譯他,修改一下編譯命令,把-Phive-thriftserver引數刪掉,如下: ./make-distribution.sh --tgz -Pyarn -Phadoop-2.6.0-cdh5.11.0 -Dhadoop.version=2.6.0-cdh5.11.0 -Phive-1.1.0                 3.在編譯Spark Project External Kafka時可能會遇到找不到包com.google.common,如下: [ERROR] bad symbolic reference. A signature in Utils.class refers to term util in package com.google.common which is not available. It may be completely missing from the current classpath, or the version on the classpath might be incompatible with the version used when compiling Utils.class.                 解決辦法是在spark-parent的pom.xml中加入依賴 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>18.0</version> </dependency>                 4.Unable to find configuration file at location scalastyle-config.xml,解決辦法:將根目錄下的scalastyle-config.xml拷貝到examples目錄下去,這是因為pom.xml中定義的是scalastyle-maven-plugin外掛從maven執行的當前目錄查詢該檔案 參考連結: