ElasticSearch + 스파크는 관련성이 높은 서비스 및 천 개의 얼굴의 추천 시스템의 수천을 건설

ElasticSearch (이하 ES 라 함)의 오픈 소스 루씬 검색 엔진 제품에 기초한다. 루씬 인덱스, 섹션 등 관련 점수의 기본 기능을 반전 워드 문서, 도메인을 포함한 자바 문서 검색에 작성된 오픈 소스 라이브러리에 대한 기초이며, ES 직접 빌드 A를 사용할 수 있습니다,이 라이브러리를 사용하는 것입니다 검색 엔진은 제품을 사용합니다. 직관적으로 이해 루씬은 자동차 부품, 자동차 딜러와 직접 ES를 제공합니다.

말하자면 배아 줄기의 탄생, 그것은 매우 흥미로운 이야기이다. 그는 런던. 런던에 그의 새 아내 다음, 실직 엔지니어했다 몇 년 전 ES 저자 셰이 Banon-- "는, 그의 아내는 요리사로 배우고 싶었다, 그의 아내 응용 프로그램을 개발하려는 편리한 조리법 검색입니다 루씬 건물을 사용하여 직접 검색, 반복 작업의 큰 숫자를 포함하여 많은 문제를 가지고 왜이 루씬과 접촉. 셰이는 루씬 추상화를 기반으로 계속 자바 프로그램, 검색 쉽게에 포함 된 시간이 지남에 따라 연마 할 수 있도록 그들은 자신의 첫 번째 오픈 소스를 낳았다 후 나침반, 중국어, 즉 '나침반'수단을 사용할 수 있습니다., 셰이 직장에서, 개발 환경 배포 고성능의 얼굴에 새 직장을 발견, 그는 서서히에 대한 필요성을 발견 그는 나침반을 다시 작성하기로 결정 쉽게 사용, 고성능, 실시간, 분산 검색 서비스에, 그래서 그것은 도서관에서 독립 실행 형 서버로 구축하고, elasticsearch 이름을 변경합니다. "

 

눈에 보이는 프로그래머는 무엇을 사랑하는 것이 말했다되었지만이다 최대 수리를하는 아내의 레시피 검색 셰이 Banon 약속이 나오지했다 ......

이 문서는 아마도 도입 Wetest 사용 ES를 배운 ES의 원칙뿐만 아니라 몇 가지 교훈을. 여기에 초점이 또한 구덩이의 핵심 사항에 대한 단계가 설명되어 있고, 실제 프로젝트를 사용할 수 데리러 있도록 기능과 지식 ES 자체는 매우 넓다.

주요 개념
클러스터 ( 클러스터) : ES는 일반적으로 여러 물리적 시스템으로 구성된 분산 검색 엔진입니다. 이러한 물리적 시스템은 동일한 클러스터 이름을 배열하여, 클러스터에 스스로를 조직, 서로를 발견했다.

노드 ( 노드)하십시오 Elasticearch 호스트의 클러스터.

마스터 슬라이스 ( 주 파편) : 물리적 인덱스 서브 세트 (후술). 같은 인덱스는 물리적으로 서로 다른 노드에 배포 여러 부분을 절단 할 수있다. 분열은 루씬 인덱스를 얻을 수있다.

참고 : ES가 더 이상 변경 후 설립 색인을 지정할 필요가 인덱스에 조각의 수입니다. (가) 인덱스를 생성하기 시작에서 그래서 우리는 데이터 크기, 합리적인 범위 내에서 조각 분포의 수를 예상해야한다.

복사 조각 ( 복제 파편이) : 각 주요 시트는 하나 개 이상의 사본, 자신을 구성 할 수있는 사용자의 수를 가질 수있다. ES는 내결함성을 개선하기 위해, 서로 다른 노드에 배포 같은 인덱스의 다른 조각을 시도합니다. 파편이 연결되어있는 경우 인덱스에,만큼 모든 기계, 그들은 사용할 수있다. 기본 개념, 복사, 노드는 다음과 같습니다 :

 

 


