건조물 丨 금융 데이터 세트에 대한 DolphinDB와 Elasticserach의 성능 비교 테스트

Elasticsearch는 특히 실시간, 확장 성, 사용 용이성 및 전체 텍스트 검색 측면에서 매우 인기있는 로그 검색 및 분석 도구입니다. Zhihu , Golion : Dimensionality Reduction 에 대한 기사가 있습니다 ! ElasticSearch를 시계열 데이터베이스로 사용 하여 매우 좋은 결과를 얻었습니다. 많은 Zhihu 사용자가 방대한 재무 데이터의 저장 및 분석에 Elasticsearch를 사용할 수 있는지 물어볼 수밖에 없습니까?

이러한 이유로 우리는 DolphinDB와 Elasticsearch 간의 다양한 규모의 재무 데이터 세트에 대한 포괄적 인 비교 테스트를 수행했습니다. 테스트 내용에는 I / O, 디스크 공간 점유, 메모리 사용량, 데이터베이스 쿼리 (필터 쿼리 및 그룹 통계) 4 개 주요 항목이 포함됩니다. 금융 데이터 처리 분야에서 눈길을 끄는 시계열 데이터베이스 인 DolphinDB가 Elasticsearch를 능가합니다.

  • 그룹 통계 (집계 계산), DolphinDB는 Elasticsearch보다 10성능이 뛰어나며  데이터 세트가 증가함에 따라 이점이 더욱 분명해집니다. 특히 테스트 케이스에 시간 유형 필드가 포함되는 경우 DolphinDB의 성능이 특히 두드러집니다.
  • 간단한 필터 쿼리, DolphinDB의 성능은 Elasticsearch의 100입니다 .
  • 데이터 가져 오기 측면에서 Elasticsearch는 DolphinDB 보다 25 ~ 75 배가 걸리며 데이터 세트가 증가함에 따라 더 커지는 경향이 있습니다.
  • 디스크 공간 점유 측면에서 DolphinDB는 원본 데이터를 압축 한 반면 Elasticsearch는 문서 색인 및 기타 정보 (임시 데이터 제외)를 유지하기 위해 원본 데이터보다 디스크에서 더 많은 공간을 차지합니다. 전체적인 차이는 약 10 배입니다.

1. 시스템 소개

1.1 DolphinDB 소개

DolphinDB는 컬럼 형 스토리지, 내장 스트리밍 데이터 처리 엔진, 병렬 컴퓨팅 및 분산 컴퓨팅 엔진을 사용하는 분석 분산 시계열 데이터베이스이며 클러스터 확장을 지원하는 분산 파일 시스템을 제공합니다. DolphinDB는 C ++로 작성되었으며 응답 속도가 매우 빠릅니다. 데이터를 조작하기 위해 SQL 및 Python과 유사한 스크립팅 언어를 제공합니다. 기존 애플리케이션과의 통합을 용이하게하기 위해 일반적으로 사용되는 다른 프로그래밍 언어로 API를 제공합니다. 금융 분야의 과거 데이터 분석 및 모델링 및 실시간 스트리밍 데이터 처리, 사물 인터넷 분야의 대규모 센서 데이터 처리 및 실시간 분석과 같은 시나리오에서 잘 수행됩니다.

1.2 Elasticsearch 소개

Elasticsearch는 Lucene 기반 검색 서버로 데이터의 로컬 디스크 스토리지 및 문서 지향 스토리지를 기반으로하는 분산 시스템입니다. 기존 데이터베이스와 유사한 비교 관계는 다음과 같습니다.

관계형 DB => 데이터베이스 => 테이블 => 행 => 열

Elasticsearch => 인덱스 => 유형 => 문서 => 필드

Elasticsearch 클러스터는 DolphinDB 데이터베이스에 해당하는 여러 인덱스 (인덱스)를 포함 할 수 있습니다. 각 인덱스에는 DolphinDB의 테이블에 해당하는 여러 유형 (유형)이 포함될 수 있습니다. 각 유형에는 DolphinDB 데이터에 해당하는 여러 문서 (문서)가 포함됩니다. 행; 그런 다음 각 문서에는 DolphinDB의 열 개념에 해당하는 여러 필드 (필드)가 포함됩니다.

