1. 程式人生 > >03 打包構建Flink的部署包

03 打包構建Flink的部署包

Build Flink

你需要先下載原始碼才能 build Flink, 可以直接下載個release版本或者去github上拉下來. 還有Maven 3, Flink 至少需要Java 7.我們推薦使用Java 8。

執行下面這行拉原始碼:

git clone https://github.com/apache/flink

最簡單的building Flink的方法是執行下面這行:

cd flink
mvn clean install -DskipTests

這個內建的maven命令會先清空以前build的東西, 然後重新build Flink包.  -DskipTests命令可以讓maven跳過測試。

這節是關於build flink針對特定的Hadoop版本. 通常,大多數使用者不需要做這一步.   Flink的下載頁包含了比較通用的build完的二進位制包了。.

因為Flink 依賴Hadoop的HDFS 和YARN . 同時Hadoop有多種版本. 如果Hadoop版本不一致 會出現如下的異常。

ERROR: Job execution failed.
    org.apache.flink.runtime.client.JobExecutionException: Cannot initialize task 'TextInputFormat(/my/path)'
: java.io.IOException: Failed on local exception: com.google.protobuf.InvalidProtocolBufferException: Protocol message contained an invalid tag (zero).; Host Details :

Hadoop主要有兩種版本,Hadoop1(0.20, 0.23 or 1.2.1)和Hadoop2(2.2之後的),最主要的區別是YARN (Hadoops cluster resource manager).

預設情況下 Flink依賴Hadoop 2.

下面的命令可以build Hadoop1版本的 flink:

mvn clean install -DskipTests -Dhadoop.profile=1

-Dhadoop.profile=1,這個標誌可以讓Maven build Hadoop 1的依賴的Flink . 需要注意的是不同的Hadoop build處理的flink的功能是不一樣的. 特別是對YARN 的支援和內建的HBase支援 的功能,在 Hadoop 1 是不支援的。

你也可以特別定製一個版本:

mvn clean install -DskipTests -Dhadoop.version=2.4.1

以下命令可以用來,為Flink定製一些類似cloudera 的Hadoop版本。:

mvn clean install -DskipTests -Pvendor-repos -Dhadoop.version=2.2.0-cdh5.0.0-beta-2

-Pvendor-repos 可以啟用 一個帶有多個Hadoop發行版的repositories的maven的構建檔案, 比如Cloudera, Hortonworks, or MapR這幾個.

Build Flink for hadoop2 versions before 2.2.0

maven會自動為flink構建yarn的功能,但是Hadoop2.2.0之前的是不帶yarn的,所以 可以通過下面這個標誌讓flink去掉yarn的功能: -P!include-yarn.

So if you are building Flink for Hadoop 2.0.0-alpha, use the following command:

-P!include-yarn -Dhadoop.version=2.0.0-alpha

Note:使用java api的使用者可以跳過這一節

Flink 的APIs, lib包, 和執行模型有的是Scala寫的,因為Scala不是嚴格的向後相容。所以必須保證flink使用的scala和使用者的scala版本一致,預設情況下, Flink是Scala 2.10.。你可以使用下面的指令碼來 build scala 2.11的flinkTo build Flink。:

# Switch Scala binary version between 2.10 and 2.11
tools/change-scala-version.sh 2.11
# Build and install locally
mvn clean install -DskipTests

To build against custom Scala versions, you need to switch to the appropriate binary version and supply the language version as additional build property. For example, to buid against Scala 2.11.4, you have to execute:

# Switch Scala binary version to 2.11
tools/change-scala-version.sh 2.11
# Build with custom Scala version 2.11.4
mvn clean install -DskipTests -Dscala.version=2.11.4

Flink是使用 Scala 2.10開發的, 同時Scala 2.11也測試通過. 目前只有這兩個版本是適合flink的 . 早些的版本 (比如Scala 2.9) 是不適合的。

最新的版本可能會適合 , 是否適合取決於最新的scala的功能變動, 和flink用到的scala功能,在最新的版本里是否有變化. 通過Scala 編寫的依賴包比如KafkaAkkascala測試, 和scopt.

在加密的檔案系統裡 build

如果你的home目錄是加密的,你可能會遇到a java.io.IOException: File name too long exception. 原因是有些加密檔案系統, 比如Ubuntu的encfs , 不支援長的檔名, 所以導致這個錯誤.

解決方案是在pom.xml增加下面這一段:

<args>
    <arg>-Xmax-classfile-name</arg>
    <arg>128</arg>
</args>

比如再flink-yarn module這個子專案裡出現這個錯誤,就在這個子專案的pom.xml的<configuration>標籤內的scala-maven-plugin裡新增上面這一段. 更多相關內容可以點選後面這個連結檢視this issue

背景

使用Maven來build flink是依賴properties和build profiles來控制的。properties有兩個檔案,一個hadoop2( 2.2.0),一個 hadoop1(1.2.1)。當hadoop2是可用的,flink會build進yarn client的功能。

在maven build的時候新增 -Dhadoop.profile=1可以啟用Hadoop1的properties檔案 ,通過properties配置檔案設定的Hadoop版本,預設是Hadoop1.2.1和Hadoop2.2.0

如果不想用預設Hadoop可以通過這兩個標記, hadoop-two.version 和 hadoop-one.version  . 比如說 -Dhadoop-two.version=2.4.0.