인덱스 ( 지수) : 논리적 개념, 문서 개체의 컬렉션을 검색 할 수 있습니다. 개념은 데이터베이스 DB와 유사하다. 클러스터로 여러 인덱스를 만들 수 있습니다. 예를 들어, 제조 환경에서의 일반적인 방법은 매월 생성 된 데이터를 인덱싱 제어 순서의 하나의 인덱스를 보장한다. 인덱스 -> 유형 -> 문서는 이러한 논리 조직까지 문서를 ES.

(입력 데이터베이스 테이블 거의 비슷 인덱스의 개념 아래 : Type을). 같은 인덱스는 여러 유형을 포함 할 수 있습니다. 이 수준에서 실제 사용에서 개인 감정 유형은 종종 이런 종류의 문서의 컬렉션을 설정하고 검색을 계속에서, 지수에 직접 유형을 구축, 아주 많이 사용된다.

문서 ( 문서) : 문서 검색 엔진의 개념, 즉, 그것을 검색 할 수있는 ES의 기본 단위, 데이터베이스 행에 해당하는 레코드이다.

필드 ( 필드) 데이터베이스 열에 대응한다. ES, 모든 문서는 사실, JSON의 형태로 저장된다. 문서는 다수의 필드 세트로 간주 될 수있다. 예를 들어, 문서를 테마로, 추상, 텍스트, 저자, 시간 및 기타 정보를 포함 할 수 있습니다, 각각의 정보는 바닥에 디스크 필드, JSON 문자열에 통합의 마지막 존재이다.

매핑 ( 매핑) :

데이터베이스에 해당하는 유형 필드를 제한하는 데 사용되는 스키마,하지만 매핑 Elasticsearch 자동으로 문서의 데이터를 기반으로 만든, 지정된 표시되지 않을 수 있습니다.

Elasticsearch은 매우 친절 편안한에게 API를 제공, 당신은 HTTP 요청을 통해 직접 모든 작업을 완료 할 수 있습니다. 다음은 인덱스에 문서를 추가 트위터 등 공식의 예이며, 유형은 아이디 트윗 문서는 1,이다 :

 

따라서, 따라서 , 검색된 문서의 사용자 필드 :


주요 구성 항목
번호 파편 1, 인덱스 : 
파편의 수는 더 나은 및 관련 노드의 수. 이론적으로 같은 인덱스, 최고의 하나 이상이에 파편의 수, 그래서 가능한 한 각 쿼리 병렬. 배아 줄기는 고려 그렇다면, 파편의 수를 다시 조정하는 방법을 결정하기 때문에하지만 데이터는 빠른 성장보다 캔의 할당하기 시작 될 것입니다. 파편의 수를 동적으로 새로 추가 된 인덱스를 조정할 수 있기 때문에 - 또 다른 일반적인 아이디어는 시간 위도 (달)에 의해 ES 인덱스를 정의하는 것입니다. 이러한 중합 Wetest 때문에 ES 관리, 그래서 파편의 수 (200이다) 정의하지만 너무 많은 파편이 일반적으로 권장되지 않으며, 데이터 채널 인하에 따라 가능한 한 분리의 필요성, 이동하려면 다음 예제와 같은 일부 다른 경우, 오버 헤드가있다.

2, 힙 메모리 : 
공식 조언을 절반 가능한 메모리, 시작입니다 ES 환경을 완성 환경 변수 방법을 정의합니다. 수출 ES_HEAP_SIZE = 10g

3, cluster.name : 
클러스터의 논리적 이름. 단지 클러스터 컴퓨터 같은 이름은 논리적 클러스터를 형성 할 것이다. 예를 들어, 네트워크 ES 시스템 (5)의 예는, 몇 가지 비 - 간섭 ES 클러스터로 구성되어있다.

4, discovery.zen.minimum_master_nodes : 
이것은 최소한의 분산 클러스터에 대한 결정이다 기계의 마스터 수. 조정 및 일반적인 분산 알고리즘은 같은 피 분할 뇌 현상 위해, 그것은하는 것이 좋습니다 더 머신의 절반 이상, N / 2 + 1

5, discovery.zen.ping.unicast.hosts : 
머신의 목록이 클러스터를 ES. 참고 최종 형태 클러스터 ES는 모든 기계를 발견 할 것이다, 각 시스템이 구성되어 서로 연결할 수있는 다른 컴퓨터로 구성되어있는만큼, 연결된 그래프처럼, 클러스터 목록에있는 모든 기계 구성의 단일 지점없이 ES. 에서 [ '111.111.111.0', '111.111.111.1' '111.111.111.2']

