데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      Open Source 기반의 Big Data Platform 구축 - Apache Kudu & Impala

      나무 23.07.11
      2,425 9 0

      안녕하세요.

      제가 이번에 공유드릴 내용은 Open Source 기반의 OLAP workeloads에 최적화된 분산 Storage인 Apache Kudu와

      분산 Computing 환경을 제공하는 MPP(Massively Parallel Processing) SQL Query engine인 Apache Impala 환경 구성입니다.

      그밖에 각 서비스의 Monitoring 관련한 Open Source와 간략한 구성 정보를 공유 해드리고자 합니다.

      소개될 Architecture는 모두 Open Source 기반의 Solution으로만 구성을 하였으므로, 이와 같은 Big Data Platform 구축을 고려하고 계신다면 참고가 되실 수도 있을 것 같습니다.


      ※ 보안에 민감한 이미지 내용 및 텍스트는 모자이크/임의변경 처리 했습니다.


      Apache Kudu

      image.png

      https://kudu.apache.org

      • Cloudera에서 C++ 기반으로 개발되었으며, Apache 재단에서 관리하는 Open Source

      • OLTP와 OLAP 특징을 결합한 HTAP(Hybrid Transactional/Analytic Processing) 구조

        • Realtime high performance Writes

        • Concurrent SQL Reads

      • RDBMS와 유사한 구조화된 데이터 모델(Column/Primary Key Design/Partitioning 등)

      • Apache Impala와 최적의 성능 조합을 이루며, Apache NiFi 및 Apache Spark와의 통합 지원

      • Master 및 Tablet 서버의 Raft Consensus 알고리즘을 사용한 HA 지원 (Tablet Replica별 Tablet 서버 각각의 Leader/Follower 구조)

      • 장애 감지 및 복구 : 복제본에 장애가 발생한 경우, 사용 가능한 다른 Tablet 서버로 자동 복제 (Leader 복제본 장애시에도)

      • 서비스 및 Cluster 유지 관리가 쉬움


      Apache Impala

      image.png

      https://impala.apache.org

      • Cloudera에서 C++, Java 기반으로 개발되었으며, Apache 재단에서 관리하는 Open Source

      • HDFS 및 Kudu Storage 환경의 대용량 Data를 처리할 수 있는 고성능 SQL Query engine

        • in-Memory 기반의 Data 처리

        • SELECT, Joins, and Aggregate Functions등을 포함한 SQL (HiveQL) syntax 지원

        • JDBC/ODBC driver 제공

      • Impala Daemon UI에서 제공하는 상세한 Query Plan/Profile 및 모니터링 기능 제공

      • 서비스 및 Cluster 유지 관리가 쉬움


      Cluster 환경 정보

      OS Version 및 H/W Spec

      • OS : Linux(RHEL 8.4)

      • CPU : 48 Core

      • Disk(SSD) : 30 TB

      • Memory : 384 GB

      Component Version

      • Apache Kudu : 1.16.0

      • Apache Impala : 4.2.0

      • Apache Hadoop(Standalone) : 3.1.1

      • Apache Hive Metastore(Standalone) : 3.1.3

      Eco-System Version

      • Elastic Stack

        • Elastic Search : 7.0.0

        • Kibana : 7.0.0

        • Filebeat : 7.0.0

        • Logstash : 7.0.0

        • Metricbeat : 7.10.2

      • Prometheus : 2.45.0

      • Node Exporter : 1.3.1

      • Grafana : 8.3.4


      Platform Architecture

      image_arch_2.jpg

      ! 이미지 업로드 사이즈 조정으로 인해 해상도가 많이 낮은점 참고 바랍니다.


      Apache Kudu Build 및 환경 구성

      1. Installing Apache Kudu 문서에 따라서 Build를 진행.

      2. Build 완료 후 kudu-master 와 kudu-tserver binary 파일을 참조.

        image.png

      3. kudu master config 파일 생성 : /etc/kudu/master.gflagfile

        -default_num_replicas=3
        -fs_data_dirs=/data01/kudu_master/fs_data_dirs
        -fs_wal_dir=/data01/kudu_master/fs_wal_dir
        -log_dir=/var/log/kudu
        -log_force_fsync_all=false
        -logbuflevel=0
        -max_log_size=1800
        -minloglevel=0
        -superuser_acl
        -user_acl=*
        -v=0
        -webserver_certificate_file
        -webserver_port=8051
        -webserver_private_key_file
        -webserver_private_key_password_cmd
      4. kudu tablet server config 파일 생성 : /etc/kudu/tserver.gflagfile

        -block_cache_capacity_mb=1024
         -fs_data_dirs=/data[01-10]/kudu_tablet/fs_data_dirs
         -fs_wal_dir=/data01/kudu_tablet/fs_wal_dir
         -log_dir=/var/log/kudu
         -log_force_fsync_all=false
         -logbuflevel=0
         -maintenance_manager_num_threads=1
         -max_log_size=1800
         -memory_limit_hard_bytes=17179869184
         -minloglevel=0
         -superuser_acl
         -user_acl=*
         -v=0
         -webserver_certificate_file
         -webserver_port=8050
         -webserver_private_key_file
         -webserver_private_key_password_cmd
      5. kudu 실행 파일 및 config 파일을 Master 및 Tablet Server에 배포

      ※ 위 Kudu Dir 구조 및 환경 정보는 환경에 맞게 구성 필요


      Apache Impala Build 및 환경 구성

      1. Installing Apache Impala 문서에 따라서 Build를 진행.

      2. Build 완료 후 Impala binary 및 config 파일 참조

        image.png

      3. Statestore config 파일

        -state_store_pending_task_count_max=0
        -max_log_files=10
        -state_store_port=24000
        -enable_webserver=true
        -webserver_port=25010
        -state_store_num_server_worker_threads=8
        -log_filename=statestored
        -log_dir=/var/log/statestore
        -log_link=
        -log_prefix=true
        -logbuflevel=0
        -logbufsecs=30
        -logemaillevel=999
        -logmailer=/bin/mail
        -logtostderr=false
        -redaction_rules_file=/opt/impala/conf/redaction-rules.json
        -minidump_path=/var/log/impala-minidumps
        -max_minidumps=9
      4. Catalog Server config 파일

        -catalog_service_port=26000
        -max_log_files=10
        -enable_webserver=true
        -load_auth_to_local_rules=false
        -load_catalog_in_background=false
        -webserver_port=25020
        #-sentry_config=/opt/impala/conf/impala-conf/sentry-site.xml
        -log_filename=catalogd
        -log_dir=/var/log/catalogd
        -log_link=
        -log_prefix=true
        -logbuflevel=0
        -logbufsecs=30
        -statestore_subscriber_timeout_seconds=300
        -state_store_host=[Statestore Server FQDN]
        -state_store_port=24000
        -redaction_rules_file=/opt/impala/conf/redaction-rules.json
        -minidump_path=/var/log/impala-minidumps
        -max_minidumps=9
        -hostname=[Local FQDN]
      5. Daemon(Coordinator/Executor) config 파일

        -beeswax_port=21000
        -fe_port=21000
        #-be_port=22000
        -krpc_port=27000
        #-llama_callback_port=28000
        -hs2_port=21050
        -fe_service_threads=128
        -enable_webserver=true
        #-mem_limit=120259084288
        -mem_limit=274877906944
        -idle_query_timeout=300
        -idle_session_timeout=600
        -max_log_files=10
        -webserver_port=25000
        -max_result_cache_size=100000
        -max_cached_file_handles=20000
        -unused_file_handle_timeout_sec=21600
        -state_store_subscriber_port=23000
        -statestore_subscriber_timeout_seconds=300
        -default_query_options=EXEC_TIME_LIMIT_S=1800
        -load_auth_to_local_rules=false
        -log_filename=impalad
        -log_dir=/var/log/impalad
        -log_link=
        -log_prefix=true
        -logbuflevel=0
        -logbufsecs=30
        -logemaillevel=999
        -logmailer=/bin/mail
        -logtostderr=false
        -audit_event_log_dir=/var/log/impalad/audit
        -max_audit_event_log_file_size=5000
        -abort_on_failed_audit_event=false
        -minidump_path=/var/log/impala-minidumps
        -max_minidumps=9
        -lineage_event_log_dir=/var/log/impalad/lineage
        -max_lineage_log_file_size=5000
        -hostname=[Local FQDN]
        -state_store_host=[Statestore Server FQDN]
        -state_store_port=24000
        -catalog_service_host=[Catalog Server FQDN]
        -catalog_service_port=26000
        -authorized_proxy_user_config=hue=*
        -local_library_dir=/var/lib/impala/udfs
        -fair_scheduler_allocation_path=/opt/impala/conf/impala-conf/fair-scheduler.xml
        -llama_site_path=/opt/impala/conf/impala-conf/llama-site.xml
        -queue_wait_timeout_ms=60000
        -disk_spill_encryption=false
        -abort_on_config_error=true
        -redaction_rules_file=/opt/impala/conf/redaction-rules.json
        #-is_coordinator=false
        -is_executor=false
        -convert_legacy_hive_parquet_utc_timestamps=true
        -query_log_size=500
        -kudu_master_hosts=[Kudu Master01 FQDN]:7051,[Kudu Master02 FQDN]:7051,[Kudu Master03 FQDN]:7051
        
      6. Impala 실행 파일을 포함한 Dir 각 서버에 배포

      ※ 위 Impala Dir 구조 및 환경 정보는 환경에 맞게 구성 필요


      저의 경우는 Apache Kudu 및 Impala를 Build 하는 과정부터 시작해서 각 서비스별 기본 환경 구성을 하고

      서비스를 구동하는 과정까지 수월하게 진행이 되지는 않아서 차근차근 Troubleshooting을 하면서 진행을 했습니다.


      Monitoring 환경 구성

      ※ Elastic Stack 과 Grafana 관련한 부분은 이미 많이 알려진 Open Source여서 환경 구축 외에 Monitoring UI별로 구현한 로직 부분 위주로 간략히 공유 드리겠습니다.

      Cluster Metric Monitoring

      1. 각 Node별 Metricbeat를 설치하여 Elasticsearch에 Host metric 정보 전송

        • 위 Architecture 이미지의 환경 구성에서 Metricbeat 정보를 ES(Elastic Search)에 직접 보내지 않고, Logstash를 경유 한 이유는,

          사내 구성된 Cluster 환경이 Master Node를 제외한 Worker Node에는 Private IP만을 할당 하고 있어서,

          Public/Private IP가 할당된 Master Node에 구성된 Logstash를 통한 tunneling 방식으로 Worker Node들의 Metric 정보를 ES에 전달 하도록 했습니다.

      2. Grafana를 이용한 Cluster Dashboard 구성

        cluster_metric (2).jpg


      Kudu Cluster Monitoring

      1. Kudu Master/Tablet Server에서 Kudu exporter 서비스 실행

      2. Prometheus 서비스에서 Kudu exporter 서비스에 접속하여, Kudu Metric 정보를 연계

      3. Grafana를 이용한 Kudu Cluster Dashboard 구성

        kudu_cluster.jpg


      Impala Query Monitoring

      1. Coordinator 서버에서 Filebeat를 이용하여 Impala Audit 및 Lineage 정보를 Logstash에 전달

        • filebeat.yml 설정 파일 일부

            filebeat.inputs:
        
            # Each - is an input. Most options can be set at the input level, so
            # you can use different inputs for various configurations.
            # Below are the input specific configurations.
        
            - type: log
        
              # Change to true to enable this input configuration.
              enabled: true
        
              # Paths that should be crawled and fetched. Glob based paths.
              paths:
                - /var/log/impalad/audit/impala_audit_event_log_*
              json.keys_under_root: true
              json.add_error_key: true
              encoding: utf-8
              tags: [coordinator01_audit_log]
            - type: log
              enabled: true
              paths:
                - /var/log/impalad/lineage/impala_lineage_log_*
              json.keys_under_root: true
              json.add_error_key: true
              encoding: utf-8
              tags: [coordinator01_lineage_log]
        
            ```
        
      2. Filebeat에서 전달 받은 Audit/Lineage 정보를 Logstash pipeline에서 Parsing 및 전처리 후에 ES에 전송

        • logstash.conf 파일

        input {
          beats {
            port => 5044
          }
        }
        
        filter {
          json {
            source => "message"
          }
        
        if "coordinator01_audit_log" in [tags] or "coordinator02_audit_log" in [tags] {
         ruby {
        
          code => "
                begin
                    keys = event.to_hash.keys
                    keys.each{|key|
                        if ( key =~ /[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/ )
                            newkey = key.gsub(/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/, 'audit_log')
                            event.set(newkey, event.remove(key))
                        end
                    }
                    event.set('[audit_log][sql_statement]', event.get('[audit_log][sql_statement]')[0..100])
        
                rescue Exception => e
                    event.set('logstash_ruby_exception', 'underscores: ' + e.message)
                end
                "
          }
        
          #mutate {
            #remove_field => [ "[audit_log][sql_statement]" ]
          #}
        }
        
        else if "coordinator01_lineage_log" in [tags] or "coordinator02_lineage_log" in [tags] {
          mutate {
            remove_field => [ "[edges]", "[vertices]" ]
          }
        
          ruby {
            code => "
              s_time = Integer(event.get('timestamp'))
              e_time = Integer(event.get('endTime'))
              value = (e_time - s_time)
              event.set('query_duration', value)
              event.set('[queryText]', event.get('[queryText]')[0..100])
            "
          }
        }
        
        }
        
        output {
        
          if "coordinator01_audit_log" in [tags] or "coordinator02_audit_log" in [tags] {
              elasticsearch {
                hosts => ["ElasticSearch IP:9200"]
                index => "cluster-impala-audit-log-%{+YYYY.MM.dd}"
              }
          }
        
          if "coordinator01_lineage_log" in [tags] or "coordinator02_lineage_log" in [tags] {
              elasticsearch {
                hosts => ["ElasticSearch IP:9200"]
                index => "cluster-impala-lineage-log-%{+YYYY.MM.dd}"
              }
          }
        }
        
      3. Grafana를 이용한 Impala Query Dashboard 구성

        impala_query.jpg


      맺음 글

      Apache Kudu는 HBase와 Parquet의 장점을 조합하여 랜덤 액세스와 순차 읽기에 강한 구조로 설계되었습니다.

      Impala를 이용한 Data Insert/Upsert시에 1 row 기준 약 1KB 정도의 Data를 초당 4~500만 rows 정도로 Write 하는 속도를 보여줬습니다.

      Kudu와 Impala의 안정성은 많이 성숙되었으며 동시 처리 성능과 확장성도 뛰어나서 Production 환경에서 운영하기에 장점이 많은 것 같습니다.

      다만, Open Source 기반의 환경에서 운영을 한다는 것은 관리나 Troubleshooting에 많은 노력을 들여야 하는 어려움이 있습니다.

      Cloudera Platform과 같은 상용 버전을 사용하면 편하겠지만, 비용 절감과 기술 내재화 차원에서 Open Source 기반의 환경으로 구성해 보게 되었습니다.


      이와 비슷한 환경을 검토하고 계신분이 있다면 도움이 되었으면 좋겠습니다.

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      나무 님의 최신 블로그

      더보기
      동영상 기고하기