2. 시스템 구성

2.1 하드웨어 구성

이 테스트의 하드웨어 구성은 다음과 같습니다.

장비 : DELL OptiPlex 7060

CPU : Inter (R) Core ™ i7-8700 CPU @ 3.20GHz, 6 코어 및 12 스레드

메모리 : 32GB

하드 디스크 : 2TB 기계식 하드 디스크

운영 체제 : Ubuntu 16.04 x64

2.2 환경 구성

이번 테스트 환경은 단일 서버 아래의 다중 노드 클러스터입니다. 독립 실행 형 환경에서 둘의 성능을 최대화하려면 DolphinDB 및 Elasticsearch에 대한 노드 매개 변수를 설정해야합니다. DolphinDB의 데이터 노드 수를 4로 설정하고 단일 데이터 노드의 사용 가능한 최대 메모리를 7GB로 설정합니다. Elasticsearch 노드 수를 4로 설정합니다. Elasticsearch는 Lucene을 기반으로하기 때문에 Lucene의 세그먼트를 메모리에로드하기 위해 일정량의 메모리를 할당해야하므로 Elasticsearch의 성능에도 큰 영향을 미칩니다.이 테스트에서는 8 개를 할당합니다. Lucene에 GB 메모리가 제공되고 Elasticsearch에서 단일 노드의 최대 사용 가능한 메모리는 6GB로 설정되며 스와핑이 금지됩니다.

3. 테스트 데이터 세트

DolphinDB 및 Elasticsearch의 성능을보다 포괄적으로 테스트하기 위해 크기가 다른 세 가지 스톡 데이터 세트를 사용했습니다. CN_Stock 데이터 테이블에는 2008.01.01부터 2017.12.31까지 중국 상하이 및 심천 주식의 일일 시세 데이터가 포함되어 있습니다. US_Prices 데이터 테이블에는 1990 년 1 월 2 일부터 2016 년 12 월 30 일까지 미국 주식 시장의 일일 시세 데이터가 포함됩니다. 데이터 시트 TAQ에는 2007 년 8 월 4 일 동안 총 60.6GB의 미국 주식 시장 레벨 1의 고주파 데이터가 포함되어 있습니다. 테스트 데이터 세트의 개요는 다음 표에 나와 있습니다.

d0f5b2ac7fb475b20c61de31564ee331.png

DolphinDB 및 Elasticsearch의 테스트 데이터 세트에서 각 필드의 데이터 유형은 다음과 같습니다.

(1) CN_Stock 테이블 데이터 유형 매핑

edc651a7c632e97a2a3961fcd86c4795.png

(2) US_Prices 테이블 데이터 유형 매핑

17e4aff6255d2bc11c4973b66b0d3405.png

(3) TAQ 테이블 데이터 유형 매핑

5263427d6736b3ab2ea8ca44d9ea5b9b.png

4. 파티션 / 샤딩 방식

DolphinDB 데이터베이스는 값 파티셔닝, 범위 파티셔닝, 목록 파티셔닝, 해시 파티셔닝 및 결합 파티셔닝을 포함한 유연한 파티셔닝 메커니즘을 제공하는 반면 Elasticsearch는 해시 기반 샤딩 메커니즘 만 지원합니다.

DolphinDB에서는 CN_Stock 테이블은 시간에 따라 6 개월마다 20 개의 파티션으로 나뉘고, US_Prices 테이블은 매년 시간에 따라 27 개의 파티션으로 나뉘며, 테이블 TAQ에는 날짜와 주식 코드의 조합이 사용됩니다. 총 100 개의 파티션이 있습니다. 매수는 1로 설정됩니다.

Elasticsearch에서는 샤드 수만 정의 할 수 있습니다. CN_Stock 테이블과 US_Prices 테이블의 경우 조각 수는 4로 정의되고 테이블 TAQ의 경우 조각 수는 100으로 정의됩니다. 매수는 1로 설정됩니다.

