一、問題現象,使用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://flink@xxxxxxxxx.cn: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://flink@xxxxxxxxx.cn: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://flink@xxxxxxxxx.cn: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、不要被表面的現象迷惑,要能根據現象去看到本質,這樣才能解決到問題。