[HADOOP] 하이브의 델타 / 증분로드
HADOOP하이브의 델타 / 증분로드
아래의 사용 사례가 있습니다.
내 응용 프로그램에는 RDBMS DB에 다년간 데이터가있는 테이블이 있습니다. 우리는 sqoop을 사용하여 HDFS로 데이터를 가져 왔으며 년, 월별로 파티션 된 하이브 테이블에로드했습니다.
이제 응용 프로그램이 업데이트되고 매일 RDBMS Table 테이블에 새 레코드가 삽입됩니다. 이러한 업데이트 된 기록은 기록 개월에 걸쳐있을 수 있습니다. 갱신 된 레코드 및 새로운 삽입 레코드는 갱신 된 시간 소인 필드 (현재 날짜 시간 소인 있음)에 의해 판별 될 수 있습니다.
이제이 문제는 업데이트 된 레코드를 사용하여 델타 / 증분로드 하이브 테이블을 매일 수행하는 방법입니다.
-> 점진적으로 가져올 수있는 sqoop 기능이 있다는 것을 알고 있습니다. 그러나 새로운 증분 가져 오기만으로는 충분하지 않습니다.
때문에 -
-> 중복 레코드 (업데이트 된 레코드)가 발생할 것이므로 하이브 테이블에이 레코드를 직접 삽입 할 수는 없습니다 (삽입을 사용).
-> 동일한 방식으로 삽입 덮어 쓰기 명령문을 사용할 수 없습니다.이 방법은 여러 달에 걸쳐 레코드를 삽입하고 업데이트하는 것입니다. 삽입 덮어 쓰기는 이전 레코드를 삭제합니다.
물론 가장 쉬운 방법은 매일 sqoop을 사용하여 전체 데이터를 얻는 것입니다. 데이터 양이 많아지기를 원하지 않습니다.
따라서 기본적으로 업데이트 / 삽입 레코드를받은 파티션 만 완전히로드하려고합니다.
하이브 또는 스퀘어 엔드에서 옵션을 탐색 할 수 있습니다. 우리에게 알려주시겠습니까?
미리 감사드립니다.
해결법
-
==============================
1.업데이트는 하이브 기반 시스템에서 악명 높은 문제입니다.
업데이트는 하이브 기반 시스템에서 악명 높은 문제입니다.
하나의 전형적인 접근법은 2 단계 프로세스이다.
두 번째 단계는 잠재적으로 고통 스럽지만 주변에는 아무런 방법이 없습니다. Hive는 적절한 업데이트를 수행하지 않기 때문에 어느 정도는 덮어 써야합니다. 데이터에 따라 전체 덮어 쓰기를 피하기 위해 테이블을 영리하게 분할 할 수도 있습니다. 예를 들어, 1 단계가 몇 개의 파티션에만 삽입되는 경우 두 번째 테이블로 덮어 쓸 필요가 있습니다.
또한 액세스 패턴에 따라 두 번째 "중복 제거"테이블을보기로 설정하고 전혀 구체화하지 않는 것이 좋습니다. 보통 이것은 쿼리 시간에 대한 고통을 지연시킵니다.
본 적이있는 다른 방법은 매우 사용자 정의 된 입력 및 출력 형식을 사용하는 것입니다. 모든 것을 설명하기보다는 여기에서 읽을 수 있습니다. http://pkghosh.wordpress.com/2012/07/08/making-hive-squawk-like-a-real-database/
Owen O'Malley는 또한 표준 하이브에이 아이디어의 버전을 추가하기 위해 노력하고 있지만 아직 개발 중입니다 : https://issues.apache.org/jira/browse/HIVE-5317
-
==============================
2.일괄 삽입, 업데이트 및 삭제에 대해 직접지도 축소 방법을 사용할 수 있습니다. 자세한 내용은 여기에 있습니다. 본질적으로 병합 및 컴팩트 작동입니다. 2 차 정렬은 레코드의 타임 스탬프 또는 시퀀스 필드에서 수행되거나 HDFS 파일 이름으로 인코딩됩니다. 감속기 측면 조인의 레코드 마지막 버전이 출력으로 방출됩니다.
일괄 삽입, 업데이트 및 삭제에 대해 직접지도 축소 방법을 사용할 수 있습니다. 자세한 내용은 여기에 있습니다. 본질적으로 병합 및 컴팩트 작동입니다. 2 차 정렬은 레코드의 타임 스탬프 또는 시퀀스 필드에서 수행되거나 HDFS 파일 이름으로 인코딩됩니다. 감속기 측면 조인의 레코드 마지막 버전이 출력으로 방출됩니다.
https://pkghosh.wordpress.com/2015/04/26/bulk-insert-update-and-delete-in-hadoop-data-lake/
-
==============================
3.대량 데이터를 데이터 래크에 삽입하는 것과 비슷한 문제가있었습니다. 우리가 데이터를 통제하지 못했기 때문에 우리는 호수를 깨끗하게 유지하는 데 어려움을 겪었습니다. 이것은 하이브의 레코드를 업데이트하는 것이 아니라 동일한 레코드의 중복을 다시 피하는 것에 관한 것입니다.
대량 데이터를 데이터 래크에 삽입하는 것과 비슷한 문제가있었습니다. 우리가 데이터를 통제하지 못했기 때문에 우리는 호수를 깨끗하게 유지하는 데 어려움을 겪었습니다. 이것은 하이브의 레코드를 업데이트하는 것이 아니라 동일한 레코드의 중복을 다시 피하는 것에 관한 것입니다.
이 작업을위한 돼지 스크립트를 만들었습니다 :
CODATA = COGROUP HISTORICAL_DATA BY (key_col_1, key_col_2, ...), DAILY_DATA_DISTINCT BY (key_col_1, key_col_2, ...); CODATA_FILTERED = FILTER CODATA BY IsEmpty(HISTORICAL_DATA); SET_DIFFERENCE = FOREACH CODATA_FILTERED GENERATE FLATTEN($2); DUMMY = FILTER DAILY_DATA_DISTINCT BY $0==''; DAILY_NEW_DATA = UNION DUMMY, SET_DIFFERENCE;
그것은 세트 차이를 만듭니다. 아파치 DataFu SetDifference는 동일하지만 우리는 그것을 내부에서 사용할 수 없었다.
-
==============================
4.델타로드에 쉘 스크립트가 포함 된 솔루션을 하나 만들었으므로 하이브 데이터베이스에 점진적으로 추가 된 행을 제공하는 작업을 예약해야합니다. compelete 솔루션을 보려면이 링크를 따라야합니다.
델타로드에 쉘 스크립트가 포함 된 솔루션을 하나 만들었으므로 하이브 데이터베이스에 점진적으로 추가 된 행을 제공하는 작업을 예약해야합니다. compelete 솔루션을 보려면이 링크를 따라야합니다.
https://bigdata-analytix.blogspot.com/2018/10/hive-incrementaldelta-load.html
from https://stackoverflow.com/questions/24188544/delta-incremental-load-in-hive by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 멀티 코어 8 노드 클러스터에서 Hadoop Map 작업을 예약하는 방법은 무엇입니까? (0) | 2019.06.16 |
---|---|
[HADOOP] 파일을 날짜로 분할하여 kafka에서 hdfs로 가장 효율적으로 작성하는 방법은 무엇입니까? (0) | 2019.06.16 |
[HADOOP] pyspark 사용, hadoop 파일 시스템에서 2D 이미지 읽기 / 쓰기 (0) | 2019.06.15 |
[HADOOP] 네임 스페이스 이미지 및 로그 편집 (0) | 2019.06.15 |
[HADOOP] 메모리의 하둡 환원제 가치? (0) | 2019.06.15 |