5. 비교 테스트

DolphinDB와 Elasticsearch를 데이터베이스 쿼리 성능, I / O 성능, 디스크 공간 및 메모리 소비 측면에서 비교했습니다.

5.1 데이터베이스 쿼리 성능 테스트

DolphinDB 스크립팅 언어는 SQL 문법을 지원하는 동시에이를 기반으로 어느 정도 확장되어 더욱 강력 해졌습니다. Elasticsearch에서는 SQL 문을 질의하기위한 플러그인을 설치해야하며 동시에 질의를 위해 JSON 데이터 형식을 기반으로 DSL (Domain Specific Language) 언어를 제공합니다.이 테스트는 DSL 언어를 사용합니다.

Elasticsearch의 주요 애플리케이션 시나리오는 퍼지 쿼리를 지원하는 검색 엔진입니다. 일반 쿼리의 경우 Elasticsearch는 기본적으로 10 개의 쿼리 히트 만 반환하고 집계 쿼리의 경우 반환되는 버킷의 기본 크기도 10입니다. DolphinDB의 각 쿼리에 의해 반환 된 결과는 모두 결과이며 퍼지 쿼리가 없습니다.

Elasticsearch의 집계 쿼리에는 반환 된 결과에 doc_count_error_upper_bound 및 sum_other_doc_count 필드가 있습니다.이 필드는 각각이 집계에서 반환되지 않았지만 존재할 수있는 잠재적 집계 결과와이 집계에서 계산되지 않은 문서 수를 나타냅니다. 이것은 또한 Elasticsearch의 기본 데이터 쿼리 작업이 데이터베이스의 모든 데이터 레코드를 정확하게 쿼리하는 대신 데이터베이스의 데이터 일부에 대해서만 퍼지 쿼리를 수행한다는 좋은 증거입니다. 공정한 환경에서 두 가지를 테스트하기 위해서는 Elasticsearch의 퍼지 쿼리를 해제해야합니다. 처리 방법은 Elasticsearch에서 스크롤 인터페이스를 사용하고 버킷 크기를 정의하여 Elasticsearch를 제어하여 모든 쿼리 결과를 반환하는 것입니다.

이 테스트에서는 DolphinDB 스크립트를 사용하여 DolphinDB 쿼리 성능 테스트를 완료했습니다. Python 스크립트 + DSL을 사용하여 Elasticsearch 쿼리 성능 테스트를 완료합니다.

세 개의 데이터 테이블에 대해 몇 가지 일반적인 SQL 쿼리를 수행했습니다. 결과에 대한 우발적 요인의 영향을 줄이기 위해이 쿼리 성능 테스트는 각 쿼리 작업에 대해 10 개의 쿼리를 수행 한 다음 총 시간을 밀리 초 단위로 평균화했습니다. 다음 표에는 각 테스트 데이터 세트의 테스트 스크립트와 결과가 나와 있습니다.

(1) CN_Stock 테이블

DolphinDB의 쿼리 스크립트 :

6756419a0c03a5ee21e51bd8a5cbc658.png

쿼리 성능 테스트 결과 (데이터 볼륨 : 5,332,932) :

436170aa8845c219b5128a73fa43a220.png

(2) US_Prices 表

DolphinDB의 쿼리 스크립트 :

01ba3e111169beef1ef7d7a4e129598f.png

쿼리 성능 테스트 결과 (데이터 볼륨 : 50,591,907) :

fd2f704f5f6deb9da2b65228aca4437c.png

(3) TAQ 테이블

DolphinDB의 쿼리 스크립트 :

90afe4dfa45bbc6f5fdd391726f4c350.png

쿼리 성능 테스트 결과 (데이터 볼륨 : 1,366,036,384) :

14edd7ea437fa80c1932d70278097e00.png

이 쿼리 성능 테스트를 위해 다음과 같은 결론을 도출 할 수 있습니다.

