복붙노트

[HADOOP] 하이브, S3, EMR 및 복구 파티션으로 데이터로드

HADOOP

하이브, S3, EMR 및 복구 파티션으로 데이터로드

해결 :이 문제에 대한 '해결책'은 아래의 업데이트 # 2를 참조하십시오.

~~~~~~~

s3에서 다음과 같은 중첩 된 디렉토리 구조에 저장된 일부 로그 * .gz 파일이 있습니다.

s3://($BUCKET)/y=2012/m=11/d=09/H=10/

나는 Elive Map Reduce (EMR)의 하이브에 다음과 같은 다중 레벨 파티션 스펙을 사용하여로드하려고 시도하고있다.

create external table logs (content string)
partitioned by (y string, m string, d string, h string)
location 's3://($BUCKET)';

테이블 만들기가 작동합니다. 그런 다음 기존 파티션을 모두 복구하려고 시도합니다.

alter table logs recover partitions;

이것은 작동하는 것 같아요 내 s3 구조를 통해 드릴 다운 및 디렉토리의 모든 다양한 수준을 추가 할 :

hive> show partitions logs;
OK
y=2012/m=11/d=06/h=08
y=2012/m=11/d=06/h=09
y=2012/m=11/d=06/h=10
y=2012/m=11/d=06/h=11
y=2012/m=11/d=06/h=12
y=2012/m=11/d=06/h=13
y=2012/m=11/d=06/h=14
y=2012/m=11/d=06/h=15
y=2012/m=11/d=06/h=16
...

따라서 Hive는 내 파일 레이아웃을보고 해석 할 수 있습니다. 그러나 실제 데이터는로드되지 않습니다. 간단한 계산을하거나 *를 선택하려고하면 아무 것도 얻지 못합니다.

hive> select count(*) from logs;
...
OK
0

hive> select * from logs limit 10;
OK

hive> select * from logs where y = '2012' and m = '11' and d = '06' and h='16' limit 10;
OK

생각? 파티션을 복구하는 것 이상의 데이터를로드하기 위해 몇 가지 추가 명령이 누락 되었습니까?

명시 적 위치가있는 파티션을 수동으로 추가하면 작동합니다.

alter table logs2 add partition (y='2012', m='11', d='09', h='10') location 's3://($BUCKET)/y=2012/m=11/d=09/H=10/'

이 작업을 수행하기위한 스크립트를 작성할 수는 있지만 '파티션 복구'와 같은 근본적인 것이 빠져있는 것처럼 느껴집니다.

업데이트 # 1

Joe K가 아래의 주석에서 훌륭하고 예리한 관찰을했기 때문에 대 / 소문자 구분 문제가 여기에 포함될 수 있다고 생각합니다.

파일은 대문자 H와 함께 다음 경로 스펙과 같이 명확하게 구성되어 있습니다 (이것은 iso8601 형식에 대한 일부 고개가 아닐 수 있습니다).

s3://($BUCKET)/y=2012/m=11/d=09/H=10/

적절한 대소 문자를 사용하는 파티션 스펙으로 외부 테이블을 작성합니다.

partitioned by (y string, m string, d string, H string)

( 'H'에 주목하십시오). 나는 디렉토리를 통해 재귀하고 파티션을 적절하게 찾지 만 어떻게 든 (지금까지 모든 유익한 장소에서 'H'를 사용하고 있음에도 불구하고) 실제로 하이브가 소문자로 저장하는 것처럼 보이는 복구 파티션을 수행합니다 'h' :

hive> show partitions logs;
OK
y=2012/m=11/d=06/h=08

( 'h'참고). 그래서 하이브는 파티션을 발견 할 수 있지만 소문자 형태로 저장합니다 ... 나중에 S3가 대소 문자를 구분하기 때문에 데이터를 찾을 때 이러한 경로는 물론 비어 있습니다.

나는 모든 데이터를 소문자 디렉토리 구조로 옮기고 그것을 작동시키는 지 볼 것이다 ...

업데이트 # 2

실제로, 파티션 이름으로 대문자로 된 'H'(s3 파일 레이아웃에서)가 문제 였음을 확인했습니다. 내가 알 수있는 한, 이것은 일어난 일이다.

'recover partitions'명령은 아마존이 저술 한 하이브의 확장판입니다. 나는이 버그가이 구성 요소에 있다고 생각합니다. 내 지식 네이티브 하이브는 파티션 검색을위한 파일 루트를 탐색하는 개념이 없습니다 ...

해결법

  1. ==============================

    1.시간 입력란에 문제가 있습니다!

    시간 입력란에 문제가 있습니다!

  2. from https://stackoverflow.com/questions/13319080/loading-data-with-hive-s3-emr-and-recover-partitions by cc-by-sa and MIT license