- Impala는 다음과 같이 Query 요청을 처리하는 노드를 별도로 구성할 수 있고 이를 Impala Coordinator라고 칭하며 모든 Impala Worker(Impala Deamon)은 Impala Coordinator가 될 수 있으며, 별도로 Impala Coordinator를 둘 수 있음
- Impala Coordinator의 주요 역할은 메타데이터를 캐슁하고, 쿼리 플랜을 작성하고, 쿼리를 실행을 관리하는 것임
- Impala Daemon은 자체적으로 메타데이터를 캐쉬를 가지고 있고, 메타데이터 캐쉬를 관리하는 대상 서비스는 Impala Catalog이며, 이 두 캐쉬는 기본적으로 동기화가 되어야 함
- 동기화가 되어 있지 않다면 테이블이나 컬럼 등의 변경 사항을 탐지하지 못함
- Impala StateStore는 메타데이터 동기화를 요청하는 notification을 담당하여 메타데이터가 변경되었을 때 Impala Deamon에 변경을 요청하는 메시지를 송신함
- 테이블 생성 등과 같이 메타데이터 변경이 발생하면
- User가 Create SQL을 실행 → 특정 Impala Daemon 또는 Impala Coordinator가 Create SQL을 실행 → 자기 자신의 메타데이터 업데이트 → Impala Catalog 업데이트 → Impala StateStore 통보 → 나머지 다른 Impala Daemon 또는 Coordinator의 메타데이터 업데이트
eyJleHRTcnZJbnRlZ1R5cGUiOiIiLCJnQ2xpZW50SWQiOiIiLCJjcmVhdG9yTmFtZSI6IkVkd2FyZCIsIm91dHB1dFR5cGUiOiJibG9jayIsImxhc3RNb2RpZmllck5hbWUiOiJFZHdhcmQiLCJsYW5ndWFnZSI6ImVuIiwidWlDb25maWciOiJ7fSIsImRpYWdyYW1EaXNwbGF5TmFtZSI6IiIsInNGaWxlSWQiOiIiLCJhdHRJZCI6IjEyNjM1MzQzNSIsImRpYWdyYW1OYW1lIjoiQ2F0YWxvZyBVcGRhdGUiLCJhc3BlY3QiOiIiLCJsaW5rcyI6ImF1dG8iLCJjZW9OYW1lIjoi7Iqk7YKk66eIIOuPmeq4sO2ZlCDsnbTsiogiLCJ0YnN0eWxlIjoidG9wIiwiY2FuQ29tbWVudCI6ZmFsc2UsImRpYWdyYW1VcmwiOiIiLCJjc3ZGaWxlVXJsIjoiIiwiYm9yZGVyIjpmYWxzZSwibWF4U2NhbGUiOiIxIiwib3duaW5nUGFnZUlkIjoxMjU2OTgxMzksImVkaXRhYmxlIjpmYWxzZSwiY2VvSWQiOjEyNTY5ODEzOSwicGFnZUlkIjoiIiwibGJveCI6dHJ1ZSwic2VydmVyQ29uZmlnIjp7ImVtYWlscHJldmlldyI6IjEifSwib2RyaXZlSWQiOiIiLCJyZXZpc2lvbiI6MSwibWFjcm9JZCI6IjE5MGNlOTkxLTllNmItNDQzMi04OGJkLTdhYzdmOGFlZjU2OCIsInByZXZpZXdOYW1lIjoiQ2F0YWxvZyBVcGRhdGUucG5nIiwibGljZW5zZVN0YXR1cyI6Ik9LIiwic2VydmljZSI6IiIsImlzVGVtcGxhdGUiOiIiLCJ3aWR0aCI6IjEwNzQiLCJzaW1wbGVWaWV3ZXIiOmZhbHNlLCJsYXN0TW9kaWZpZWQiOjE3Mjk0NzE2NDUwOTYsImV4Y2VlZFBhZ2VXaWR0aCI6ZmFsc2UsIm9DbGllbnRJZCI6IiJ9
- Impala Coordinator가 HAProxy 또는 L4 Load Balancer로 묶여 있으면 메타데이터 변경시 동기화 이슈가 발생
- 2번 과정에서 테이블이 생성되면 메타데이터가 캐슁
- 그러나 5번 과정에서 해당 Impala Catalog는 아직 메타데이터가 동기화되어 있지 않아서 NOT FOUND ERROR 발생
- Impala Coordinator를 L4에 붙여서 사용하는 경우는 이중화 및 메타데이터 캐슁에 필요로 하는 작업 최소화 및 메모리 소비를 최대한 줄이기 위함
- Impala Daemon은 실제로 메타데이터를 가지고 있지 않도록 하고 Impala Coordinator만 가지고 있도록 하여 메모리 소비 최소화
- 동기화 대상 노드수가 줄어들어서 시스템 오버헤드 줄이도록 함
eyJleHRTcnZJbnRlZ1R5cGUiOiIiLCJnQ2xpZW50SWQiOiIiLCJjcmVhdG9yTmFtZSI6IkVkd2FyZCIsIm91dHB1dFR5cGUiOiJibG9jayIsImxhc3RNb2RpZmllck5hbWUiOiJFZHdhcmQiLCJsYW5ndWFnZSI6ImVuIiwidWlDb25maWciOiJ7fSIsImRpYWdyYW1EaXNwbGF5TmFtZSI6IiIsInNGaWxlSWQiOiIiLCJhdHRJZCI6IjEyNjM1MzQ2MiIsImRpYWdyYW1OYW1lIjoiTWV0YWRhdGEgU3luYyBFUlJPUiIsImFzcGVjdCI6IiIsImxpbmtzIjoiYXV0byIsImNlb05hbWUiOiLsiqTtgqTrp4gg64+Z6riw7ZmUIOydtOyKiCIsInRic3R5bGUiOiJ0b3AiLCJjYW5Db21tZW50IjpmYWxzZSwiZGlhZ3JhbVVybCI6IiIsImNzdkZpbGVVcmwiOiIiLCJib3JkZXIiOmZhbHNlLCJtYXhTY2FsZSI6IjEiLCJvd25pbmdQYWdlSWQiOjEyNTY5ODEzOSwiZWRpdGFibGUiOmZhbHNlLCJjZW9JZCI6MTI1Njk4MTM5LCJwYWdlSWQiOiIiLCJsYm94Ijp0cnVlLCJzZXJ2ZXJDb25maWciOnsiZW1haWxwcmV2aWV3IjoiMSJ9LCJvZHJpdmVJZCI6IiIsInJldmlzaW9uIjoxLCJtYWNyb0lkIjoiM2QyY2YyZjAtZTI4MC00YWNkLTlkMjQtZWY3M2ZlNDM0N2FmIiwicHJldmlld05hbWUiOiJNZXRhZGF0YSBTeW5jIEVSUk9SLnBuZyIsImxpY2Vuc2VTdGF0dXMiOiJPSyIsInNlcnZpY2UiOiIiLCJpc1RlbXBsYXRlIjoiIiwid2lkdGgiOiI4MjYiLCJzaW1wbGVWaWV3ZXIiOmZhbHNlLCJsYXN0TW9kaWZpZWQiOjE3Mjk0NzIwODIxNTgsImV4Y2VlZFBhZ2VXaWR0aCI6ZmFsc2UsIm9DbGllbnRJZCI6IiJ9
- 이 문제를 해결하려면
- SYNC_DDL 옵션을 통해서 테이블을 생성하여 모든 노드에 동기화가 강제로 되도록 설정 (몇초의 시간이 필요함)
- Impala Shell 등으로 테이블을 생성하고 이때 SET SYNC_DDL 옵션을 설정한 후에 메타데이터 변경 쿼리를 실행해야 함
- SELECT 위주의 시스템 인 경우 Impala Coordinator에 여러 개를 두어도 상관없이 잘 동작하나, DDL이 자주 발생하면 동기화에 대해서 잠시 여유가 있어야 함
- 타 사이트에서도 이를 대비하기 위해서 잠시 대기를 하거나
- ETL 처리 처럼 미리 테이블을 만들고 동기화가 없도록 하거나 하는 형태로 구현