(1) 동일한 테이블에 대한 모든 테스트에서 DolphinDB의 성능은 Elasticsearch보다 몇 배 앞서 있습니다. 특히 단순 필터링 쿼리의 경우 DolphinDB의 성능은 Elasticsearch 성능의 1 ~ 2 자릿수입니다 (CN_Stock 표 1 ~ 4의 테스트 결과 및 US_Prices 표 1 ~ 4의 테스트 결과 참조).

(2) 집계 쿼리 관련 테스트 결과에서 DolphinDB의 성능도 Elasticsearch보다 평균 8 ~ 9 배 우수합니다. 특히 시간별로 그룹화 된 집계 질의에서 DolphinDB의 성능은 Elasticsearch의 13 ~ 15 배입니다 (CN_Stock 테이블의 테스트 결과에서 5 ~ 10, US_Prices 테이블의 테스트 결과에서 5 ~ 10 참조).

(3) 데이터 스케일이 다른 동일한 유형의 쿼리 테스트에서 데이터 스케일이 증가함에 따라 Elasticsearch의 정밀 쿼리의 시간 소모적 인 증가가 DolphinDB보다 훨씬 크고 DolphinDB는 다양한 데이터 스케일에서 뛰어난 안정성을 가지고 있음을 알 수 있습니다. Elasticsearch에서.

5.2 I / O 성능 테스트

Elasticsearch는 데이터를 일괄 적으로 쓰기위한 _bulk API를 제공합니다. 새 문서를 작성할 때 먼저 문서에 포함될 수있는 각 필드의 속성, 데이터 유형 (예 : 키워드, 텍스트, 정수 또는 날짜) 및 이러한 필드를 Lucene에서 색인화하거나 저장해야하는지 여부를 설명해야합니다. 그런 다음 Elasticsearch는 문서의 이러한 속성에 대한 해당 매핑을 빌드하고 반전 된 인덱스를 만들어 Lucene에서 세그먼트를 형성합니다. 마지막으로 반전 된 인덱스는 새로 고침 및 플러시 메커니즘을 통해 디스크에 저장됩니다. 메모리의 반전 된 인덱스를 디스크로 플러시하는 프로세스는 Elasticsearch의 성능을 결정하는 핵심입니다. Elasticsearch가 일괄 적으로 데이터를 가져 오는 _bulk API를 제공하지만 가져 오기 최적화를 위해 index.refresh_interval = -1 및 index. number_of_replicas = 0을 설정할 수도 있습니다. 그러나 대규모 데이터 가져 오기의 경우 메모리의 버퍼가 가득 차면 여전히 새로 고침이 트리거되고 디스크에 데이터를 저장하기 위해 플러시가 수행되므로 최적화 효과가 명확하지 않으며 Elasticsearch 데이터 가져 오기가 느립니다. 매우 중요한 단점.

DolphinDB에서 분산 데이터 테이블을 생성하고 데이터를 쓸 때 먼저 분산 데이터 테이블의 파티션 유형에 따라 서로 다른 파티션의 데이터가 기록되는 데이터 노드 위치를 결정합니다. 파티션 내에서 데이터는 Columnar Storage로 구성되며 노드 간 협력을 통해 데이터 임포트 및 쿼리 등의 작업을 수행하며 데이터 임포트 속도가 빠르고 성능이 매우 높습니다.

다음 표는 두 데이터 가져 오기의 I / O 성능 테스트 결과입니다. 특히 데이터 볼륨이 60.6GB 인 경우 데이터 볼륨이 증가함에 따라 ES / DDB의로드 시간 비율이 증가하는 것을 명확하게 확인할 수 있습니다. 당시 Elasticsearch 가져 오기에는 12 시간 이상이 걸렸습니다. 데이터 가져 오기 스크립트는 부록을 참조하십시오.

ea90aa95abae6e10fb01ac395454398b.png

5.3 디스크 공간 테스트

