一、問題現象,使用flink on yarn 模式,寫入資料到clickhouse,但是在yarn 叢集充足的情況下一直報:Deployment took more than 60 seconds. Please check if the requested resources are available in the YARN cluster,表面現象是 yarn 叢集資源可能不夠,實際yarn 叢集資源是夠用的。

檢視flink jobmanager的日誌,發現日誌中一直在出現如下報錯:

Could not resolve ResourceManager address akka.tcp://[email protected]:38121/user/rpc/resourcemanager_*, retrying in 10000 ms: Could not connect to rpc endpoint under address akka.tcp://xxxxxxx.cn:38121/user/rpc/resourcemanager_*.

從這個日誌來看,也就基本可以確定不是yarn叢集資源的問題,是yarn 叢集通訊出現了問題。

1)、交叉驗證,發現提交別的flink streamling 任務都不會存在該問題,只有寫clickhouse的時候才會出現該問題,初步排除可能是程式碼問題或者該任務的jar包引起的。

2)、檢視pom依賴:

        <dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-jdbc_2.11</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_2.11</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka_2.11</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-java</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>ru.yandex.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>${clickhouse-jdbc.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector-java.version}</version>
</dependency>

從日誌中雖然看不出明顯的jar包衝突問題,但是依然能從Could not resolve ResourceManager address akka.tcp://[email protected]:38121/user/rpc/resourcemanager_*, retrying in 10000 ms: Could not connect to rpc endpoint under address akka.tcp://xxxxxxx.cn:38121/user/rpc/resourcemanager_*. 聯想到可能是jar衝突或者jar包版本導致的衝突,導致 connect 失敗。

聯想到hadoop 環境中,最容易出現衝突的包,如下所示,首先去排查。

                <groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>

  然後發現,果然clickhouse-jdbc中存在這個包,如下所示

在pom中排除該包,如下所示

        <dependency>
<groupId>ru.yandex.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>${clickhouse-jdbc.version}</version>
<exclusions>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>

重新執行,問題得到解決。

二、問題啟示:

1、所有的日誌中沒有地方顯示程式碼衝突,表層現象為Could not resolve ResourceManager address akka.tcp://[email protected]:38121/user/rpc/resourcemanager_*, retrying in 10000 ms: Could not connect to rpc endpoint under address akka.tcp://xxxxxxx.cn:38121/user/rpc/resourcemanager_*. 很難聯想到jar包衝突,後來靈感來源於

https://blog.csdn.net/qq_31957747/article/details/108883793   這個篇博文,雖然發生衝突的jar是不一樣,但是問題很類似,所以朝這個方向去做了嘗試。發現jar包衝突,真的可能會帶來這個問題。

2、flink on yarn 模式中,最容易出現flink任務的jar包和hadoop叢集中的jar包衝突。 在寫程式碼的時候,一般pom中可能是檢測不出來的,因為很多包不直接依賴。但是在flink run -m yarn-cluster 提交任務時,卻會使用到hadoop lib 下的classpath。 所以這種衝突程式碼中很難檢測,實際中卻很容易出現。

3、不要被表面的現象迷惑,要能根據現象去看到本質,這樣才能解決到問題。