23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
안녕하세요.
제가 이번에 공유드릴 내용은 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 구축을 고려하고 계신다면 참고가 되실 수도 있을 것 같습니다.
※ 보안에 민감한 이미지 내용 및 텍스트는 모자이크/임의변경 처리 했습니다.
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 유지 관리가 쉬움
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 유지 관리가 쉬움
OS : Linux(RHEL 8.4)
CPU : 48 Core
Disk(SSD) : 30 TB
Memory : 384 GB
Apache Kudu : 1.16.0
Apache Impala : 4.2.0
Apache Hadoop(Standalone) : 3.1.1
Apache Hive Metastore(Standalone) : 3.1.3
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
! 이미지 업로드 사이즈 조정으로 인해 해상도가 많이 낮은점 참고 바랍니다.
Installing Apache Kudu 문서에 따라서 Build를 진행.
Build 완료 후 kudu-master 와 kudu-tserver binary 파일을 참조.
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_cmdkudu 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_cmdkudu 실행 파일 및 config 파일을 Master 및 Tablet Server에 배포
※ 위 Kudu Dir 구조 및 환경 정보는 환경에 맞게 구성 필요
Installing Apache Impala 문서에 따라서 Build를 진행.
Build 완료 후 Impala binary 및 config 파일 참조
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=9Catalog 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]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
Impala 실행 파일을 포함한 Dir 각 서버에 배포
※ 위 Impala Dir 구조 및 환경 정보는 환경에 맞게 구성 필요
저의 경우는 Apache Kudu 및 Impala를 Build 하는 과정부터 시작해서 각 서비스별 기본 환경 구성을 하고
서비스를 구동하는 과정까지 수월하게 진행이 되지는 않아서 차근차근 Troubleshooting을 하면서 진행을 했습니다.
※ Elastic Stack 과 Grafana 관련한 부분은 이미 많이 알려진 Open Source여서 환경 구축 외에 Monitoring UI별로 구현한 로직 부분 위주로 간략히 공유 드리겠습니다.
각 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에 전달 하도록 했습니다.
Grafana를 이용한 Cluster Dashboard 구성
Kudu Master/Tablet Server에서 Kudu exporter 서비스 실행
Prometheus 서비스에서 Kudu exporter 서비스에 접속하여, Kudu Metric 정보를 연계
Grafana를 이용한 Kudu Cluster Dashboard 구성
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]
```
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}"
}
}
}
Grafana를 이용한 Impala Query Dashboard 구성
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 기반의 환경으로 구성해 보게 되었습니다.
이와 비슷한 환경을 검토하고 계신분이 있다면 도움이 되었으면 좋겠습니다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.