SlideShare a Scribd company logo
1 of 35
Download to read offline
금융사 프로젝트 Deep Dive
2019. 2. 22
이은학
Agenda
01
We are
하는일
02
Project Case
프로젝트 사례
- 활용 영역
- 설계 & 구축
- 아키텍처
- 데이터 파이프라인
03
Audit
사용자쿼리기록
- 남기는 법
- 문제점
- 해결책
- 활용
04
Privacy
개인정보 비식별화
- Logstash Ruby Filter
- 성명
- 카드번호, 주민번호
- 주소
05
빅데이터 에코시스템 연계
- ES <-> Hadoop 연계
- 명사 별도 적재
Connect BigData ecosystem
Data Solution Team
빅데이터 플랫폼 구축 및 활용솔루션 개발
하는 일
Elasticsearch 클러스터 운영
EC Seoul 운영
* Seoul Region 의 Elasticsearch SaaS
프로젝트내 Elastic Stack 활용 영역
• 비정형데이터 분석
• 3rd Party Solution APM
- Google Analytics
- 고객 상담데이터(STT)
- 웹/앱 로그
- Docker Host
- Docker Containers
- Apache Server Error
설계&구축
클러스터 설계 방향
- Index Lifecycle 을 고려한 Hot/Warm 아키텍쳐
(HA를 위해 Index가 동일 서버에 저장되지 않도록)
- 노드별로 확장 가능한 아키텍쳐
(필요한 경우 각 영역에 노드 추가 용이)
- 가능한 단순한 아키텍쳐 지향
(유지보수 편의)
Architecture
Elastic#1 Elastic#2 Elastic#3 Elastic#4 Elastic#5
ES
(4Cores,
64GB)
Hot node(SSD)
Hadoop
Zone1 Zone2 Zone3
ES7
(4cores,
64GB)
ES9
(4cores,
64GB)
Zone4 Zone5
ES8
(4cores,
64GB)
ES10
(4ores,
64GB)
Warm node(HDD)
Web/app
STT
Coordinating
Node
(4cores , 64GB)
Logstash
(4cores, 32GB)
beats
beats
(TLS enabled:CERT mode, 9300,9301 port)
HTTPS
Logstash
(4cores, 32GB)
Coordinating
Node
(4cores , 64GB)
searchKibanasAPI
Ingest pipeline
LB
Ingest
8Cores
Physical 256GB RAM
Kibanas
KafkaKafka
ES
(4Cores,
64GB)
ES
(4Cores,
64GB)
ES
(4Cores,
64GB)
ES
(4Cores,
64GB)
ES
(4Cores,
64GB)
5 Master node (1 Master, 4 eligible nodes)
10 Data nodes(6 hots, 4 warms)
beatsDocker
GA beats
ES-Hadoop(Library)
Streaming
Batch
Data Pipeline
Elasticsearch
Master Nodes (5)
Data Nodes (10)
Messaging
Queue
Kafka
Beats
Logstash
hot warm
Multi nodes(min 2)
Hadoop
Nodes (10+)
* RESTFul 한글 형태소 분석기
Chatbot
0.1 Sec ▼
5.0 Sec ▲
* RESTFul Data Server
용도: 대용량 배치
Audit – 사용자쿼리 기록
요구사항 : 모든 사용자의 쿼리는 이력 관리가 필요함(금융감독원 감사)
이슈 : Query, UserID 동시에 남아야 함
* 6.5.1 부터 UserID 를 남길 수 있음
(2018.11)
Audit – 기록 방법
xpack.security.audit.enabled: true
xpack.security.audit.outputs: [index, logfile]
xpack.security.audit.logfile.events.ignore_filters:
example1:
users: ["kibana", "admin_user", "elastic"]
- elasticsearch.yml
logfile로 남겨야 userID가 남음
제외할 ID(이 부분 없을 시 10node 기준 일 아무 이벤트 없어도 160GB 발생)
*클러스터 노드 간의 통신도 기록
Audit – 적재 방법
- audit1.conf
filter {
json {
source => "message"
}
if [message] !~ "url.path" {
drop {}
} else {
mutate {
split => { "url.path" => "/" }
}
if [url.path][1] == "_xpack" {
if [url.path][2] != "sql" {
drop {}
}
else if [url.path][1] == "_aliases" { drop {} }
else if [url.path][1] == "_mapping" { drop {} }
else if [url.path][1] == "_template" { drop {} }
mutate { join => { "url.path" => "/"} }
}
mutate {
join => { "url.path" => "/" }
}
}
mutate { remove_field => ["message" ] }
}
input {
beats {
port => 5046
type => json
}
}
output {
elasticsearch {
hosts => ["https://127.0.0.1:9200"]
index => “audit-%{+yyyy.MM.dd}"
user => "elastic"
password => "changeme"
ssl => true
ssl_certificate_verification => false
}
}
정책에 맞게 필터링
Audit – 활용 사례(1)
{
"count" : 300000
}
curl -XGET http://localhost:9200/sampledata-2019/_count
curl -XGET "http://localhost:9200/sampledata-2019/_search" -H
'Content-Type: application/json' -d'
{
"sort": [
{
"@timestamp": {
"order": "asc"
}
}
],
"from": 0, #(10, 20, 30, 40 ...)
"size": 10
}'
{
"took" : 56,
"timed_out" : false,
"_shards" : {…},
"hits" : {
"total" : 300000,
"max_score" : null,
"hits" : [
{...},
{...},
{...},
…
]
}
}
- 건수 확인
- 조회(페이징)
Audit – 활용 사례(2)
- 페이징 사용시 주의사항
{
"error": {
"root_cause": [
{
"type": "query_phase_execution_exception",
"reason": "Result window is too large, from + size must be less than or equal to: [10000] but was [300000].
See the scroll api for a more efficient way to request large data sets.
This limit can be set by changing the [index.max_result_window] index level setting."
}
],
…
}
curl -XPUT "http://localhost:9200/basic-logstash-
2016/_settings" -H 'Content-Type: application/json' -d'
{
"index": {
"max_result_window": 300000
}
}‘
curl -XPUT "http://localhost:9200/basic-logstash-
2016/_settings" -H 'Content-Type: application/json' -d'
{
"index": {
"max_result_window": null
}
}‘
- 설정: max_result_window - 해제 : max_result_window
개인정보 비식별화
요구사항 : 개인정보는 반드시 비식별처리 되어야 한다.
이슈 : 비정형 테이터의 특성상 개인정보의 식별범위 모호
안녕하세요 홍길동 고객님 용산구 갈월동에 거주하시나요?
제 카드 번호는 삼사오칠 다시 구구팔사 칠육오삼….
- 예문
- 패턴
성명 : XXX 회원님, XXX 님
카드번호, 주민번호 : 연속되는 숫자(영|일|이|삼|사|오|육|칠|팔|구|십|열)
- 치환
주소 : 행정구역 단어 20,000 여건
로직처리 가능
개인정보 비식별화 – Ruby Filter(1)
…
def filter(event)
ratogtxt = event.get('ratogtxt')
ratogtxt = ratogtxt&.gsub(/s[가-힣]+s고객님/) { |match| ("*" * match.length) + "고객님" }
ratogtxt = ratogtxt&.gsub(/s[가-힣]+s님/) { |match| ("*" * match.length) + "님" }
ratogtxt = ratogtxt.gsub(/s[공|영|일|이|삼|사|오|육|칠|팔|구|십|열|s]{4, 13}/) { |match| "*" * match.length }
replacements = [
["...도로명...", "*"],
["가가로", "*"],
["충남", "*"],
["충청북도", "*"],
["충북", "*"]
]
replacements.each { |replacement| ratogtxt&.gsub!(replacement[0], replacement[1]) }
event.set('ratogtxt', ratogtxt)
return [event]
End
…
- stt.rb(ruby 필터 작성)
개인정보 비식별화 – Ruby Filter(2)
input {
stdin {}
}
filter {
csv {
columns => ["ratogtxt", "sub"]
separator => ","
}
}
filter {
ruby {
path => "/home/ec2-user/logstash-6.5.4/ruby/stt.rb"
script_params => { "param1" => "" }
}
}
output {
stdout {}
}
- stt.conf(logstash 적용)
빅데이터 에코시스템 연계 – Elasticsearch-Hadoop
빅데이터 에코시스템 연계 – Elasticsearch-Hadoop 사례
Elasticsearch
Hadoop
STEP1 : hive 테이블 생성
STEP2 : stage 테이블 삭제
STEP3 : stage 테이블 생성
STEP4 : stage 테이블 데이터 hive 테이블 입력
STEP5 : stage 테이블 삭제
포인터
- 작업절차
빅데이터 에코시스템 연계 – Elasticsearch-Hadoop 사례
ES > Hadoop : create_weblog.hql
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.dynamic.partition=true;
create external table if not exists eshadoop.weblog (
datetime string,
ip string,
extension string,
response string,
agent string,
bytes bigint,
url string,
os string,
tags array<string>
)
partitioned by (
p_year string,
p_month string,
p_date string,
p_hour string
)
stored as parquet
location "s3://eshadoop-demo/weblog";
STEP1 : hive 테이블 생성
STEP2 : stage 테이블 삭제
STEP3 : stage 테이블 생성
STEP4 : stage 테이블 데이터 hive 테이블 입력
STEP5 : stage 테이블 삭제
포인터
빅데이터 에코시스템 연계 – Elasticsearch-Hadoop 사례
ES > Hadoop : drop_weblog_stg.hql
drop table if exists eshadoop.weblog_stg;
STEP1 : hive 테이블 생성
STEP2 : stage 테이블 삭제
STEP3 : stage 테이블 생성
STEP4 : stage 테이블 데이터 hive 테이블 입력
STEP5 : stage 테이블 삭제
포인터
빅데이터 에코시스템 연계 – Elasticsearch-Hadoop 사례
create external table eshadoop.weblog_stg (
datetime string, ip string, extension string, response string, agent string, bytes bigint, url string, os string, tags array<string>
)
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES (
'es.nodes' = '172.31.15.196',
'es.nodes.wan.only' = 'true',
'es.resource' = 'weblog-2015.05.20/log',
'es.query' = '?q=*',
'es.index.auto.create' = 'no',
'es.index.read.missing.as.empty' = 'yes',
'es.field.read.empty.as.null' = 'yes',
'es.mapping.date.rich' = 'false',
'es.mapping.names' = 'datetime:@timestamp, ip:ip, extension:extension, response:response, agent:agent,
bytes:bytes, url:url, os:machine.os, tags:@tags'
);
ES -> Hadoop : create_weblog_stg.hql STEP1 : hive 테이블 생성
STEP2 : stage 테이블 삭제
STEP3 : stage 테이블 생성
STEP4 : stage 테이블 데이터 hive 테이블 입력
STEP5 : stage 테이블 삭제
포인터INDEX 지정
빅데이터 에코시스템 연계 – Elasticsearch-Hadoop 사례
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table eshadoop.weblog
partition(p_year, p_month, p_date, p_hour)
select
datetime,
ip,
extension,
response,
agent,
bytes,
url,
os,
tags,
substr(datetime, 1, 4),
substr(datetime, 6, 2),
substr(datetime, 9, 2),
substr(datetime, 12, 2)
from eshadoop.weblog_stg;
ES > Hadoop : insert_overwrite_weblog.hql STEP1 : hive 테이블 생성
STEP2 : stage 테이블 삭제
STEP3 : stage 테이블 생성
STEP4 : stage 테이블 데이터 hive 테이블 입력
STEP5 : stage 테이블 삭제
포인터
N번 실행시
중복 방지
빅데이터 에코시스템 연계 – Elasticsearch-Hadoop 사례
ES > Hadoop : drop_weblog_stg.hql
drop table if exists eshadoop.weblog_stg;
STEP1 : hive 테이블 생성
STEP2 : stage 테이블 삭제
STEP3 : stage 테이블 생성
STEP4 : stage 테이블 데이터 hive 테이블 입력
STEP5 : stage 테이블 삭제
포인터
빅데이터 에코시스템 연계 – Elasticsearch-Hadoop 사례
Elasticsearch
Hadoop
- 작업절차
STEP1 : stage 테이블 삭제
STEP2 : stage 테이블 생성
STEP3 : hive 테이블 데이터 stage 테이블 입력
STEP4 : stage 테이블 삭제
포인터
빅데이터 에코시스템 연계 – Elasticsearch-Hadoop 사례
drop table if exists eshadoop.applog_stg;
Hadoop > ES : drop_applog_stg.hql
STEP1 : stage 테이블 삭제
STEP2 : stage 테이블 생성
STEP3 : hive 테이블 데이터 stage 테이블 입력
STEP4 : stage 테이블 삭제
포인터
빅데이터 에코시스템 연계 – Elasticsearch-Hadoop 사례
Hadoop > ES : create_applog_stg.hql
create external table if not exists eshadoop.applog_stg (
datetime string, ip string, extension string, response string, agent string, bytes bigint, url string, os string, tags array<string>
)
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES (
'es.nodes' = '172.31.15.196',
'es.nodes.wan.only' = 'true',
'es.resource' = 'applog-2015.05.18/log',
'es.query' = '?q=*',
'es.index.auto.create' = 'yes',
'es.index.read.missing.as.empty' = 'yes',
'es.field.read.empty.as.null' = 'yes',
'es.mapping.date.rich' = 'false',
'es.mapping.names' = '
datetime:@timestamp,
ip:ip,
extension:extension,
response:response,
agent:agent,
bytes:bytes,
url:url,
os:machine.os,
tags:@tags'
);
STEP1 : stage 테이블 삭제
STEP2 : stage 테이블 생성
STEP3 : hive 테이블 데이터 stage 테이블 입력
STEP4 : stage 테이블 삭제
포인터
INDEX 지정
빅데이터 에코시스템 연계 – Elasticsearch-Hadoop 사례
insert overwrite table eshadoop.applog_stg
select
datetime,
ip,
extension,
response,
agent,
bytes,
url,
os,
tags
from eshadoop.applog
where p_year = '2015'
and p_month = '05'
and p_date = '18';
Hadoop > ES : insert_overwrite_applog_stg.hql
STEP1 : stage 테이블 삭제
STEP2 : stage 테이블 생성
STEP3 : hive 테이블 데이터 stage 테이블 입력
STEP4 : stage 테이블 삭제
포인터
빅데이터 에코시스템 연계 – Elasticsearch-Hadoop 사례
Hadoop > ES : drop_applog_stg.hql
drop table if exists eshadoop.applog_stg;
STEP1 : stage 테이블 삭제
STEP2 : stage 테이블 생성
STEP3 : hive 테이블 데이터 stage 테이블 입력
STEP4 : stage 테이블 삭제
포인터
빅데이터 에코시스템 연계 – 명사 별도 적재사례(1)
요구사항 : 적재된 한글 문장 데이터 중 명사만 별도의 field로 적재가 필요
이슈 : Nori 형태소 분석 결과를 타 빅데이터 시스템에서의 활용
빅데이터 에코시스템 연계 – 명사 별도 적재사례(2)
PUT nori_sample
{
"settings": {
"index": {
"analysis": {
"tokenizer": {
"nori_user_dict": {
"type": "nori_tokenizer",
"decompound_mode": "mixed",
"user_dictionary": "userdict_ko.txt"
}
},
"analyzer": {
"my_analyzer": {
"type": "custom",
"tokenizer": "nori_user_dict",
"filter": ["unnoun_filter","lowercase"],
"fielddata": true
}
},
"filter": {
"unnoun_filter": {
"type": "nori_part_of_speech",
"stoptags": ["E", "IC", "J", "MAG",
- Index 생성
"MM", "SP", "SSC", "SSO", "SC","SE", "XPN",
"XSA", "XSN", "XSV", "UNA", "NA", "VSV",
"VA", "E"]
}
}
}
}
},
"mappings": {
"_doc" : {
"properties": {
"msg": {
"type": "text",
"analyzer": "my_analyzer",
"fielddata": true
}
}
}
}
}
Part of speech tags 참조
빅데이터 에코시스템 연계 – 명사 별도 적재사례(3)
POST /nori_sample/_doc
{
"msg" : "일래스틱서치 명사의 별도적재 예제입니다.“
}
- 문장 입력
GET /nori_sample/_analyze
{
"analyzer": "my_analyzer",
"text": "일래스틱서치 명사의 별도적재 예제입니다.“
}
- 문장 분석
{
"tokens" : [
{
"token" : "일래스틱",
"start_offset" : 0,
"end_offset" : 4,
"type" : "word",
"position" : 0
},
{
"token" : "서치",
…
},
{
"token" : "명사",
…
},
{
"token" : "별도",
…
},
...
]
}
빅데이터 에코시스템 연계 – 명사 별도 적재사례(4)
GET /nori_sample/_doc/_search
{
"_source": "*",
"query": {"match_all": {}},
"script_fields": {
"searchkeyword": {
"script": {
"lang": "painless",
"source": "doc[params.field].values",
"params": {"field": "msg"}
}
}
}
}
- 형태소 분석 키워드 동시 조회
{
…,
"hits" : {
"total" : 2, "max_score" : 1.0,
"hits" : [
{
"_index" : "nori_sample",
"_type" : "_doc",
"_id" : "ISSx6mgBARmSfZozzHTU",
"_score" : 1.0,
"_source" : {
"msg" : "일래스틱서치 고급 기능의 개념과 활용"
},
"fields" : {
"searchkeyword" : ["개념","고급","기능","서치",
"일래스틱","활용"]
}
},
{},
{},
...
]
}
}
빅데이터 에코시스템 연계 – 명사 별도 적재사례(5)
input {
elasticsearch {
hosts => "$REPLACE_SOURCE_HOST_ADDR$"
index => "<$REPLACE_SOURCE_INDEX_NAME$-{now/d-
1d{YYYY.MM.dd}}>"
query => '{ "_source": "*", "query": { "match_all": {} },
"script_fields": { "terms": { "script": { "lang": "painless", "source":
"doc[params.field].values", "params": { "field" :
"$REPLACE_FIELD_KEY$" } } } } }'
docinfo => true
docinfo_fields => ["fields", "_index", "_type", "_id"]
docinfo_target => "meta"
schedule => "0 1 * * *"
}
}
filter {
mutate {
copy => { "[meta][fields][terms]" => "terms" }
copy => { "[meta][_index]" => "[@metadata][_index]" }
copy => { "[meta][_type]" => "[@metadata][_type]" }
copy => { "[meta][_id]" => "[@metadata][_id]" }
remove_field => ["meta"]
}
}
output {
stdout {}
elasticsearch {
hosts => ["$REPLACE_TARGET_HOST_ADDR$"]
index => "$REPLACE_TARGET_INDEX_NAME$-
%{[@metadata][_index]}"
document_id => "%{[@metadata][_id]}"
document_type => "%{[@metadata][_type]}"
user => "$REPLACE_USERNAME$"
password => "$REPLACE_PASSWORD$“
document_id => "%{[@metadata][_id]}"
doc_as_upsert => true
action => "update"
}
}
- Logstash를 통한 문서 update
Github
https://github.com/leftwing871/elasticontour2019seoul
ehlee@megazone.com
참고
Audit:
https://www.elastic.co/guide/en/elastic-stack-overview/current/auditing.html
Ruby filter plugin:
https://www.elastic.co/guide/en/logstash/current/plugins-filters-ruby.html
ES-Hadoop:
https://www.elastic.co/guide/en/elasticsearch/hadoop/current/hive.html
Lucene POS.Tag
http://lucene.apache.org/core/7_6_0/analyzers-nori/org/apache/lucene
/analysis/ko/POS.Tag.html
THANK YOU
http://www.cloud.hosting.kr l http://www.mz.co.kr l 46, Nonhyeon-ro 85-gil, Gangnam-gu, Seoul, Korea l T. 1644-2243

