flink實戰-實時計算平臺通過api停止流任務

背景

  • 隨着flink在流計算領域越來越火,很多公司基於flink搭建了自己的實時計算平臺,用戶可以在實時平臺通過jar或者sql的方式來開發、上線、下線、運維flink任務,避免了構建flink任務的複雜性,使更多不會flink的人能夠使用flink。
  • 平時我們自己開發一個flink任務之後,都是通過腳本的方式提交到集羣的,但是我們搭建了一個實時計算之後,就不能通過命令行來管理任務了,我們今天就主要講一下如何通過api的方式來和yarn集羣交互。
  • 目前生產環境部署flink任務主要有yarn集羣和k8s集羣兩種方式,雖然說k8s號稱下一代資源管理系統,但是對於flink來說,還是有很多不太成熟,所以目前部署flink任務還是以yarn集羣爲主。
  • yarn集羣部署flink任務目前有兩種方式
  1. yarn session 模式
    session模式是在yarn上面預先啓動一個集羣,然後我們可以將任務部署到集羣上,沒有任務的時候集羣上沒有taskmanager,當有了新的任務之後,系統會自動爲其分配資源,當任務結束之後,過一段時間(可配置)系統會自動釋放資源,這種集羣一般適合運行週期比較短的任務,比如批處理任務。
  2. per job 模式
    per job模式是每個任務都啓動一個flink集羣,這種模式的好處就是資源隔離,不互相影響,任務結束之後,釋放相應的資源。這種模式啓動任務時間長,一般適合運行常駐任務,比如flink流任務.

案例詳解

今天我們主要講一下如何通過api的方式來停止一個通過per job模式部署在yarn集羣上的任務。

命令行停止

我們在命名行模式下可以通過下面的命令來停止一個部署在yarn的per job模式的flink任務.

${FLINK_HOME}/bin/flink stop -m yarn-cluster -yid application_1592386606716_0005 c8ee546129e8480809ee62a4ce7dd91d

我們看到,主要是有兩個參數,一個是yarn的applicationId,還有一個是flink的jobId,執行成功之後,會返回一個類似的結果:

Savepoint completed. Path: hdfs://localhost/flink-savepoints/savepoint-c8ee54-ee7a059c2f98

api實現

其實主要的方法就是構造出上面兩個id,然後我們使用ClusterClient來停止flink任務.

  • 添加配置文件
    我們在classpath下添加hadoop和flink的配置文件
    在這裏插入圖片描述

  • 構造ApplicationId對象


Configuration flinkConfiguration = new Configuration();
		flinkConfiguration.set(YarnConfigOptions.APPLICATION_ID, appId);
		YarnClusterClientFactory clusterClientFactory = new YarnClusterClientFactory();
		ApplicationId applicationId = clusterClientFactory.getClusterId(flinkConfiguration);

  • 構造jobId

	private static JobID parseJobId(String jobIdString) throws CliArgsException{
		if (jobIdString == null){
			throw new CliArgsException("Missing JobId");
		}

		final JobID jobId;
		try {
			jobId = JobID.fromHexString(jobIdString);
		} catch (IllegalArgumentException e){
			throw new CliArgsException(e.getMessage());
		}
		return jobId;
	}

  • 停止任務
    通過stopWithSavepoint方法來停止任務,如果savePoint沒指定的話,系統將會使用flink配置文件中的state.savepoints.dir選項.

	CompletableFuture<String> completableFuture = clusterClient.stopWithSavepoint(
				jobID,
				true,
				savePoint);

		String savepoint = completableFuture.get();
		System.out.println(savepoint);

最後執行完成之後,會返回一個savepoint的地址,和命令行一樣,我們可以把這個地址存起來,以便我們後續從這個checkpoint啓動。

完整的代碼請參考:

https://github.com/zhangjun0x01/bigdata-examples/blob/master/flink/src/main/java/cluster/StopYarnJob.java

歡迎關注我的微信公衆號:【大數據技術與應用實戰】,及時獲取更多資料.

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章