매핑
매핑 데이터베이스 테이블 구조는 매핑 정의 인덱스를 생성한다는 의미와 유사하다. 차이는 실행 시간이 아직 인덱스가 정의되지 않은 경우 데이터베이스 인덱스는 ES가 자동으로 생성되는 필드와 문서의 내용에 기초한다, 예컨대 상기 트위터 인덱스 문서 데이터의 삽입으로 매핑 디스플레이를 확립 할 필요가 없다는 것이다 색인 및 매핑. 그러나 인덱스 필드가 이렇게 만든, 5 월은 종종 우리는 필요가 무엇인지. 그래서 수동으로 또는 인덱스를 만들 수있는 자신 만의 미리 정의 된 매핑이 더 좋다. 여기 my_index에서 사용자에 대해이 디렉토리를이 예제의 맵핑을 작성, 블로그 게시물 매핑의 이러한 유형을 작성하는 예입니다. 다음과 같은 속성 등 문자열, 숫자, 날짜, 유형을 포함하여 다양한 분야에서 정의되는 것을 특징으로 정의된다.

적색 프레임 부에 도시 된 바와 같이, 본 실시 예에서는 두 가지주의 사항이있다 :

1, 문자열 형식의 USER_ID,하지만 지수는 그 의미를 명확히하기 위해 "not_analzyed", 필요에 정의되어 원본 문서의 말씀으로 후 : 일반적으로 다음과 같이 엔진이 전체 텍스트 검색 기능을 간단하게 구현 될 검색 이 단어는 최종 결과를 얻기 위해, 지퍼 결과를 등 역 색인, 병합, 관련 순위를 끌어 이상으로 분할 결과를 반전 된 인덱스를 만들 줄을 검색 한 다음 사용자의 쿼리 단어 분할을 수행합니다. 그러나 필드의 일부 문자열 유형에 대한 사실, 당신이 정확히 일치를 원 반전 구축하고자하지 않는 등 사용자의 이름으로, 단지 나중에 단어 "장을 얻기보다는,"조 스미스 "로 정확한 이름 필드 발견 사 "와"리 셋 "두 사람이 시간, 우리는 인덱스 필드의 유형을 정의해야합니다. 이 필드는 더 분석, 더 간단하게이 필드는 일치 검색 키워드 쿼리가 있습니다 not_analyzed, 전체 텍스트 검색 및 분석을 통해 구축 할 수있는 방법입니다 분석, 색인을 포기하지 않았다, 세 가지 유형을 not_analyzed 없다.

당신은 "형식"의 다양한 통해 매핑 요구 사항을 만들 때 2, 날짜 형식은 입력 형식 가능한 시간을 지정합니다. 문서를 만들 때, ES가 자동으로 입력 필드로 이동합니다가 결정 어떤 종류의 문서를 기반으로합니다. 직관적으로 상상에서 문서를 만들 때, 성능 향상을 위해 약간 작아야한다 동적 ES 판단의 오버 헤드를 제거, 특정 시간 형식을 지정합니다. 당신은 삽입시 표시 명확해야 혼합해야하는 경우 또한, 관심을 지불, epoch_second (초 단위 타임 스탬프)와 (밀리 초) epoch_millis이 혼합 않으려 고하는이다. 유무가 구덩이를 강화, epoch_second 초 타임 스탬프를 삽입하지만, 우선 순위가 감소 시간의 결과로, 밀리 초 ES 고려하면 1000 배, 1970 년 올해의 시간으로 바뀌 가장 최근의 시간입니다.


상기지도 방송 데이터 유형 맵핑이 ES의 현재 버전에서 수행 될 수는 내장 필드 파라미터 매핑 동작을 수행 할 수있다. 하지 여기에 자세히 설명 공간 이유 때문에 :

 


여기에 우리가 자세히 설명, 빨간색 상자 위의 그림은 우리가 생성, 표시되어 두 개의 내장 유형, 두 개의 매핑 매개 변수가 실제로 사용 매핑 더 중요합니다. 이들은 직접 인덱스 마지막 방문의 성능에 영향을 미칠 것입니다 :

 

 

