FLINK 플랫폼, 편안한 API를 자신의 작업 체크 포인트 목록 프로그램을 제공하기 위해 따라 FLINK뿐만 아니라 시작에 따라 검사 전에 검사의 존재를 얻을 필요가있다.
공식 웹 사이트에 편안한 API를 참조 https://ci.apache.org/projects/flink/flink-docs-release-1.9/monitoring/metrics.html
특히 주목할 있습니다 :
필요 작업 이름에 따라 변환 할 수 있도록 한 프로세스의 플랫폼, 태스크 ID와 FLINK 플랫폼 태스크 ID (작업 ID)가 동일한 개념이 아니다. 즉,에 의해 '/ 작업 / 개요'가져 오기 모든 작업 정보, 동료 이름에 따라.
2, 사실 체크 포인트 및 세이브 포인트 기본 단결, 구별 단지 'is_savepoint'필드 그래서.
3 패리티 때문에 다수의 경로의 존재가 이러한 파일로서 포맷 FLINK : ///, HDFS를 : /// 차이 리눅스 존재는 시스템 복사본의 코드 FLINK 코어 소스의 직접 사용 windwos 가격이 너무 높으면에 대한 참조 때문에 '<artifactId를> FLINK 코어 </ artifactId를>'이 상대적으로 무거운 작업입니다,하지만 확실하게 인용 될 후속하는 플랫폼을 싶습니다 있지만.
네, 체크 포인트의 적법성 검증, 소스 코드 AbstractFsCheckpointStorage.resolveCheckpointPointer () 메소드,하지만 난 수 없습니다 쓰기, 이유는 내가 그이 executionJobVertex executionJobVertex이 executionGraph를 구축 한 후 건설 타당성을 검증 생각하기 때문에, 그리고 수표로 때 I checkpointPointer 매개 변수로 하나의 경로 만 있어야는 후속 작업을 포함하지 않는다. 나는 체크 포인트가 작업을 시작할 때 이것 만 사용됩니다 생각합니다. 내가 체크 포인트 코드를 다시 시작하라는 메시지가되는 생각 그래서 다음을 참조하는 저를 작성.
다음과 같이 전체 코드는
패키지 com.xx.monitor.metric.example을; 수입 com.alibaba.fastjson.JSONArray; 수입 com.alibaba.fastjson.JSONObject; 수입 com.xx.common.http.Request; 수입 com.xx.common.http.Response; 수입 com.google.common.base.Preconditions; 수입 org.apache.flink.core.fs.FileStatus; 수입 org.apache.flink.core.fs.FileSystem; 수입 org.apache.flink.core.fs.Path; 수입 java.io.FileNotFoundException; 수입 때 java.io.IOException; / ** * 설명 : * 1, FLINK作业체크 포인트列表展示 * 2, FLINK作业세이브 포인트列表展示 * 3,校验 * @author : wulei는 버전 * 1.0 * 작성 날짜 시간 : 2020년 2월 25일 11:24 오전. * 업데이트 날짜 시간 : * / 공용 클래스 CheckPointDemoTest { / ** 체크 포인트 타입 플래그 * / 공공 정적 최종 문자열 CHECKPOINT_TYPE = "체크 포인트" ; / ** 세이브 포인트 타입 플래그 * / 공공 정적 최종 문자열 SAVEPOINT_TYPE = "세이브 포인트" ; / ** FLINK 메트릭 편안한 주소 * / 공공 정적 최종 문자열 ADDRESS_PREFIX = "http://192.168.90.212:8081" ; / **FLINK 측정 편안한 API를 * / 공공 정적 최종 문자열 JOBS_OVERVIEW_SUFFIX = "/ 작업 / 개요" ; 공공 정적 최종 문자열 JOBS_CHECKPOINTS_SUFFIX = "/ 작업 / % S / 체크 포인트" ; 공공 정적 무효 메인 (문자열 []에 args) { // 데모리스트 checkpointList ( "윈도우 소켓 단어 수" ); savepointList ( "윈도우 소켓 단어 수" ); // 유효성 검사 데모 시도 { 검증 ( "checkpointPointer" ); } 캐치(IOException이 전자) { // 프로세스 IOException이 } } / ** * 1, 체크인 / 세이브路径存在性校验 * 2合法性校验 * @param checkpointPointer * @throws IOException이 * / 공공 정적 무효 검증 (문자열 checkpointPointer) 던졌습니다 IOException가 { // 1,存在性校验 Preconditions.checkNotNull (checkpointPointer, "checkpointPointer은 null 일 수 없습니다" ); Preconditions.checkArgument ( checkpointPointer.isEmpty (), "checkpointPointer는 비워 둘 수 없습니다!" ); //포인터가 실제로 유효한 파일 경로에 있는지 확인 최종 경로 경로; 시도 { 경로 = 새로운 경로 (checkpointPointer를); } 캐치 (예외 전자) { 던져 새로운 IOException이 ( "체크 포인트 / 세이브 포인트 경로를 '"+ checkpointPointer + "'유효한 파일 URI 없습니다."+ "어느 포인터 경로가 유효하지 않거나, 체크 포인트는 다른 상태 백엔드에 의해 만들어진 . " ); } // 파일 시스템에 액세스 할 수 있는지 확인 최종 파일 시스템 FS를; 시도 { FS =path.getFileSystem (); } 캐치 (IOException이 전자) { 던져 새로운 IOException가 ( "체크 포인트 / 세이브 포인트 경로의 수에 액세스 할 파일 시스템 '"+ checkpointPointer + "'." , 전자); } 최종 FileStatus 상태; 시도 { 상태 = fs.getFileStatus (경로); } 캐치 (FileNotFoundException이 전자) { 던져 새로운 + (FileNotFoundException이를 "체크 포인트 또는 세이브 포인트를 찾을 수 없습니다 ' ' '파일 시스템'" "파일 / 디렉토리를"+ checkpointPointer + '); } // 우리가 여기있는 경우, 파일 / 디렉토리가 존재 최종 경로 checkpointDir는; 최종 FileStatus metadataFileStatus; //이 이 디렉토리 일 경우, 우리는 메타 데이터 파일을 찾을 필요가 있는 경우 (status.isDir ()) { checkpointDir = status.getPath (); 최종 경로 metadataFilePath = 새로운 경로 (경로, "_metadata" ); 시도 { metadataFileStatus = fs.getFileStatus (metadataFilePath); } 캐치 (FileNotFoundException이 전자) { 던져 새로운 ( ' "메타 데이터 파일 + _metadata 찾을 수 없습니다"FileNotFoundException이를 "디렉토리에'"+ 경로 +를 '+' '체크 포인트 / 세이브 포인트로드를 시도하십시오. " "대신 디렉토리의 메타 데이터 파일에서 직접합니다. " ); } } // 2,合法性校验 } 공공 정적 무효 checkpointList (문자열 작업 이름) { 포인트 (CHECKPOINT_TYPE, 작업 이름, ADDRESS_PREFIX); } 공공 정적 무효 savepointList (문자열 JOBNAME) { 포인트 (SAVEPOINT_TYPE, 작업 이름, ADDRESS_PREFIX); * * FLINK 지표 자체가 평안한 API 호출의 형태로 제공 모니터링 2; 1 연결, 작업 ID TASKID의 플랫폼 (taskInstanceId)이 기능 키 * 플랫폼은 두 가지이다 * http://192.168.90.212 : 8081 / 채용 정보 / 631fea77b842918e2e33070e45c03477 / 체크 포인트 * @param PointType * / 개인 정적 무효 포인트 (PointType 문자열, 문자열 작업 이름, 문자열 주소) { // 모든 작업을 GET, 그 후에 ON 기반 jobisd GET 작업 이름 응답 <된 JSONObject> 응답 = 새 새 요청 ( + 어드레스 JOBS_OVERVIEW_SUFFIX) ... GET (); 문자열 JID = 널 ; IF (response.isSuccess ()) { JSONArray jobArray = response.getContent () getJSONArray ( "작업". ); 위한 ( INT I = 0; I <jobArray.size (); I ++ ) { 된 JSONObject jobJson = jobArray.getJSONObject (I); 문자열 이름은 jobJson.getString ( "이름"= ); 경우 ( 널 (null) = 이름 &&! name.equals (작업 이름)) { JID = jobJson.getString ( "JID" ); 휴식 ; } } } 경우 (JID == 널 ) { 창 ; } 응답 <된 JSONObject> = responseCheckPoints 새로운 요청 (어드레스 + . 및 String.format (JOBS_CHECKPOINTS_SUFFIX, JID))) (얻는다; 경우 (response.isSuccess ()) { JSONArray historyArray . responseCheckPoints.getContent = () getJSONArray ( "히스토리" ); 위한 ( INT I = 0; I <historyArray.size (); I ++ ) { 된 JSONObject jobJson = historyArray.getJSONObject (I); 부울 is_savepoint = jobJson.getBoolean ( "is_savepoint" ); 경우(pointType.equals (CHECKPOINT_TYPE) &&!is_savepoint) { // 체크 포인트 정보 문자열 ID = jobJson.getString ( "ID" ); 문자열 상태 jobJson.getString ( "상태"= ); 문자열 trigger_timestamp = jobJson.getString ( "trigger_timestamp" ); 문자열 end_to_end_duration는 jobJson.getString ( "end_to_end_duration를"= ); 문자열 num_acknowledged_subtasks = jobJson.getString ( "num_acknowledged_subtasks" ); 휴식 ; } 다른 { //세이브 포인트 정보 } } } } }
<! - FLINK은 종속성 -> <의존성> <의 groupId> org.apache.flink </의 groupId> <artifactId를> FLINK 코어 </ artifactId를> <버전> $ {flink.version} </ 버전> </ 의존성 >