Elasticsearch는 검색 효율성과 적시성으로 유명합니다. Lucene 기반의 분산 검색 엔진이며 소스 필드의 내용을 압축하지만 내부적으로는 생성 된 각 문서에 대해 반전 된 인덱스를 구축하고 반전 된 인덱스를 디스크에 저장합니다. 추가 색인 정보를 디스크의 각 문서에 추가해야하므로이를 저장하려면 더 많은 저장 공간이 필요합니다. DolphinDB는 나머지 인덱스 정보가 필요하지 않으며 원본 데이터를 진정으로 압축하고 저장합니다. 테스트 결과는 아래 표에 나와 있습니다.

2557fe46c107b1a6cc5893a859ffed43.png

5.4 메모리 사용량

DolphinDB 및 Elasticsearch의 메모리 사용량을보다 포괄적으로 관찰하려면 Linux 명령 htop을 사용하여 DolphinDB 및 Elasticsearch의 메모리 사용량을 모니터링합니다 (총 메모리 크기는 32GB) 결과는 다음과 같습니다.

ecdf4d33bde2a2fbe0179bd3006d8f26.png

5.5 다른 측면에서의 비교

(1) Elasticsearch는 플러그인 설치를 통해 SQL 언어를 지원하며 내장 된 DSL 언어는 JSON 형식으로 구문이 더 복잡합니다. DolphinDB는 SQL 언어를 지원할뿐만 아니라 명령형, 벡터화, 기능적, 메타 프로그래밍, RPC 및 기타 프로그래밍 패러다임을 지원하는 완전한 스크립팅 언어가 내장되어있어 더 많은 기능을 쉽게 달성 할 수 있습니다.

(2) Elasticsearch의 주요 목적은 분산 된 다중 사용자 기능을 갖춘 전체 텍스트 검색 엔진을 제공하는 것입니다. 퍼지 쿼리를 지원하고 문서 (행)는 고정 구조가 필요하지 않으며 문서마다 다른 필드 세트를 가질 수 있습니다. DolphinDB는 구조화 된 데이터 만 지원합니다.

(3) DolphinDB는 금융 분야의 과거 데이터 모델링 및 실시간 스트리밍 데이터 처리, 사물 인터넷 분야의 실시간 모니터링 및 실시간 데이터 분석 및 처리와 같은 다양한 시나리오의 요구를 충족하기 위해 600 개 이상의 내장 기능을 제공합니다. 시계열 데이터 처리에 필요한 납, 지연, 누적 창, 슬라이딩 창 등 여러 지표의 기능을 제공하며 우수한 성능으로 성능에 최적화되어 있습니다. 따라서 Elasticsearch와 비교할 때 DolphinDB에는 더 많은 적용 가능한 시나리오가 있습니다.

(4) Elasticsearch는 시계열 데이터베이스에서 사용할 때 테이블 조인을 지원하지 않습니다 .DolphinDB는 테이블 조인을 지원할뿐만 아니라 asof 조인 및 창 조인과 같은 비 동시 조인 방법도 최적화합니다.

(5) DolphinDB는 데이터 쓰기를위한 분산 트랜잭션을 지원하지만 Elasticsearch는 트랜잭션을 지원하지 않습니다.

6. 요약

Elasticsearch는 많은 애플리케이션 시나리오에 적합한 정형 및 비정형 데이터, 퍼지 쿼리, 정밀 쿼리 및 집계 계산을 지원합니다. 그러나 DolphinDB와 같은 전문 시계열 데이터베이스와 비교할 때 기능 및 성능 측면에서 큰 차이가 있습니다. 특히 데이터의 양이 빠르게 확장되어 물리적 메모리의 상한선을 초과하면 높은 메모리 소비와 높은 디스크 공간 점유의 단점이 드러나고 이력 데이터 계산 성능이 크게 저하됩니다.

DolphinDB 및 Elasticsearch의 자세한 구성 정보, DolphinDB 및 Elasticsearch의 테스트 코드 및 데이터 가져 오기 스크립트는 부록에 나와 있습니다.


추천

출처blog.51cto.com/15022783/2576494