spark 1.6을 기준으로 spark sql에 대해서 개략적으로 설명한 자료입니다. 발표 자료가 친절하지 않으나 한글로 된 자료가 없길래 혹시나 도움 되시는 분들이 있을까 하여 공유합니다.
발표자료 보다는 마지막 페이지의 참고자료들을 읽어보시기를 권장 드립니다.
출처만 남겨주시면 자유롭게 가져가셔서 사용하셔도 무방합니다.
Apache kafka performance(throughput) - without data loss and guaranteeing dat...SANG WON PARK
Apache Kafak의 성능이 특정환경(데이터 유실일 발생하지 않고, 데이터 전송순서를 반드시 보장)에서 어느정도 제공하는지 확인하기 위한 테스트 결과 공유
데이터 전송순서를 보장하기 위해서는 Apache Kafka cluster로 partition을 분산할 수 없게되므로, 성능향상을 위한 장점을 사용하지 못하게 된다.
이번 테스트에서는 Apache Kafka의 단위 성능, 즉 partition 1개에 대한 성능만을 측정하게 된다.
향후, partition을 증가할 경우 본 테스트의 1개 partition 단위 성능을 기준으로 예측이 가능할 것 같다.
1일 수천대의 서버에서 발생하는 30~50억건의 Log와 Metric을 처리하는 Planet Mon 을 지탱하는 기술인 Collection(Collectd, NXlog), Transport(Kakfa, Logstash), Log Stream Analytics, Storage(Elasticsearch), Visualization을 구성하는 Architecture에 대해 설명드리고 제가 개발한 Log Stream Analytics 서버들의 구현 기술에 대해 좀더 상세히 설명합니다.
Cloud dw benchmark using tpd-ds( Snowflake vs Redshift vs EMR Hive )SANG WON PARK
몇년 전부터 Data Architecture의 변화가 빠르게 진행되고 있고,
그 중 Cloud DW는 기존 Data Lake(Hadoop 기반)의 한계(성능, 비용, 운영 등)에 대한 대안으로 주목받으며,
많은 기업들이 이미 도입했거나, 도입을 검토하고 있다.
본 자료는 이러한 Cloud DW에 대해서 개념적으로 이해하고,
시장에 존재하는 다양한 Cloud DW 중에서 기업의 환경에 맞는 제품이 어떤 것인지 성능/비용 관점으로 비교했다.
- 왜기업들은 CloudDW에주목하는가?
- 시장에는어떤 제품들이 있는가?
- 우리Biz환경에서는 어떤 제품을 도입해야 하는가?
- CloudDW솔루션의 성능은?
- 기존DataLake(EMR)대비 성능은?
- 유사CloudDW(snowflake vs redshift) 대비성능은?
앞으로도 Data를 둘러싼 시장은 Cloud DW를 기반으로 ELT, Mata Mesh, Reverse ETL등 새로운 생테계가 급속하게 발전할 것이고,
이를 위한 데이터 엔지니어/데이터 아키텍트 관점의 기술적 검토와 고민이 필요할 것 같다.
https://blog.naver.com/freepsw/222654809552
Vectorized Processing in a Nutshell. (in Korean)
Presented by Hyoungjun Kim, Gruter CTO and Apache Tajo committer, at DeView 2014, Sep. 30 Seoul Korea.
Apache kafka performance(latency)_benchmark_v0.3SANG WON PARK
Apache Kafka를 이용하여 이미지 데이터를 얼마나 빠르게(with low latency) 전달 가능한지 성능 테스트.
최종 목적은 AI(ML/DL) 모델의 입력으로 대량의 실시간 영상/이미지 데이터를 전달하는 메세지 큐로 사용하기 위하여, Drone/제조공정 등의 장비에서 전송된 이미지를 얼마나 빨리 AI Model로 전달 할 수 있는지 확인하기 위함.
그래서 Kafka에서 이미지를 전송하는 간단한 테스트를 진행하였고,
이 과정에서 latency를 얼마나 줄여주는지를 확인해 보았다.(HTTP 프로토콜/Socket과 비교하여)
[현재 까지 결론]
- Apache Kafka는 대량의 요청 처리를 위한 throughtput에 최적화 된 솔루션임.
- 현재는 producer의 몇가지 옵션만 조정하여 테스트한 결과이므로,
- 잠정적인 결과이지만, kafka의 latency를 향상을 위해서는 많은 시도가 필요할 것 같음.
- 즉, 단일 요청의 latency는 확실히 느리지만,
- 대량의 처리를 기준으로 평균 latency를 비교하면 평균적인 latency는 많이 낮아짐.
Test Code : https://github.com/freepsw/kafka-latency-test
Understanding of Apache kafka metrics for monitoring SANG WON PARK
2019 kafka conference seould에서 발표한 "Apache Kafka 모니터링을 위한 Metrics 이해" 슬라이드 자료
기존 2018년 자료에서 모니터링 관점에서 중요한 metrcis를 중심으로 정리하였고, 2019년 기준으로 추가/변경된 metrics를 반영하였다.
주용 내용은
- 업무에 최적화된 apache kafka 모니터링을 하려면?
- 어떤 정보를 모니터링 해야 할까?
- 적시성 관점의 모니터링 지표 (TotalTimeMs에 대한 세부 구조 이해)
- 안정성 관점의 모니터링 지표 (데이터 유실이 없이 중단없는 서비스)
- 언제 apache kafka 클러스터를 확장해야 할까? (어떤 지표를 봐야 할까?)
위 모든 지표는 producer/broker/consumer 3가지 측면에서 검토하였다.
컨퍼런스 영상 링크 : https://www.youtube.com/watch?v=p2RGsTOCHAg
Big Data Platform Field Case in MelOn (in Korean)
- Presented by Byeong-hwa Yoon, engineer manager at Loen Entertainment
- at Gruter TECHDAY 2014 Oct. 29 Seoul, Korea
Apache kafka performance(throughput) - without data loss and guaranteeing dat...SANG WON PARK
Apache Kafak의 성능이 특정환경(데이터 유실일 발생하지 않고, 데이터 전송순서를 반드시 보장)에서 어느정도 제공하는지 확인하기 위한 테스트 결과 공유
데이터 전송순서를 보장하기 위해서는 Apache Kafka cluster로 partition을 분산할 수 없게되므로, 성능향상을 위한 장점을 사용하지 못하게 된다.
이번 테스트에서는 Apache Kafka의 단위 성능, 즉 partition 1개에 대한 성능만을 측정하게 된다.
향후, partition을 증가할 경우 본 테스트의 1개 partition 단위 성능을 기준으로 예측이 가능할 것 같다.
1일 수천대의 서버에서 발생하는 30~50억건의 Log와 Metric을 처리하는 Planet Mon 을 지탱하는 기술인 Collection(Collectd, NXlog), Transport(Kakfa, Logstash), Log Stream Analytics, Storage(Elasticsearch), Visualization을 구성하는 Architecture에 대해 설명드리고 제가 개발한 Log Stream Analytics 서버들의 구현 기술에 대해 좀더 상세히 설명합니다.
Cloud dw benchmark using tpd-ds( Snowflake vs Redshift vs EMR Hive )SANG WON PARK
몇년 전부터 Data Architecture의 변화가 빠르게 진행되고 있고,
그 중 Cloud DW는 기존 Data Lake(Hadoop 기반)의 한계(성능, 비용, 운영 등)에 대한 대안으로 주목받으며,
많은 기업들이 이미 도입했거나, 도입을 검토하고 있다.
본 자료는 이러한 Cloud DW에 대해서 개념적으로 이해하고,
시장에 존재하는 다양한 Cloud DW 중에서 기업의 환경에 맞는 제품이 어떤 것인지 성능/비용 관점으로 비교했다.
- 왜기업들은 CloudDW에주목하는가?
- 시장에는어떤 제품들이 있는가?
- 우리Biz환경에서는 어떤 제품을 도입해야 하는가?
- CloudDW솔루션의 성능은?
- 기존DataLake(EMR)대비 성능은?
- 유사CloudDW(snowflake vs redshift) 대비성능은?
앞으로도 Data를 둘러싼 시장은 Cloud DW를 기반으로 ELT, Mata Mesh, Reverse ETL등 새로운 생테계가 급속하게 발전할 것이고,
이를 위한 데이터 엔지니어/데이터 아키텍트 관점의 기술적 검토와 고민이 필요할 것 같다.
https://blog.naver.com/freepsw/222654809552
Vectorized Processing in a Nutshell. (in Korean)
Presented by Hyoungjun Kim, Gruter CTO and Apache Tajo committer, at DeView 2014, Sep. 30 Seoul Korea.
Apache kafka performance(latency)_benchmark_v0.3SANG WON PARK
Apache Kafka를 이용하여 이미지 데이터를 얼마나 빠르게(with low latency) 전달 가능한지 성능 테스트.
최종 목적은 AI(ML/DL) 모델의 입력으로 대량의 실시간 영상/이미지 데이터를 전달하는 메세지 큐로 사용하기 위하여, Drone/제조공정 등의 장비에서 전송된 이미지를 얼마나 빨리 AI Model로 전달 할 수 있는지 확인하기 위함.
그래서 Kafka에서 이미지를 전송하는 간단한 테스트를 진행하였고,
이 과정에서 latency를 얼마나 줄여주는지를 확인해 보았다.(HTTP 프로토콜/Socket과 비교하여)
[현재 까지 결론]
- Apache Kafka는 대량의 요청 처리를 위한 throughtput에 최적화 된 솔루션임.
- 현재는 producer의 몇가지 옵션만 조정하여 테스트한 결과이므로,
- 잠정적인 결과이지만, kafka의 latency를 향상을 위해서는 많은 시도가 필요할 것 같음.
- 즉, 단일 요청의 latency는 확실히 느리지만,
- 대량의 처리를 기준으로 평균 latency를 비교하면 평균적인 latency는 많이 낮아짐.
Test Code : https://github.com/freepsw/kafka-latency-test
Understanding of Apache kafka metrics for monitoring SANG WON PARK
2019 kafka conference seould에서 발표한 "Apache Kafka 모니터링을 위한 Metrics 이해" 슬라이드 자료
기존 2018년 자료에서 모니터링 관점에서 중요한 metrcis를 중심으로 정리하였고, 2019년 기준으로 추가/변경된 metrics를 반영하였다.
주용 내용은
- 업무에 최적화된 apache kafka 모니터링을 하려면?
- 어떤 정보를 모니터링 해야 할까?
- 적시성 관점의 모니터링 지표 (TotalTimeMs에 대한 세부 구조 이해)
- 안정성 관점의 모니터링 지표 (데이터 유실이 없이 중단없는 서비스)
- 언제 apache kafka 클러스터를 확장해야 할까? (어떤 지표를 봐야 할까?)
위 모든 지표는 producer/broker/consumer 3가지 측면에서 검토하였다.
컨퍼런스 영상 링크 : https://www.youtube.com/watch?v=p2RGsTOCHAg
Big Data Platform Field Case in MelOn (in Korean)
- Presented by Byeong-hwa Yoon, engineer manager at Loen Entertainment
- at Gruter TECHDAY 2014 Oct. 29 Seoul, Korea
2. Agenda
• Introduction
• 콘텐츠소비통계
• Part I - Architecture
• Initial Architecture -> Problems & Solutions -> Proven Architecture
• Data Pipelines
• Part II - Lessons Learned
• 성능 개선 Tip
• 운영 Tip
2017.06.22. 밋업 발표 내용
3. Part 1 발표 영상 https://youtu.be/Mc9gy-5d60w?t=10m40s
4. 콘텐츠소비통계
회사 내부 직원용이 아닌,
네이버 사용자를 위한 서비스
네이버 블로그
(2016.06. 서비스 시작)
공통통계플랫폼
(2016.01. 개발 시작)
네이버 사용자
YYY 서비스
(2017.07. 서비스 시작)
다양한 네이버의 서비스들
OOO 서비스
(2016.09. 서비스 시작)
…
…
XXX 서비스
(2017.10. 서비스 계획)
…
9. Agenda
• Introduction
• 콘텐츠소비통계
• Part I - Architecture
• Initial Architecture -> Problems & Solutions -> Proven Architecture
• Data Pipelines
• Part II - Lessons Learned
• 성능 개선 Tip
• 운영 Tip
8월 10일 밋업 내용
11. Execution Hint (2)
SELECT u, COUNT(*)
FROM tab
WHERE <조건>
GROUP BY u
SQL 실행 순서
1. "조건에 맞는 문서" 조회
2. u field로 Aggregation
예상수행 시간
- Matching Document 개수에 비례
- "조건에 맞는 문서" 개수가 0건이면 0초에 가까워야 한다
- Aggregation할 대상이 없으므로
15. JVM Tuning (3)
JVM Option – OLD Gen.으로 옮길 경향을 줄인다
-XX:MaxTenuringThreshold=15
-XX:NewRatio=7
-XX:SurvivorRatio=3
-XX:-UseAdaptiveSizePolicy
<Default GC Option> <GC Tuning>
Node별 GC 옵션을 다르게 한 뒤 입수 시, Heap 사용량 그래프
16. g1 gc (1)
• 100B docs are indexed
• 5 nodes in the cluster
• 3 nodes with cms gc
• 2 nodes with g1 gc
-XX:+UseG1GC
-XX:+PerfDisableSharedMem
-XX:+ParallelRefProcEnabled
-XX:G1HeapRegionSize=8m
-XX:MaxGCPauseMillis=250
-XX:InitiatingHeapOccupancyPercent=75
-XX:+UseLargePages
-XX:+AggressiveOpts
<g1 gc option>
https://wiki.apache.org/solr/ShawnHeisey#GC_Tuning
<Disclaimer>
elastic.co would like to recommend G1GC someday,
but not for now
18. g1 gc (3)
[INFO ][monitor.jvm ]
[hostname] [gc][old][109757][7966]
duration [15.9s], collections
[2]/[16.2s], total [15.9s]/[12.8m],
memory [12.9gb]->[11.2gb]/[14.5gb],
all_pools {[young] [1.2gb]-
>[146.1mb]/[1.2gb]}{[survivor]
[394.7mb]->[0b]/[438.8mb]}{[old]
[11.3gb]->[11gb]/[12.8gb]}
[2017-01-02 01:47:16,525][WARN ][monitor.jvm ]
[hostname] [gc][old][111127][1] duration [14.4s],
collections [1]/[15.2s], total [14.4s]/[14.4s],
memory [13.5gb]->[11.2gb]/[15gb], all_pools
{[young] [176mb]->[40mb]/[0b]}{[survivor]
[96mb]->[0b]/[0b]}{[old] [13.2gb]-
>[11.2gb]/[15gb]}
[2017-01-02 03:28:27,815][WARN ][monitor.jvm ]
[hostname] [gc][old][117128][2] duration [12.6s],
collections [1]/[13.5s], total [12.6s]/[27s],
memory [14.1gb]->[11gb]/[15gb], all_pools
{[young] [320mb]->[112mb]/[0b]}{[survivor]
[96mb]->[0b]/[0b]}{[old] [13.8gb]-
>[10.9gb]/[15gb]}
<cms gc>
stw occurred 1 time, 16.2s
<g1 gc>
stw occurred 2 times, 28.7s
STW with g1 gc took a longer time than cms gc
19. Circuit Breaker (1)
SELCT c, u, COUNT(*)
FROM monthly_idx // 수십억건짜리 Index
GROUP BY c, u
과도한 메모리 사용
GROUP BY with more than two high cardinality fields causes OOM
Full GC만 계속 발생
모든 질의에 대한 응답 없음 ES Full Start 방법 밖에 없음
20. Circuit Breaker (2)
• 전체 메모리의 2.5% 이상 사용 시, 수행 중인 Query가 Fail되지만,
• Cluster 전체가 먹통되는 현상 방지 가능
PUT /_cluster/settings
{
"persistent": {
"indices.breaker.request.limit": "2.5%"
}
}
21. Index 휴지통 기능 (1)
• 사전 개념 - alias
daily_2017.01.01
(alias)
daily_2017.01.01_ver_1
(실제 index)
장점
Partial Data가 서비스 되는 것을 맊을 수 있음
(all or nothing)
입수 중
Client
조회 요청
Alias가 없으므로
조회되는 Data 없음
22. Index 휴지통 기능 (2)
• 사전 개념 - alias
daily_2017.01.01
(alias)
daily_2017.01.01_ver_1
(실제 index)
Data가 온전히 입수 완료되었을 경우에만 alias 생성
입수 완료
Client
조회 요청
ver_1에 속한
Data가 전송
23. Index 휴지통 기능 (3)
• 사전 개념 - alias
daily_2017.01.01
(alias)
daily_2017.01.01_ver_1
(실제 index)
Rollback도 가능
재입수
daily_2017.01.01_ver_2
(실제 index)
Client
조회 요청
ver_2에 속한
Data가 전송 입수 완료 후 alias 교체
24. Index 휴지통 기능 (4)
daily_2017.01.01
(alias)
daily_2017.01.01_ver_1
(실제 index)
.Trash
(alias)
index 삭제 – Alias만 끊는다. Data 조회 안 됨
주기적으로 .Trash에 Alias 걸린 Index 삭제
Client
25. Index 휴지통 기능 (5)
daily_2017.01.01
(alias)
daily_2017.01.01_ver_1
(실제 index)
.Trash
(alias)
실수로 삭제한 경우 Alias만 교체하면 됨
Client
27. 적절 Shard 개수, Size
Num of shards Docs per shard shard size Query 1 (sec) Qeury 2 (sec) Query 3 (sec)
5 4천만 17GB 0.6524 0.7728 0.8876
10 2천만 8.5GB 0.5328 0.5554 0.4526
20 1천만 4.2GB 0.8972 0.5044 0.5578
Shard Size별 Query 응답 시간 조사
문서 개수 2억개 기준
• Shard Size별 응답 시간이 크지 않음
• 저희는 Shard Size를 10GB 이내로 사용 중입니다
• Index 개수가 많지 않은 경우 Shard 개수는 (Core 개수 * 2)개 정도가 좋습니다
28. Reduce Disk Size
• Disabling _all field: 18.6% 감소
• Disabling _source field: 20% reduced
• Think before disabling the _source field
29. Logstash option for exactly-once (1)
Options for File input
• start_position => "beginning" for log rotate
• http://jason-heo.github.io/elasticsearch/2016/02/28/logstash-offset.html
Options for Kafka Output
• acks => "all"
• retries => n
30. Logstash option for exactly-once (2)
access_log
stat_interval (1초)
discover_interval (15초)
log rotate 시점
(신규 파일 생성)
end인 경우 유실 발생
• stat_interval: 파일 갱신 여부 검사 주기
• discover_interval: pattern에 맞는 신규 파일 생성 여부 검사 주기
access_log
신규 파일 인지 시점
31. Logstash option for exactly-once (3)
Broker 1
Leader
Broker 2
Follower 1
output
{
kafka {
...
compression_type => 'gzip'
acks => "all" # default:1
retries => 5 # defualt:0
}
}
Broker n
Follower m
ack
ack
The leader waits for all the acks sent by followers
Pros: Strongest available guarantee.
Cons: Slow
cf) acks=>"1" means that the leader will respond
without waiting the follower's ack
Option for the Kafka Output
33. Nested Document format (2)
sqlContext.sql("
SELECT c, u, g, a, COUNT(*) AS pv
FROM logs
GROUP BY c, u, g, a
").saveToEs("index_name/doc_type")
일반적인 저장 모델 - Flattened Doc Model
<입수 스크립트>
[
{
"c": "blogger1",
"u": "url1",
"g": "m",
"a": "1",
"pv": 10"
},
{
"c": "blogger1",
"u": "url1",
"g": "f",
"a": "2",
"pv": 20"
}
]
<문서 포맷>
Data 중복
34. Nested Document format (3)
case class PageView(g: String, a: String, pv:
Integer)
sqlContext.udf.register("page_view", (c: String, u:
String, pv: Integer) => PageView(c, u, pv))
sqlContext.sql("
SELECT c, u, COLLECT_LIST(page_view) AS page_views
FROM (
SELECT c, u, page_view(g, a, pv) AS page_view
FROM (
SELECT c, u, g, a, COUNT(*) AS pv
FROM logs
GROUP BY c, u, g, a
) t1
) t2
GROUP BY c, u
").saveToEs("index_name/doc_type")
Nested Doc Model
<입수 스크립트>
[
{
"c": "blogger1",
"u": "url1",
"page_views": [
{
"g": "m",
"a": "1",
"pv": 10"
},
{
"g": "f",
"a": "2",
"pv": 20"
}
]
}
]
중복 제거
35. Nested Document format (4)
• Pros
• Data size is 49% smaller than Flattened Model
• Bulk Loading time is 52% faster than Flattened Model (including
extra processing time)
• Cons
• Extra processing is required using SparkSQL
• But the bottleneck is saving the result to ES. Extra processing time is not a
problem
• ES gets slower when nested field has too many children
• So, use it when the number of children is small
36. {
"properties" : [
...
"c" : {
...
},
"type" : {
...
},
...
]
}
복합 필드 (1)
초기 Schema
질의 패턴
• c로도 조회: 5%
• type으로 조회: 3%
• 두 개 필드 AND 조회: 92%
위의 질의 패턴을 모두 지원해야 함
참고: ES에는 복합키 개념이 없다
38. 복합 필드 (3)
응답 속도 40% 개선 (Page Cache Miss 시)
{
"query_type": "BooleanQuery",
"lucene": "+c:blogger_id +type: channel_cv"
"time": "269.686223ms"
}
{
"query_type": "ConstantScoreQuery",
"lucene": "ConstantScore (ctype:c:blogger_id:channel_cv)",
"time": "124.790570ms"
}
<ES Query Profile 결과>
39. single doc의 일부 field 조회 개선 (1)
{
"query": {
"bool": {
"must": [ {
"term": {
"primary_key": "xx"
}
}]
}
},
"_source": {
"includes": ["pv"]
}
}
SELECT pv
FROM tab
WHERE primary_key = 'xx'
<DSL>
<SQL>
_source 필드에서 Data 조회
40. single doc의 일부 field 조회 개선 (2)
{
"query": {
...
...
},
"aggregations": {
"MAX(pv)": {
"max": {
"field": "pv"
}
}
}
}
SELECT MAX(pv)
FROM tab
WHERE primary_key = 'xx'
<DSL>
<SQL>
Doc Value에서 Data 조회
조회 문서가 1건이므로
pv = MAX(pv) = MIN(pv) = AVG(pv)
41. single doc의 일부 field 조회 개선 (3)
Query 조회 방식 처리량 (QPS) 평균 응답 시간 (ms)
Q1
_source 활용 4,604 107
Doc Value 활용 7,484 66
Q2
_source 활용 5,024 98
Doc Value 활용 7,595 65
43. single doc의 일부 field 조회 개선 (5)
• ES 5.x에는 Doc Value Fields라는 것이 생겼음
• 앞 장과 같은 용도로 사용되는 것인지는 테스트 못해 봤습니다 ㅠㅠ
GET /_search
{
"query" : {
"match_all": {}
},
"docvalue_fields" : ["test1", "test2"]
}
51. Q. 엘라스틱서치와 스파크의 연동작업 중 주의해야할 사항 또는 같이 사용
했을 때의 시너지 효과에 대해 묻고 싶습니다
A.
WRITE 관점 관점 READ 관점
• 입수가 편하다
• dataframe을 saveToEs()만
호출하면 자동 입수
• 에러 처리를 es-hadoop이 다 해줌
• 다양한 옵션들
• 입수 진행율을 Spark Job 모니터링
을 통해서 쉽게 알 수 있다
• 편하다
• 다양한 Data Source와 JOIN 가능
• Index Backup이 쉽다
• filter push down
주의 사항
Write 관점: Spark worker 개수를 늘려도 어느 임계점 이후부터는 CPU 사용량만 많아질 뿐
indexing rate는 동일
Read 관점: Shard 개수와 worker 개수를 맞추는 것이 좋음