flink clickhouse-jdbc和flink-connector 寫入數據到clickhouse因為jar包衝突導致的60 seconds.Please check if the requested resources are available in the YARN cluster和Could not resolve ResourceManager address akka報錯血案

一、問題現象,使用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包衝突,後來靈感來源於

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