1) _source이 원래 데이터의 전체 양으로 이해 될 수 있도록, 그 인덱스로 사용될 수 없지만 필요할 때 반환 할 수 있습니다, 디스크에 원시 JSON 가을을 구성하는 모든 필드를 es'll. 지원하지 않는 업데이트하는 스크립트와 같은 장애인으로, 장애인에 관심을 지불하지 않으려 고.

2) _all : 전체 텍스트 인덱스에 대해 "의사"필드 흐리게. 이해 될 수있다 : 인덱스를 만들 때, 모든 필드는 문자열, 다음이 "큰"단어 분할 필드, 내장 반전, 다음 필드가 삭제됩니다, 정말 디스크에 빠지지을한다. 어떤 도메인이 쿼리에 지정되지 않은 경우 전체 텍스트 검색은,, 등의 제목으로, (매우 일반적이다) 텍스트는 다음 행 아래로 큰 지퍼에서 문서를 당겨합니다. , 날짜, 점수, 그것이 _all에 의미가 포함되지 않을 수 있습니다 전체 텍스트 검색이 시간, 제목, 문서 등의 텍스트 필드와 같은 일부 마커 또는 값 형식 필드를 상상해 _all에 포함되어 있습니다 인. 다음은 될 수있는 건설 매핑에, 바람직 지정했습니다.

3) doc_values ​​: doc_values ​​중합을 기본적으로 사용되는 이러한 통계 파라미터 선별에 사용 된하기의 field_data () 후술이다. 정렬, 집계,이 작품은 역 색인은 확실히 부적절와 함께, 글로벌 문서에서 수행. 따라서, not_analyzed 분야, 저장 문서에 대한 열 모드 (HBase를 참조)의 방법으로 doc_values이 위를 기록하였고, 쉽게 문서의 글로벌 통계를 만들기 위해의 (즉, 반전 내장되지 않음). doc_values는 일부 필드를 취소하는 경우 단지 통계,이 가을을 해제 할 수 없습니다, 보여 간다, 디스크에 저장됩니다. Doc_values는 확실히 색인 분석 필드 (두 컷 단어, 부적절한 생각, 열 인덱스 일을 구축하는 방법),하지만 다음과 같은 필드 데이터와 함께.

4) field_data는 : 분석 된 텍스트 필드에 텍스트로, 사실, ES는 또한 주요 문서 중합 통계의 일부 지원 등의 통계에 대한 수요 (있을 수 있지만이 작업을 일반적으로 사용되는 방법은 하둡 또는 오프라인 도구를 통해 좋은 작업을 할 밀려 독립 실행 형, 온라인 인덱스를 분석 한 후, 실제로는 조금 이상한 느낌 ES)에서 직접 계산합니다. 검색 엔진에 적합하지가 할,하지만 당신은 정말로하지만, ES는, 필드의 데이터를 동적으로로드 메모리에 데이터를 넣어 작업을 수행합니다. 당신이 알고 그래서, 생각이 매우 메모리 집약적 인 작업, 그것은 JVM 힙이 완료 가능하다! ! ES는 기본적으로 활성화되어 있지만,이 동적로드 메모리 (게으른 방법)에 가기 전에, 분류 및 중합의 도메인을 분석해야 할 바로 그 때,로드하지 않습니다. 그래서,이 판도라의 상자를 열 쿼리시 이동하거나 단순히 줄을 해제 할 수있는 옵션을 넣어하지하려고합니다.

중합
검색 엔진은 검색 할 수 있습니다 말한다 누구? ES는 검색 할 수 있습니다뿐만 아니라, 직접 검색 통계 결과의 컬렉션, 매우 강력하다. ES 주로 두 가지 방법이 현재 안정한 비 - 상 중합 실험 : 측정 항목 집합 (집합 인덱스) 및 버킷 집계 (배럴 중합).

중합의 주요 지표는 공식과 같은 수학적 통계 클래스 기존 작업의 집합을 말한다 모든 빨간 자동차가 트랜잭션을 발견하고 자신의 평균 가격을 찾을 :이 예제의 가이드 :