More Related Content

Similar to Partner Story(Megazone): 금융사 실전 프로젝트 DeepDive

[Td 2015]치즈케이크 팩토리는 알겠는데, 데이터 팩토리는 뭔가요(한기환)
[Td 2015]치즈케이크 팩토리는 알겠는데, 데이터 팩토리는 뭔가요(한기환)[Td 2015]치즈케이크 팩토리는 알겠는데, 데이터 팩토리는 뭔가요(한기환)
[Td 2015]치즈케이크 팩토리는 알겠는데, 데이터 팩토리는 뭔가요(한기환)Sang Don Kim
 
Elastic Search Performance Optimization - Deview 2014
Elastic Search Performance Optimization - Deview 2014Elastic Search Performance Optimization - Deview 2014
Elastic Search Performance Optimization - Deview 2014Gruter
 
처음배우는 자바스크립트, 제이쿼리 #4
처음배우는 자바스크립트, 제이쿼리 #4처음배우는 자바스크립트, 제이쿼리 #4
처음배우는 자바스크립트, 제이쿼리 #4성일 한
 
KCSE 2015 Tutorial 빅데이터 분석 기술의 소프트웨어 공학 분야 활용 (...
KCSE 2015 Tutorial 빅데이터 분석 기술의  소프트웨어 공학 분야 활용 (...KCSE 2015 Tutorial 빅데이터 분석 기술의  소프트웨어 공학 분야 활용 (...
KCSE 2015 Tutorial 빅데이터 분석 기술의 소프트웨어 공학 분야 활용 (...Chanjin Park
 
[115] clean fe development_윤지수
[115] clean fe development_윤지수[115] clean fe development_윤지수
[115] clean fe development_윤지수NAVER D2
 
[XECon+PHPFest 2014] jQuery 개발자에서 AngularJS 개발자 되기
[XECon+PHPFest 2014] jQuery 개발자에서 AngularJS 개발자 되기[XECon+PHPFest 2014] jQuery 개발자에서 AngularJS 개발자 되기
[XECon+PHPFest 2014] jQuery 개발자에서 AngularJS 개발자 되기Jeado Ko
 
Ksug 세미나 (윤성준) (20121208)
Ksug 세미나 (윤성준) (20121208)Ksug 세미나 (윤성준) (20121208)
Ksug 세미나 (윤성준) (20121208)Sungjoon Yoon
 
TABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracle
TABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracleTABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracle
TABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracle엑셈
 
Apache solr소개 20120629
Apache solr소개 20120629Apache solr소개 20120629
Apache solr소개 20120629Dosang Yoon
 
Front-end Development Process - 어디까지 개선할 수 있나
Front-end Development Process - 어디까지 개선할 수 있나Front-end Development Process - 어디까지 개선할 수 있나
Front-end Development Process - 어디까지 개선할 수 있나JeongHun Byeon
 
Daejeon IT Developer Conference Hibernate3
Daejeon IT Developer Conference Hibernate3Daejeon IT Developer Conference Hibernate3
Daejeon IT Developer Conference Hibernate3plusperson
 
7가지 동시성 모델 람다아키텍처
7가지 동시성 모델  람다아키텍처7가지 동시성 모델  람다아키텍처
7가지 동시성 모델 람다아키텍처Sunggon Song
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs기동 이
 
//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작
//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작
//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작Taeyoung Kim
 
채팅 소스부터 Https 주소까지
채팅 소스부터  Https 주소까지채팅 소스부터  Https 주소까지
채팅 소스부터 Https 주소까지Kenu, GwangNam Heo
 
Logstash, ElasticSearch, Kibana
Logstash, ElasticSearch, KibanaLogstash, ElasticSearch, Kibana
Logstash, ElasticSearch, KibanaHyeonSeok Choi
 
Clean Front-End Development
Clean Front-End DevelopmentClean Front-End Development
Clean Front-End Development지수 윤
 
GRUTER가 들려주는 Big Data Platform 구축 전략과 적용 사례: 인터넷 쇼핑몰의 실시간 분석 플랫폼 구축 사례
GRUTER가 들려주는 Big Data Platform 구축 전략과 적용 사례: 인터넷 쇼핑몰의 실시간 분석 플랫폼 구축 사례GRUTER가 들려주는 Big Data Platform 구축 전략과 적용 사례: 인터넷 쇼핑몰의 실시간 분석 플랫폼 구축 사례
GRUTER가 들려주는 Big Data Platform 구축 전략과 적용 사례: 인터넷 쇼핑몰의 실시간 분석 플랫폼 구축 사례Gruter
 

Similar to Partner Story(Megazone): 금융사 실전 프로젝트 DeepDive (20)

Scala for play
Scala for playScala for play
Scala for play
 
[Td 2015]치즈케이크 팩토리는 알겠는데, 데이터 팩토리는 뭔가요(한기환)
[Td 2015]치즈케이크 팩토리는 알겠는데, 데이터 팩토리는 뭔가요(한기환)[Td 2015]치즈케이크 팩토리는 알겠는데, 데이터 팩토리는 뭔가요(한기환)
[Td 2015]치즈케이크 팩토리는 알겠는데, 데이터 팩토리는 뭔가요(한기환)
 
Elastic Search Performance Optimization - Deview 2014
Elastic Search Performance Optimization - Deview 2014Elastic Search Performance Optimization - Deview 2014
Elastic Search Performance Optimization - Deview 2014
 
처음배우는 자바스크립트, 제이쿼리 #4
처음배우는 자바스크립트, 제이쿼리 #4처음배우는 자바스크립트, 제이쿼리 #4
처음배우는 자바스크립트, 제이쿼리 #4
 
KCSE 2015 Tutorial 빅데이터 분석 기술의 소프트웨어 공학 분야 활용 (...
KCSE 2015 Tutorial 빅데이터 분석 기술의  소프트웨어 공학 분야 활용 (...KCSE 2015 Tutorial 빅데이터 분석 기술의  소프트웨어 공학 분야 활용 (...
KCSE 2015 Tutorial 빅데이터 분석 기술의 소프트웨어 공학 분야 활용 (...
 
[115] clean fe development_윤지수
[115] clean fe development_윤지수[115] clean fe development_윤지수
[115] clean fe development_윤지수
 
[XECon+PHPFest 2014] jQuery 개발자에서 AngularJS 개발자 되기
[XECon+PHPFest 2014] jQuery 개발자에서 AngularJS 개발자 되기[XECon+PHPFest 2014] jQuery 개발자에서 AngularJS 개발자 되기
[XECon+PHPFest 2014] jQuery 개발자에서 AngularJS 개발자 되기
 
Ksug 세미나 (윤성준) (20121208)
Ksug 세미나 (윤성준) (20121208)Ksug 세미나 (윤성준) (20121208)
Ksug 세미나 (윤성준) (20121208)
 
TABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracle
TABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracleTABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracle
TABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracle
 
Apache solr소개 20120629
Apache solr소개 20120629Apache solr소개 20120629
Apache solr소개 20120629
 
Front-end Development Process - 어디까지 개선할 수 있나
Front-end Development Process - 어디까지 개선할 수 있나Front-end Development Process - 어디까지 개선할 수 있나
Front-end Development Process - 어디까지 개선할 수 있나
 
Daejeon IT Developer Conference Hibernate3
Daejeon IT Developer Conference Hibernate3Daejeon IT Developer Conference Hibernate3
Daejeon IT Developer Conference Hibernate3
 
7가지 동시성 모델 람다아키텍처
7가지 동시성 모델  람다아키텍처7가지 동시성 모델  람다아키텍처
7가지 동시성 모델 람다아키텍처
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs
 
Html5 performance
Html5 performanceHtml5 performance
Html5 performance
 
//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작
//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작
//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작
 
채팅 소스부터 Https 주소까지
채팅 소스부터  Https 주소까지채팅 소스부터  Https 주소까지
채팅 소스부터 Https 주소까지
 
Logstash, ElasticSearch, Kibana
Logstash, ElasticSearch, KibanaLogstash, ElasticSearch, Kibana
Logstash, ElasticSearch, Kibana
 
Clean Front-End Development
Clean Front-End DevelopmentClean Front-End Development
Clean Front-End Development
 
GRUTER가 들려주는 Big Data Platform 구축 전략과 적용 사례: 인터넷 쇼핑몰의 실시간 분석 플랫폼 구축 사례
GRUTER가 들려주는 Big Data Platform 구축 전략과 적용 사례: 인터넷 쇼핑몰의 실시간 분석 플랫폼 구축 사례GRUTER가 들려주는 Big Data Platform 구축 전략과 적용 사례: 인터넷 쇼핑몰의 실시간 분석 플랫폼 구축 사례
GRUTER가 들려주는 Big Data Platform 구축 전략과 적용 사례: 인터넷 쇼핑몰의 실시간 분석 플랫폼 구축 사례
 

More from Elasticsearch

An introduction to Elasticsearch's advanced relevance ranking toolbox
An introduction to Elasticsearch's advanced relevance ranking toolboxAn introduction to Elasticsearch's advanced relevance ranking toolbox
An introduction to Elasticsearch's advanced relevance ranking toolboxElasticsearch
 
From MSP to MSSP using Elastic
From MSP to MSSP using ElasticFrom MSP to MSSP using Elastic
From MSP to MSSP using ElasticElasticsearch
 
Cómo crear excelentes experiencias de búsqueda en sitios web
Cómo crear excelentes experiencias de búsqueda en sitios webCómo crear excelentes experiencias de búsqueda en sitios web
Cómo crear excelentes experiencias de búsqueda en sitios webElasticsearch
 
Te damos la bienvenida a una nueva forma de realizar búsquedas
Te damos la bienvenida a una nueva forma de realizar búsquedas Te damos la bienvenida a una nueva forma de realizar búsquedas
Te damos la bienvenida a una nueva forma de realizar búsquedas Elasticsearch
 
Tirez pleinement parti d'Elastic grâce à Elastic Cloud
Tirez pleinement parti d'Elastic grâce à Elastic CloudTirez pleinement parti d'Elastic grâce à Elastic Cloud
Tirez pleinement parti d'Elastic grâce à Elastic CloudElasticsearch
 
Comment transformer vos données en informations exploitables
Comment transformer vos données en informations exploitablesComment transformer vos données en informations exploitables
Comment transformer vos données en informations exploitablesElasticsearch
 
Plongez au cœur de la recherche dans tous ses états.
Plongez au cœur de la recherche dans tous ses états.Plongez au cœur de la recherche dans tous ses états.
Plongez au cœur de la recherche dans tous ses états.Elasticsearch
 
Modernising One Legal Se@rch with Elastic Enterprise Search [Customer Story]
Modernising One Legal Se@rch with Elastic Enterprise Search [Customer Story]Modernising One Legal Se@rch with Elastic Enterprise Search [Customer Story]
Modernising One Legal Se@rch with Elastic Enterprise Search [Customer Story]Elasticsearch
 
An introduction to Elasticsearch's advanced relevance ranking toolbox
An introduction to Elasticsearch's advanced relevance ranking toolboxAn introduction to Elasticsearch's advanced relevance ranking toolbox
An introduction to Elasticsearch's advanced relevance ranking toolboxElasticsearch
 
Welcome to a new state of find
Welcome to a new state of findWelcome to a new state of find
Welcome to a new state of findElasticsearch
 
Building great website search experiences
Building great website search experiencesBuilding great website search experiences
Building great website search experiencesElasticsearch
 
Keynote: Harnessing the power of Elasticsearch for simplified search
Keynote: Harnessing the power of Elasticsearch for simplified searchKeynote: Harnessing the power of Elasticsearch for simplified search
Keynote: Harnessing the power of Elasticsearch for simplified searchElasticsearch
 
Cómo transformar los datos en análisis con los que tomar decisiones
Cómo transformar los datos en análisis con los que tomar decisionesCómo transformar los datos en análisis con los que tomar decisiones
Cómo transformar los datos en análisis con los que tomar decisionesElasticsearch
 
Explore relève les défis Big Data avec Elastic Cloud
Explore relève les défis Big Data avec Elastic Cloud Explore relève les défis Big Data avec Elastic Cloud
Explore relève les défis Big Data avec Elastic Cloud Elasticsearch
 
Comment transformer vos données en informations exploitables
Comment transformer vos données en informations exploitablesComment transformer vos données en informations exploitables
Comment transformer vos données en informations exploitablesElasticsearch
 
Transforming data into actionable insights
Transforming data into actionable insightsTransforming data into actionable insights
Transforming data into actionable insightsElasticsearch
 
Opening Keynote: Why Elastic?
Opening Keynote: Why Elastic?Opening Keynote: Why Elastic?
Opening Keynote: Why Elastic?Elasticsearch
 
Empowering agencies using Elastic as a Service inside Government
Empowering agencies using Elastic as a Service inside GovernmentEmpowering agencies using Elastic as a Service inside Government
Empowering agencies using Elastic as a Service inside GovernmentElasticsearch
 
The opportunities and challenges of data for public good
The opportunities and challenges of data for public goodThe opportunities and challenges of data for public good
The opportunities and challenges of data for public goodElasticsearch
 
Enterprise search and unstructured data with CGI and Elastic
Enterprise search and unstructured data with CGI and ElasticEnterprise search and unstructured data with CGI and Elastic
Enterprise search and unstructured data with CGI and ElasticElasticsearch
 

More from Elasticsearch (20)

An introduction to Elasticsearch's advanced relevance ranking toolbox
An introduction to Elasticsearch's advanced relevance ranking toolboxAn introduction to Elasticsearch's advanced relevance ranking toolbox
An introduction to Elasticsearch's advanced relevance ranking toolbox
 
From MSP to MSSP using Elastic
From MSP to MSSP using ElasticFrom MSP to MSSP using Elastic
From MSP to MSSP using Elastic
 
Cómo crear excelentes experiencias de búsqueda en sitios web
Cómo crear excelentes experiencias de búsqueda en sitios webCómo crear excelentes experiencias de búsqueda en sitios web
Cómo crear excelentes experiencias de búsqueda en sitios web
 
Te damos la bienvenida a una nueva forma de realizar búsquedas
Te damos la bienvenida a una nueva forma de realizar búsquedas Te damos la bienvenida a una nueva forma de realizar búsquedas
Te damos la bienvenida a una nueva forma de realizar búsquedas
 
Tirez pleinement parti d'Elastic grâce à Elastic Cloud
Tirez pleinement parti d'Elastic grâce à Elastic CloudTirez pleinement parti d'Elastic grâce à Elastic Cloud
Tirez pleinement parti d'Elastic grâce à Elastic Cloud
 
Comment transformer vos données en informations exploitables
Comment transformer vos données en informations exploitablesComment transformer vos données en informations exploitables
Comment transformer vos données en informations exploitables
 
Plongez au cœur de la recherche dans tous ses états.
Plongez au cœur de la recherche dans tous ses états.Plongez au cœur de la recherche dans tous ses états.
Plongez au cœur de la recherche dans tous ses états.
 
Modernising One Legal Se@rch with Elastic Enterprise Search [Customer Story]
Modernising One Legal Se@rch with Elastic Enterprise Search [Customer Story]Modernising One Legal Se@rch with Elastic Enterprise Search [Customer Story]
Modernising One Legal Se@rch with Elastic Enterprise Search [Customer Story]
 
An introduction to Elasticsearch's advanced relevance ranking toolbox
An introduction to Elasticsearch's advanced relevance ranking toolboxAn introduction to Elasticsearch's advanced relevance ranking toolbox
An introduction to Elasticsearch's advanced relevance ranking toolbox
 
Welcome to a new state of find
Welcome to a new state of findWelcome to a new state of find
Welcome to a new state of find
 
Building great website search experiences
Building great website search experiencesBuilding great website search experiences
Building great website search experiences
 
Keynote: Harnessing the power of Elasticsearch for simplified search
Keynote: Harnessing the power of Elasticsearch for simplified searchKeynote: Harnessing the power of Elasticsearch for simplified search
Keynote: Harnessing the power of Elasticsearch for simplified search
 
Cómo transformar los datos en análisis con los que tomar decisiones
Cómo transformar los datos en análisis con los que tomar decisionesCómo transformar los datos en análisis con los que tomar decisiones
Cómo transformar los datos en análisis con los que tomar decisiones
 
Explore relève les défis Big Data avec Elastic Cloud
Explore relève les défis Big Data avec Elastic Cloud Explore relève les défis Big Data avec Elastic Cloud
Explore relève les défis Big Data avec Elastic Cloud
 
Comment transformer vos données en informations exploitables
Comment transformer vos données en informations exploitablesComment transformer vos données en informations exploitables
Comment transformer vos données en informations exploitables
 
Transforming data into actionable insights
Transforming data into actionable insightsTransforming data into actionable insights
Transforming data into actionable insights
 
Opening Keynote: Why Elastic?
Opening Keynote: Why Elastic?Opening Keynote: Why Elastic?
Opening Keynote: Why Elastic?
 
Empowering agencies using Elastic as a Service inside Government
Empowering agencies using Elastic as a Service inside GovernmentEmpowering agencies using Elastic as a Service inside Government
Empowering agencies using Elastic as a Service inside Government
 
The opportunities and challenges of data for public good
The opportunities and challenges of data for public goodThe opportunities and challenges of data for public good
The opportunities and challenges of data for public good
 
Enterprise search and unstructured data with CGI and Elastic
Enterprise search and unstructured data with CGI and ElasticEnterprise search and unstructured data with CGI and Elastic
Enterprise search and unstructured data with CGI and Elastic
 

Partner Story(Megazone): 금융사 실전 프로젝트 DeepDive

  • 1. 금융사 프로젝트 Deep Dive 2019. 2. 22 이은학
  • 2. Agenda 01 We are 하는일 02 Project Case 프로젝트 사례 - 활용 영역 - 설계 & 구축 - 아키텍처 - 데이터 파이프라인 03 Audit 사용자쿼리기록 - 남기는 법 - 문제점 - 해결책 - 활용 04 Privacy 개인정보 비식별화 - Logstash Ruby Filter - 성명 - 카드번호, 주민번호 - 주소 05 빅데이터 에코시스템 연계 - ES <-> Hadoop 연계 - 명사 별도 적재 Connect BigData ecosystem
  • 3. Data Solution Team 빅데이터 플랫폼 구축 및 활용솔루션 개발 하는 일 Elasticsearch 클러스터 운영 EC Seoul 운영 * Seoul Region 의 Elasticsearch SaaS
  • 4. 프로젝트내 Elastic Stack 활용 영역 • 비정형데이터 분석 • 3rd Party Solution APM - Google Analytics - 고객 상담데이터(STT) - 웹/앱 로그 - Docker Host - Docker Containers - Apache Server Error
  • 5. 설계&구축 클러스터 설계 방향 - Index Lifecycle 을 고려한 Hot/Warm 아키텍쳐 (HA를 위해 Index가 동일 서버에 저장되지 않도록) - 노드별로 확장 가능한 아키텍쳐 (필요한 경우 각 영역에 노드 추가 용이) - 가능한 단순한 아키텍쳐 지향 (유지보수 편의)
  • 6. Architecture Elastic#1 Elastic#2 Elastic#3 Elastic#4 Elastic#5 ES (4Cores, 64GB) Hot node(SSD) Hadoop Zone1 Zone2 Zone3 ES7 (4cores, 64GB) ES9 (4cores, 64GB) Zone4 Zone5 ES8 (4cores, 64GB) ES10 (4ores, 64GB) Warm node(HDD) Web/app STT Coordinating Node (4cores , 64GB) Logstash (4cores, 32GB) beats beats (TLS enabled:CERT mode, 9300,9301 port) HTTPS Logstash (4cores, 32GB) Coordinating Node (4cores , 64GB) searchKibanasAPI Ingest pipeline LB Ingest 8Cores Physical 256GB RAM Kibanas KafkaKafka ES (4Cores, 64GB) ES (4Cores, 64GB) ES (4Cores, 64GB) ES (4Cores, 64GB) ES (4Cores, 64GB) 5 Master node (1 Master, 4 eligible nodes) 10 Data nodes(6 hots, 4 warms) beatsDocker GA beats ES-Hadoop(Library) Streaming Batch
  • 7. Data Pipeline Elasticsearch Master Nodes (5) Data Nodes (10) Messaging Queue Kafka Beats Logstash hot warm Multi nodes(min 2) Hadoop Nodes (10+) * RESTFul 한글 형태소 분석기 Chatbot 0.1 Sec ▼ 5.0 Sec ▲ * RESTFul Data Server 용도: 대용량 배치
  • 8. Audit – 사용자쿼리 기록 요구사항 : 모든 사용자의 쿼리는 이력 관리가 필요함(금융감독원 감사) 이슈 : Query, UserID 동시에 남아야 함 * 6.5.1 부터 UserID 를 남길 수 있음 (2018.11)
  • 9. Audit – 기록 방법 xpack.security.audit.enabled: true xpack.security.audit.outputs: [index, logfile] xpack.security.audit.logfile.events.ignore_filters: example1: users: ["kibana", "admin_user", "elastic"] - elasticsearch.yml logfile로 남겨야 userID가 남음 제외할 ID(이 부분 없을 시 10node 기준 일 아무 이벤트 없어도 160GB 발생) *클러스터 노드 간의 통신도 기록
  • 10. Audit – 적재 방법 - audit1.conf filter { json { source => "message" } if [message] !~ "url.path" { drop {} } else { mutate { split => { "url.path" => "/" } } if [url.path][1] == "_xpack" { if [url.path][2] != "sql" { drop {} } else if [url.path][1] == "_aliases" { drop {} } else if [url.path][1] == "_mapping" { drop {} } else if [url.path][1] == "_template" { drop {} } mutate { join => { "url.path" => "/"} } } mutate { join => { "url.path" => "/" } } } mutate { remove_field => ["message" ] } } input { beats { port => 5046 type => json } } output { elasticsearch { hosts => ["https://127.0.0.1:9200"] index => “audit-%{+yyyy.MM.dd}" user => "elastic" password => "changeme" ssl => true ssl_certificate_verification => false } } 정책에 맞게 필터링
  • 11. Audit – 활용 사례(1) { "count" : 300000 } curl -XGET http://localhost:9200/sampledata-2019/_count curl -XGET "http://localhost:9200/sampledata-2019/_search" -H 'Content-Type: application/json' -d' { "sort": [ { "@timestamp": { "order": "asc" } } ], "from": 0, #(10, 20, 30, 40 ...) "size": 10 }' { "took" : 56, "timed_out" : false, "_shards" : {…}, "hits" : { "total" : 300000, "max_score" : null, "hits" : [ {...}, {...}, {...}, … ] } } - 건수 확인 - 조회(페이징)
  • 12. Audit – 활용 사례(2) - 페이징 사용시 주의사항 { "error": { "root_cause": [ { "type": "query_phase_execution_exception", "reason": "Result window is too large, from + size must be less than or equal to: [10000] but was [300000]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level setting." } ], … } curl -XPUT "http://localhost:9200/basic-logstash- 2016/_settings" -H 'Content-Type: application/json' -d' { "index": { "max_result_window": 300000 } }‘ curl -XPUT "http://localhost:9200/basic-logstash- 2016/_settings" -H 'Content-Type: application/json' -d' { "index": { "max_result_window": null } }‘ - 설정: max_result_window - 해제 : max_result_window
  • 13. 개인정보 비식별화 요구사항 : 개인정보는 반드시 비식별처리 되어야 한다. 이슈 : 비정형 테이터의 특성상 개인정보의 식별범위 모호 안녕하세요 홍길동 고객님 용산구 갈월동에 거주하시나요? 제 카드 번호는 삼사오칠 다시 구구팔사 칠육오삼…. - 예문 - 패턴 성명 : XXX 회원님, XXX 님 카드번호, 주민번호 : 연속되는 숫자(영|일|이|삼|사|오|육|칠|팔|구|십|열) - 치환 주소 : 행정구역 단어 20,000 여건 로직처리 가능
  • 14. 개인정보 비식별화 – Ruby Filter(1) … def filter(event) ratogtxt = event.get('ratogtxt') ratogtxt = ratogtxt&.gsub(/s[가-힣]+s고객님/) { |match| ("*" * match.length) + "고객님" } ratogtxt = ratogtxt&.gsub(/s[가-힣]+s님/) { |match| ("*" * match.length) + "님" } ratogtxt = ratogtxt.gsub(/s[공|영|일|이|삼|사|오|육|칠|팔|구|십|열|s]{4, 13}/) { |match| "*" * match.length } replacements = [ ["...도로명...", "*"], ["가가로", "*"], ["충남", "*"], ["충청북도", "*"], ["충북", "*"] ] replacements.each { |replacement| ratogtxt&.gsub!(replacement[0], replacement[1]) } event.set('ratogtxt', ratogtxt) return [event] End … - stt.rb(ruby 필터 작성)
  • 15. 개인정보 비식별화 – Ruby Filter(2) input { stdin {} } filter { csv { columns => ["ratogtxt", "sub"] separator => "," } } filter { ruby { path => "/home/ec2-user/logstash-6.5.4/ruby/stt.rb" script_params => { "param1" => "" } } } output { stdout {} } - stt.conf(logstash 적용)
  • 16. 빅데이터 에코시스템 연계 – Elasticsearch-Hadoop
  • 17. 빅데이터 에코시스템 연계 – Elasticsearch-Hadoop 사례 Elasticsearch Hadoop STEP1 : hive 테이블 생성 STEP2 : stage 테이블 삭제 STEP3 : stage 테이블 생성 STEP4 : stage 테이블 데이터 hive 테이블 입력 STEP5 : stage 테이블 삭제 포인터 - 작업절차
  • 18. 빅데이터 에코시스템 연계 – Elasticsearch-Hadoop 사례 ES > Hadoop : create_weblog.hql set hive.exec.dynamic.partition.mode=nonstrict; set hive.exec.dynamic.partition=true; create external table if not exists eshadoop.weblog ( datetime string, ip string, extension string, response string, agent string, bytes bigint, url string, os string, tags array<string> ) partitioned by ( p_year string, p_month string, p_date string, p_hour string ) stored as parquet location "s3://eshadoop-demo/weblog"; STEP1 : hive 테이블 생성 STEP2 : stage 테이블 삭제 STEP3 : stage 테이블 생성 STEP4 : stage 테이블 데이터 hive 테이블 입력 STEP5 : stage 테이블 삭제 포인터
  • 19. 빅데이터 에코시스템 연계 – Elasticsearch-Hadoop 사례 ES > Hadoop : drop_weblog_stg.hql drop table if exists eshadoop.weblog_stg; STEP1 : hive 테이블 생성 STEP2 : stage 테이블 삭제 STEP3 : stage 테이블 생성 STEP4 : stage 테이블 데이터 hive 테이블 입력 STEP5 : stage 테이블 삭제 포인터
  • 20. 빅데이터 에코시스템 연계 – Elasticsearch-Hadoop 사례 create external table eshadoop.weblog_stg ( datetime string, ip string, extension string, response string, agent string, bytes bigint, url string, os string, tags array<string> ) STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler' TBLPROPERTIES ( 'es.nodes' = '172.31.15.196', 'es.nodes.wan.only' = 'true', 'es.resource' = 'weblog-2015.05.20/log', 'es.query' = '?q=*', 'es.index.auto.create' = 'no', 'es.index.read.missing.as.empty' = 'yes', 'es.field.read.empty.as.null' = 'yes', 'es.mapping.date.rich' = 'false', 'es.mapping.names' = 'datetime:@timestamp, ip:ip, extension:extension, response:response, agent:agent, bytes:bytes, url:url, os:machine.os, tags:@tags' ); ES -> Hadoop : create_weblog_stg.hql STEP1 : hive 테이블 생성 STEP2 : stage 테이블 삭제 STEP3 : stage 테이블 생성 STEP4 : stage 테이블 데이터 hive 테이블 입력 STEP5 : stage 테이블 삭제 포인터INDEX 지정
  • 21. 빅데이터 에코시스템 연계 – Elasticsearch-Hadoop 사례 set hive.exec.dynamic.partition.mode=nonstrict; insert overwrite table eshadoop.weblog partition(p_year, p_month, p_date, p_hour) select datetime, ip, extension, response, agent, bytes, url, os, tags, substr(datetime, 1, 4), substr(datetime, 6, 2), substr(datetime, 9, 2), substr(datetime, 12, 2) from eshadoop.weblog_stg; ES > Hadoop : insert_overwrite_weblog.hql STEP1 : hive 테이블 생성 STEP2 : stage 테이블 삭제 STEP3 : stage 테이블 생성 STEP4 : stage 테이블 데이터 hive 테이블 입력 STEP5 : stage 테이블 삭제 포인터 N번 실행시 중복 방지
  • 22. 빅데이터 에코시스템 연계 – Elasticsearch-Hadoop 사례 ES > Hadoop : drop_weblog_stg.hql drop table if exists eshadoop.weblog_stg; STEP1 : hive 테이블 생성 STEP2 : stage 테이블 삭제 STEP3 : stage 테이블 생성 STEP4 : stage 테이블 데이터 hive 테이블 입력 STEP5 : stage 테이블 삭제 포인터
  • 23. 빅데이터 에코시스템 연계 – Elasticsearch-Hadoop 사례 Elasticsearch Hadoop - 작업절차 STEP1 : stage 테이블 삭제 STEP2 : stage 테이블 생성 STEP3 : hive 테이블 데이터 stage 테이블 입력 STEP4 : stage 테이블 삭제 포인터
  • 24. 빅데이터 에코시스템 연계 – Elasticsearch-Hadoop 사례 drop table if exists eshadoop.applog_stg; Hadoop > ES : drop_applog_stg.hql STEP1 : stage 테이블 삭제 STEP2 : stage 테이블 생성 STEP3 : hive 테이블 데이터 stage 테이블 입력 STEP4 : stage 테이블 삭제 포인터
  • 25. 빅데이터 에코시스템 연계 – Elasticsearch-Hadoop 사례 Hadoop > ES : create_applog_stg.hql create external table if not exists eshadoop.applog_stg ( datetime string, ip string, extension string, response string, agent string, bytes bigint, url string, os string, tags array<string> ) STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler' TBLPROPERTIES ( 'es.nodes' = '172.31.15.196', 'es.nodes.wan.only' = 'true', 'es.resource' = 'applog-2015.05.18/log', 'es.query' = '?q=*', 'es.index.auto.create' = 'yes', 'es.index.read.missing.as.empty' = 'yes', 'es.field.read.empty.as.null' = 'yes', 'es.mapping.date.rich' = 'false', 'es.mapping.names' = ' datetime:@timestamp, ip:ip, extension:extension, response:response, agent:agent, bytes:bytes, url:url, os:machine.os, tags:@tags' ); STEP1 : stage 테이블 삭제 STEP2 : stage 테이블 생성 STEP3 : hive 테이블 데이터 stage 테이블 입력 STEP4 : stage 테이블 삭제 포인터 INDEX 지정
  • 26. 빅데이터 에코시스템 연계 – Elasticsearch-Hadoop 사례 insert overwrite table eshadoop.applog_stg select datetime, ip, extension, response, agent, bytes, url, os, tags from eshadoop.applog where p_year = '2015' and p_month = '05' and p_date = '18'; Hadoop > ES : insert_overwrite_applog_stg.hql STEP1 : stage 테이블 삭제 STEP2 : stage 테이블 생성 STEP3 : hive 테이블 데이터 stage 테이블 입력 STEP4 : stage 테이블 삭제 포인터
  • 27. 빅데이터 에코시스템 연계 – Elasticsearch-Hadoop 사례 Hadoop > ES : drop_applog_stg.hql drop table if exists eshadoop.applog_stg; STEP1 : stage 테이블 삭제 STEP2 : stage 테이블 생성 STEP3 : hive 테이블 데이터 stage 테이블 입력 STEP4 : stage 테이블 삭제 포인터
  • 28. 빅데이터 에코시스템 연계 – 명사 별도 적재사례(1) 요구사항 : 적재된 한글 문장 데이터 중 명사만 별도의 field로 적재가 필요 이슈 : Nori 형태소 분석 결과를 타 빅데이터 시스템에서의 활용
  • 29. 빅데이터 에코시스템 연계 – 명사 별도 적재사례(2) PUT nori_sample { "settings": { "index": { "analysis": { "tokenizer": { "nori_user_dict": { "type": "nori_tokenizer", "decompound_mode": "mixed", "user_dictionary": "userdict_ko.txt" } }, "analyzer": { "my_analyzer": { "type": "custom", "tokenizer": "nori_user_dict", "filter": ["unnoun_filter","lowercase"], "fielddata": true } }, "filter": { "unnoun_filter": { "type": "nori_part_of_speech", "stoptags": ["E", "IC", "J", "MAG", - Index 생성 "MM", "SP", "SSC", "SSO", "SC","SE", "XPN", "XSA", "XSN", "XSV", "UNA", "NA", "VSV", "VA", "E"] } } } } }, "mappings": { "_doc" : { "properties": { "msg": { "type": "text", "analyzer": "my_analyzer", "fielddata": true } } } } } Part of speech tags 참조
  • 30. 빅데이터 에코시스템 연계 – 명사 별도 적재사례(3) POST /nori_sample/_doc { "msg" : "일래스틱서치 명사의 별도적재 예제입니다.“ } - 문장 입력 GET /nori_sample/_analyze { "analyzer": "my_analyzer", "text": "일래스틱서치 명사의 별도적재 예제입니다.“ } - 문장 분석 { "tokens" : [ { "token" : "일래스틱", "start_offset" : 0, "end_offset" : 4, "type" : "word", "position" : 0 }, { "token" : "서치", … }, { "token" : "명사", … }, { "token" : "별도", … }, ... ] }
  • 31. 빅데이터 에코시스템 연계 – 명사 별도 적재사례(4) GET /nori_sample/_doc/_search { "_source": "*", "query": {"match_all": {}}, "script_fields": { "searchkeyword": { "script": { "lang": "painless", "source": "doc[params.field].values", "params": {"field": "msg"} } } } } - 형태소 분석 키워드 동시 조회 { …, "hits" : { "total" : 2, "max_score" : 1.0, "hits" : [ { "_index" : "nori_sample", "_type" : "_doc", "_id" : "ISSx6mgBARmSfZozzHTU", "_score" : 1.0, "_source" : { "msg" : "일래스틱서치 고급 기능의 개념과 활용" }, "fields" : { "searchkeyword" : ["개념","고급","기능","서치", "일래스틱","활용"] } }, {}, {}, ... ] } }
  • 32. 빅데이터 에코시스템 연계 – 명사 별도 적재사례(5) input { elasticsearch { hosts => "$REPLACE_SOURCE_HOST_ADDR$" index => "<$REPLACE_SOURCE_INDEX_NAME$-{now/d- 1d{YYYY.MM.dd}}>" query => '{ "_source": "*", "query": { "match_all": {} }, "script_fields": { "terms": { "script": { "lang": "painless", "source": "doc[params.field].values", "params": { "field" : "$REPLACE_FIELD_KEY$" } } } } }' docinfo => true docinfo_fields => ["fields", "_index", "_type", "_id"] docinfo_target => "meta" schedule => "0 1 * * *" } } filter { mutate { copy => { "[meta][fields][terms]" => "terms" } copy => { "[meta][_index]" => "[@metadata][_index]" } copy => { "[meta][_type]" => "[@metadata][_type]" } copy => { "[meta][_id]" => "[@metadata][_id]" } remove_field => ["meta"] } } output { stdout {} elasticsearch { hosts => ["$REPLACE_TARGET_HOST_ADDR$"] index => "$REPLACE_TARGET_INDEX_NAME$- %{[@metadata][_index]}" document_id => "%{[@metadata][_id]}" document_type => "%{[@metadata][_type]}" user => "$REPLACE_USERNAME$" password => "$REPLACE_PASSWORD$“ document_id => "%{[@metadata][_id]}" doc_as_upsert => true action => "update" } } - Logstash를 통한 문서 update
  • 35. THANK YOU http://www.cloud.hosting.kr l http://www.mz.co.kr l 46, Nonhyeon-ro 85-gil, Gangnam-gu, Seoul, Korea l T. 1644-2243