Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

J 의 기록

[ES] Elastic Search - spark (1) 본문

개발

[ES] Elastic Search - spark (1)

Luctor 2020. 4. 8. 17:01

이번 프로젝트에서 Elasticsearch 의 데이터를 spark으로 수집해야하는 경우가 생겨 정리해보고자 한다.

 

먼저 Elasticsearch에 대해 알아보자

 

Elasticsearch는 무엇인가?

 

Elasticsearch는 Apache Lucene (아파치 루씬) 기반의 Java 오픈소스 분산 검색 엔진이다.

Elasticsearch를 통해 루씬 라이브러리를 단독으로 사용할 수 있으며, 방대한 양의 데이터를 신속하게, 거의 실시간으로 저장, 검색, 분석할 수 있다.

 

Elasticsearch는 검색을 위해 단독으로 사용되기도 하며, ELK(Elasticsearch/Logstash/Kibana) 스택으로 사용되기도 한다.

ELK 스택의 구조는 아래와 같다.

- Logstash : 다양한 소스(DB, csv 등)의 로그 또는 트랜잭션 데이터를 수집, 집계, 파싱하여 Elasticsearch로 전달

- Elasticsearch : Logstash로부터 받은 데이터를 검색 및 집계를 하여 필요한 관심있는 정보를 획득

- Kibana : Elasticsearch 의 빠른 검색을 통해 데이터를 시각화 및 모니터링

 

 

다음은 Elasticsarch의 특징을 알아보자

 

Elasticsearch 와 관계형 DB 비교

 

 

Elasticsearch 아키텍처 

 

- 클러스터 (cluster) : 클러스터란 Elasticsearch에서 가장 큰 시스템 단위이며, 최소 하나 이상의 노드로 이루어진다.

서로 다른 클러스터는 데이터의 접근, 교환을 할 수 없는 독립적인 시스템으로 유지되며, 여러대의 서버가 하나의 클러스터를 구성할 수도 있고 한 서버에 여러대의 클러스터가 존재할 수도 있다.

 

- 노드 (node) : Elasticsearch를 구성하는 하나의 단위 프로세스를 의미하며, 그 역할에 따라 Master-eligible, data, Tribe 노드로 구분된다.

 

- 인덱스(index)/ 샤드(shard) / 복제 (Replica)

위에 Elasticsearch와 DB비교에서 보았듯이 index는 RDBMS의 데이터베이스와 대응하는 개념이다.

shard와 replica는 분산 데이터베이스 시스템에도 똑같은 개념으로

샤딩 (sharding)이란 데이터를 분산해서 저장하는 방법으로 Elasticsearch에서 스케일 아웃을 위해 index를 여러 shard로 쪼개는 것을 의미한다.

replica는 노드를 손실했을 경우 데이터의 신뢰성을 위해 샤드를 복제하는 것이므로 replica는 서로 다른 노드에 존재 할것을 권장한다.

 

Elasticsearch 특징

이제 Elasticsearch의 특징에 대해 알아보자

 

- Scale Out : 샤드를 통해 규모가 수평적으로 늘어날 수 있다.

- 고가용성 : Replica 를 통해 데이터의 안정성을 보장한다.

- Schema Free : Json문서를 통해 데이터 검색을 수행하므로 스키마 개념이 없다.

- RESTful : 데이터 CRUD작업을 REST API로 수행한다.

Data CRUD

 Elasticsearch Restful

 SELECT

 GET 

 INSERT 

 POST

 UPDATE

PUT

 DELETE

 DELETE

- 역색인 (inverted index)

Elasticsearch가 빠른 이유 그 이유는 역색인에 있다.

역색인은 무엇인가..하면 색인이 책의 목차 라면 책 뒤편의 '찾아보기'가 역색인이라고 우리 수석님께서 말씀해주셨는데

잘 이해가 안되는 부분이 있어서 추가로 검색을 해보았다.

 

먼저 일반적인 데이터베이스에 데이터를 저장한다고 하면

위의 형태로 저장되며, fox가 포함된 행을 가져오고 싶다면 각 행을 한줄씩 읽으면서 fox가 있으면 가져오고 없으면 넘어가는 식으로 데이터를 가져올 것이다. (like 검색)

 

허나 Elasticsearch는 

다음과 같이 역인덱스 구조로 저장하는데, 여기서 term이란 Elasticsearch에서 추출된 각 키워드를 의미한다.

이렇듯 Elasticsearch는 데이터가 늘어나도 찾아가야할 행이 늘어나는 것이 아닌, 역인덱스가 가리키는 id의 배열값이 추가될 뿐이기 때문에 큰 속도 저하없이 빠르게 검색이 가능하다고 한다. Elasticsearch는 이런 역 인덱스를 데이터가 저장되는 과정에서 만들기 때문에 Elasticsearch는 데이터를 입력할때 저장을 하는게 아닌 '색인'을 한다고 표현한다고 한다..

 

다음에는 Elasticsearch의 데이터를 spark로 가져오는 Elasticsearch-spark연동에 대해 알아보자.