결과는 다음과 같습니다

매직 그것 ~ 같은 최대 값, 최소값, 합계 수, 지리적 좌표 계산 등과 같은 컴퓨팅 기타 통계를 더 포함한다. 그러나 우리가 원하는 오늘 설명 할 수있는 사례가 될 주로 버킷 집계, 배럴 중합이다. 이는 주어진 필드는 다른 그룹으로 구분하고, 상기 설정 동작의 중합에 의한 폴리머 욕조 문서를 지칭하고, 욕조 수준의 결과를 반환한다. 그래서 히스토그램, 하위 시간 통계와 같은 : 더 직관적 인 이해. 다음 예는 색 영역에 따른 중합체 욕조 중합 기간, 즉,이고, 매칭 정밀도 나누는 욕조, 욕조 상기 중합 중첩 평균 가격, 부품의 제조 키트 상기 중합 방법.

이 아래 빨간 차 같은 조사 결과 총 네, 평균 가격은 32500이며, 또한 세 혼다와 BMW 1 포함

위에서 간단한 예이다. 우리에 WeTest 여론 등 뜨거운 게시물 포럼 기능이 즉, 데이터 소스, 포럼 (예 : 왕의 영광으로, 오른쪽), 일정 기간 (예 : 바이 포스트 바 등) 실시간 통계 (예 : 3 개월) 답장을 TopN 게시물의 최대 수.

상세히 설명하지 온라인 방법이 기능은 현재 구현되고, 데이터베이스에서 일반적으로 스택을 유지 HBase를 대응하는 스캔 데이터는 TOP N 아이디어를 획득한다. 다른 한편으로는 요청의 많은 양의 DB 액세스 및 HBase와 압력을 가져올 가능성이있다에 한 손으로, 다소 시간이 소요, 그것은 또한 다른 방식을 찾고, 우리는 ES를 사용하여 생각했다.

사용하기 위해서는 중합 ES 배럴, 방법 (이다, 모든 사용자 댓글) 프로그램을 문서를 저장하는 우리 최초의 디자인. 데이터의 양이 매우 크기 때문에 (억), 우리는 다른 인덱스에 문서 (예 : 매월 등), 후 해당 월에 처음으로 생각 때문에 (예를 들어, 3 개월) 지수, 대부분의 최고 댓글 중합 게시 할 수 있습니다. 그러나,이 문제는 다음 인덱스 ES 복수의 중합, ES 함께 중합을 TopN가 있지만, 개별적으로 색인을 TopN 후에 측정 된 모든 인덱스 결과와 함께 중합 넣지 때. 구덩이를 사용할 때주의를 기울입니다. 이것의 결과 (예 : 삼개월로, 매월 최고 1 아닙니다을 TopN 아닌 진짜을 TopN 밖으로 여러 인덱스에 직접 중합하지만, 상위 1 지역 3 개월까지 추가된다 최적)는 글로벌 최적 같지 않다.

그래서, 시간 분할에서, 기본적으로이 도로는 폐쇄되었습니다. 공간 분할에서 새 (당신은 도움이되지 수 있지만 물어 분할? 데이터의 양 중 하나 억, 수백 GB는 찾을 파일의 몇 백 GB에서, 순종, 때마다 그것을 슬라이스하지 뭔가도) ... 어떻게 천천히 알 것 같아요. 1) 어떻게 해시 데이터 파편에 : 공간 분할에서, 또한 우리는 두 가지 질문을 고려해야합니다. 2) 얼마나 많은 파편 슬라이스. 첫 번째 문제를 들어, 우리는 (포럼으로 이해 될 수있다)에 따라, 교차 채널, 따라서, 파편 채널 ID에 따라 할당 할 수없는 것 같은 포럼 데이터 해시 파편이 될 수있는 각 채널에 대한 전체 통계에 있기 때문에 . 따라서, 채널에서의 각 요청 중합 결과는 요청 샤드 동작 라우팅 해당 채널 ID 방법. 두 번째 질문의 경우, 그것은 특정의 크기에 따라 달라집니다. 우리는 가능한 한 작은 각 파편의 내용 희망, 그래서 하나의 샤드 시간에 그 중합을 보장하기 위해 우리는 G의 수백, 데이터 소스의 수천 데이터의 양은 물론, 파편의 수 있지만 너무 많이, 그렇지 않은 것, 빠른 것 매우 큰 관리 오버 헤드 ES 소개. 아래 통합, 파편의 수는 우리는 (200)를 선택했다.

