티스토리 뷰
High-Availabily 를 이용하기 위해서 다음과 같이 설정을 하고 YARN 에서 클러스터를 구성하면 이상하게 1개 이상의 클러스터를 띄울수 없어서 삽질하게된 후기를 알려주고자 한다.
Flink 의 주키퍼를 이용한 HA
쿠퍼네티스는 configMap 을 이용해서 HA 의 정보를 전달하지만, 일반적인 케이스에서는 Zookeeper를 이용해서 HA를 구성한다. 문서에서 보면 다음과 같은 예시가 있고 이렇게 설정이 되어야 마스터 노드 하나가 죽었을때, 대기중인 마스터노드가 active로 바뀌고 기존에 실행했던 정보를 이어서 실행할 수 있다.
high-availability: zookeeper
high-availability.zookeeper.quorum: localhost:2181
high-availability.zookeeper.path.root: /flink
high-availability.cluster-id: /cluster_one # important: customize per cluster
high-availability.storageDir: hdfs:///flink/recovery
위 설정의 의미는 JobManager 의 active/standby 노드가 뭔지 Zookeeper 의 /flink/cluster_one 경로에 저장할것이고, 실행중인 작업의 정보는 "hdfs:///flink/recoverry" 에 저장해서 마스터노드가 바뀌면 이 경로의 파일을 읽어서 재실핼 할수 있도록 하겠다는 의미다.
Yarn에서 N대의 클러스터문제
YARN 에서 N대의 Flink 클러스터를 사용할때, "high-availabillity.cluster-id" 설정이 있으면 문제가 된다.
flink-con.yaml 에 세팅한후, Application Mode 로 application 을 실행시도하면 이상하게 첫번째는 실행에 성공하고, 두번재 프로그램을 실행못하고 계속 대기만 하는 상황에 빠진다.
https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/deployment/resource-providers/yarn/
그 이유는 뭘까?
yarn 기반으로 실행할때는 yarn 컨테이너의 id 를 "high-availabillity.cluster-id" 라고 가정된 상태로 구현이 되어있다. 그런데 그 값을 사용자가 지정해버리면 모든 작업은 해당 아이디의 클러스터에만 요청되려고 시도한다.
문제는 이름이 모두 동일하니까, 첫번째 실행된게 active 노드로 생각하고, 두번째 실행된건 standby 노드로 판단해서 실행못되고 대기만 하는 상황이 발생하는것이다.
그럼 설정을 빼면 끝일까?
YARN 기반에서 세션클러스터를 N대 운영하거나, Application Mode 를 가볍게 테스트할때 flink-conf.yaml 에서 해당 설정을 제거하는게 가장 속편하다. 기동될때 자동으로 yarn 의 applicaiton id 로 클러스터 아이디가 할당되니 중복될 우려도 없다. 그리고, 디폴트로 그렇게 된걸로 가정되어 있기 때문에, sql-client.sh 를 통해 sql로 로직을 만들어 실행할때 기본설정이 잘 연결되서 쿼리돌리는것도 수월하다.
문제는 정말 없을까?
사실 클러스터를 구분하는 클러스터 아이디가 죽었다 띄울때 매번 바뀐다는말은 주키퍼의 노드도 기존정보를 보는게 아니라 새로운 노드를 만들기 때문에 죽기전에 돌리던 JOB의 이력정보를 모르는 상황이 된다는것이다.
아마 Session Mode 형태로 여러대의 flink 클러스터를 기동하고 싶다면 기존 실행정보가 유지되는걸 원할 수 도 있을것이다. 하지만 이러면 기본 세팅을 벗어나기 때문에 application job 을 submit 하거나 sql-client.sh 에서 쿼리를 날릴때 어떤 클러스터에서 실행될지 세팅을 해줘야 하는 번거로움은 있다.
YARN 에서 N대의 flink 클러스터 기동된 상태에서 클러스터를 지정해서 쿼리를 날리는건 아랫 글을 참고하자.
'데이터처리 > Flink' 카테고리의 다른 글
[Flink] yarn-session.sh 오류 : java.lang.NoClassDefFoundError (0) | 2022.03.18 |
---|---|
Flink sql 에서 필드 변경하는 꼼수 - 필드 타입 / 이름 (0) | 2022.03.04 |
[FLINK] yarn 세션 모드 : 클러스터 N대로 sql-client 접속하는 방법 (0) | 2022.02.15 |
[Flink] sql-client 에서 쿼리 결과가 안나오는 문제 - checkpoint (0) | 2022.02.05 |
[Flink] extension (5) should not be presented in certificate_request 오류 - postgresql 연동시 (0) | 2022.01.27 |