불행하게도, 만 지정된 키 (포럼 ID)를 기반으로 라우팅이 후 ES는 서로 다른 데이터 파편에 리드가 전체 평균없는 해시를 수행 10기가바이트 만 수십 MB의 최소의 최대 값을 초과. 당신이 접근을 균형 파편에 규칙이나 데이터를 라우팅 정의를 열면 일일 경우, 훨씬 더 나은, ES.

종종 ES 비판 곳은 상대적으로 느린 인덱싱, 그것은 몇 일이 소요 오랫동안 구축 10 억의 인덱스 데이터입니다. 그것은 또한 쉽게 이해하는 것입니다, 공짜가 없다, 읽기 및 쓰기 성능, 상호 배타적 빠른 느릴 수밖에 없다 작성 미리 설정된 보조 데이터를 많이 읽고 색인 및 검색 수단 경향이있다. 선택하는 방법, 당신은 따라 실제 비즈니스 시나리오를보고해야합니다. 여기에 인덱스 이후에 내장되어, 포럼의 최고 게시물라고 시간의 집계 인터페이스 지정된 기간으로 이동합니다.

 그런 다음, 우리는 테스트 된 기존 ES 및 온라인 서비스의 각각에서 두 채널의 결과를 retie Top30 연속 통계 섹시한을 TopN (N 다른의 번호) 방법이있다 :

다섯 위에 육안으로도 현재의 결과를 반영하는 통계적 방식으로 종래의 통계적 방법과 여론 라인 ES 중합 Wetest 결과를 얻기 위해 시간이 소요.

결과에서, 우리는에 대해 추론 ES 통계 집계 작업의 연습 : 우선 대회의 모든 데이터에 필터 기준 메모리에 작업을 정렬 및 집계 후 검색합니다. 즉, 큰 데이터 정규화 느린 중합 조작의 순서이다. 이 원칙에 맞춰, 결과는지도를 이해하는 것이 더 쉬울 것이다 :

1) 후 열 중합에 뜨거운 채널 연속 Top1000 동안 ES 성능은 대부분의 기존 구현 우수하다. 이 채널 Top1000는, 채널의 대부분은 아주 작은 파편에 있었기 때문에, 일부 단지 몇 메가 바이트, 데이터의 양이 같은 파편의 중합가 매우 빠르고, 작은입니다.

2) 시간, 위도, 통계 삼개월 데이터, 대부분의 경우 기존의 방법보다 느리게 ES, 다음 한 달 또는 1 일의 상황은 빠르게 ES. 이 데이터 증가의 순서의 조건에 향후 3 개월 및 준수가 (30,000 주제 스레드의 최대가) 때문이다 운영 효율성이 더 강력한 떨어 ES.

3) Top1000 상위 10 위의 총 시간, ES 서서히 종래 저하. 이 공간 위도 때문에, 상위 10 위 채널 ES 작업 효율이 더 강력 감소 있도록하기 위해 데이터의 조건이 매우 큰 만족이다.

이 실험을 수행 한 후, 데이터 소스의 헤더에있는 ES WeTest 중합 속도는 지금이지만, 데이터의 중간 및 그 중합을 나타내는 것은 ES, 더 긴 꼬리 영향을받는 후보 세트 금액에 효과가 그렇다면, 매우 큰 속도보다 더 빠르게 아니다 이 접근법은 또한 아직 최종 전환된다. 그러나이 실험은 적어도 코드는 통계 작업 등 대용량 데이터가 완료 인터페이스를 통해 호출 할 수 있습니다 무엇을 직접 작성하지 않는, ES 중합의 힘을 보여, 여전히 매우 편리한 일이지만 성능도 좋다. 압력이 통계 작업을 DB 구현을 증가 경우, 요청 ES 중합의이 부분을 분리하여, 또한 아주 좋은 선택입니다.

추천

출처www.cnblogs.com/itpy/p/11872066.html