Hive 테이블을 설정하여 Hive 명령 실행 - Amazon EMR

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Hive 테이블을 설정하여 Hive 명령 실행

데이터 웨어하우스 애플리케이션인 Apache Hive는 유사 SQL 언어를 사용하여 Amazon EMR 클러스터에 포함된 데이터를 쿼리하는 데 사용할 수 있습니다. Hive에 대한 자세한 내용은 http://hive.apache.org/를 참조하십시오.

다음 절차에서는 이미 클러스터를 생성하고 Amazon EC2 키 페어를 지정했다고 가정합니다. 클러스터 생성을 시작하는 방법에 대한 자세한 내용은 Amazon EMR 관리 안내서에서 Amazon EMR 시작하기를 참조하세요.

사용하도록 Hive를 구성하십시오. MapReduce

DynamoDB 테이블을 쿼리하기 위해 Amazon EMR에서 Hive를 사용하는 경우 Hive에 기본 실행 엔진인 Tez가 사용된다면 오류가 발생할 수 있습니다. 따라서 이 섹션에 설명된 대로 DynamoDB와 통합되는 Hive로 클러스터를 생성할 때는 Hive가 사용하도록 설정하는 구성 분류를 사용하는 것이 좋습니다. MapReduce 자세한 정보는 애플리케이션 구성을 참조하세요.

다음 스니펫은 Hive의 실행 엔진으로 설정하는 MapReduce 데 사용할 구성 분류 및 속성을 보여줍니다.

[ { "Classification": "hive-site", "Properties": { "hive.execution.engine": "mr" } } ]
Hive 명령을 대화식으로 실행하려면
  1. 마스터 노드에 연결합니다. 자세한 내용은 Amazon EMR 관리 안내서에서 SSH를 사용하여 프라이머리 노드에 연결을 참조하세요.

  2. 현재 마스터 노드에 대한 명령 프롬프트에 hive를 입력합니다.

    Hive 프롬프트 hive>가 표시됩니다.

  3. Hive 애플리케이션의 테이블을 DynamoDB의 데이터에 매핑하는 Hive 명령을 입력합니다. 이 테이블은 Amazon DynamoDB에 저장된 데이터에 대한 참조로 사용되며, 데이터는 Hive에 로컬로 저장되지 않습니다. 따라서 이 테이블을 사용하는 모든 쿼리는 DynamoDB의 실시간 데이터에 대해 실행되므로 명령을 실행할 때마다 테이블의 읽기 또는 쓰기 용량이 소비됩니다. 동일한 데이터 세트에 대해 여러 Hive 명령을 실행하려면 먼저 해당 데이터 세트를 내보내는 것을 고려해 보십시오.

    다음은 Hive 테이블을 DynamoDB 테이블에 매핑하는 구문을 보여 줍니다.

    CREATE EXTERNAL TABLE hive_tablename (hive_column1_name column1_datatype, hive_column2_name column2_datatype...) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodb_tablename", "dynamodb.column.mapping" = "hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name...");

    DynamoDB에서 Hive에 테이블을 생성하는 경우 EXTERNAL 키워드를 사용하여 외부 테이블로 생성해야 합니다. 외부 테이블과 내부 테이블의 차이점은 내부 테이블을 삭제하면 내부 테이블의 데이터가 삭제된다는 점입니다. 이는 Amazon DynamoDB에 연결된 경우에 바람직한 동작이 아니므로 외부 테이블만 지원됩니다.

    예를 들어 다음 Hive 명령은 Hive에서 DynamoDB 테이블 dynamodbtable1을 참조하는 hivetable1 테이블을 생성합니다. DynamoDB 테이블 dynamodbtable1에는 기본 키 스키마가 있습니다. hash-and-range 해시 키 요소는 name(문자열 형식)이고, 범위 키 요소는 year(숫자 형식)이고, 각 항목에는 holidays(문자열 세트 형식)에 대한 속성 값이 있습니다.

    CREATE EXTERNAL TABLE hivetable1 (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays");

    라인 1에서는 HiveQL CREATE EXTERNAL TABLE 문을 사용합니다. hivetable1에 대해 DynamoDB 테이블의 각 속성 이름 및 값 페어에 대한 열을 설정하고 데이터 형식을 제공해야 합니다. 이러한 값은 대소문자를 구분하지 않으므로 열에 예약어를 제외한 모든 이름을 지정할 수 있습니다.

    라인 2에서는 STORED BY 문을 사용합니다. STORED BY의 값은 Hive와 DynamoDB 사이의 연결을 처리하는 클래스의 이름입니다. 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'로 설정되어야 합니다.

    행 3에서는 TBLPROPERTIES 문을 사용하여 'hivetable1'을 DynamoDB의 올바른 테이블 및 스키마에 연결합니다. TBLPROPERTIESdynamodb.table.namedynamodb.column.mapping 파라미터의 값을 제공합니다. 이러한 값은 대소문자를 구분합니다.

    참고

    테이블에 대한 모든 DynamoDB 속성 이름은 Hive 테이블에 해당 열이 있어야 합니다. Amazon EMR 버전에 따라 one-to-one 매핑이 없는 경우 다음과 같은 시나리오가 발생합니다.

    • Amazon EMR 버전 5.27.0 이상에서는 커넥터에 DynamoDB 속성 이름과 Hive 테이블의 열 one-to-one 간의 매핑을 확인하는 검증 기능이 있습니다. 매핑이 존재하지 않으면 오류가 발생합니다. one-to-one

    • Amazon EMR 5.26.0 이하 버전의 경우, Hive 테이블에는 DynamoDB의 이름 및 값 페어가 포함되지 않습니다. DynamoDB 프라이머리 키 속성을 매핑하지 않을 경우 Hive에서 오류가 발생합니다. 비기본 키 속성을 매핑하지 않는 경우에는 오류가 발생하지 않지만 Hive 테이블에 데이터가 표시되지 않습니다. 데이터 형식이 일치하지 않으면 값은 널입니다.

그런 다음 hivetable1에서 Hive 작업을 실행할 수 있습니다. hivetable1에 대해 실행되는 쿼리는 DynamoDB 계정의 DynamoDB 테이블 dynamodbtable1에 대해 내부적으로 실행되며, 실행할 때마다 읽기 또는 쓰기 유닛을 소비합니다.

DynamoDB 테이블에 대해 Hive 쿼리를 실행하는 경우 충분한 양의 읽기 용량 유닛을 프로비저닝했는지 확인해야 합니다.

예를 들어 DynamoDB 테이블에 읽기 용량 유닛을 100개 프로비저닝하였다고 가정하겠습니다. 그러면 초당 100회의 읽기(또는 409,600바이트)를 수행할 수 있습니다. 테이블에 20GB의 데이터(21,474,836,480바이트)가 포함되어 있고 Hive 쿼리에서 전체 테이블 스캔을 수행하는 경우 쿼리를 실행하는 데 걸리는 시간을 추산할 수 있습니다.

21,474,836,480 / 409,600 = 52,429초 = 14.56시간

필요한 시간을 줄일 수 있는 유일한 방법은 원본 DynamoDB 테이블에서 읽기 용량 유닛을 조정하는 것입니다. Amazon EMR 노드를 더 추가하더라도 효과가 없습니다.

Hive 출력에서 하나 이상의 매퍼 프로세스가 완료되면 진행률이 업데이트됩니다. 하지만 대용량 DynamoDB 테이블에서 프로비저닝된 읽기 용량이 낮게 설정된 경우에는 진행률 출력이 오랫동안 업데이트되지 않을 수도 있습니다. 위 경우에는 작업 진행률이 몇 시간 0%로 표시됩니다. 작업 진행률에 대한 자세한 상태를 보려면 Amazon EMR 콘솔로 이동하여 개별 매퍼 작업 상태와 데이터 읽기에 대한 통계를 볼 수 있습니다. 마스터 노드에서 하둡 인터페이스에 로그온하여 하둡 통계를 볼 수도 있습니다. 여기에는 개별 맵 작업 상태와 일부 데이터 읽기 통계가 표시됩니다. 자세한 정보는 다음 주제를 참조하세요.

DynamoDB에서 데이터 내보내기 또는 가져오기 및 테이블 조인과 같은 작업을 수행하는 샘플 HiveQL 문에 대한 자세한 내용은 DynamoDB에서 데이터 내보내기, 가져오기 및 쿼리를 위한 Hive 명령 예제 섹션을 참조하세요.

Hive 요청을 취소하려면

Hive 쿼리를 실행할 때 서버의 초기 응답에는 요청을 취소하는 명령이 포함되어 있습니다. 프로세스 중에 언제든지 요청을 취소하려면 서버 응답에서 Kill Command(Kill 명령)를 사용합니다.

  1. 명령줄 클라이언트를 종료하려면 Ctrl+C를 입력합니다.

  2. 셸 프롬프트에서 요청에 대한 초기 서버 응답의 Kill Command(Kill 명령)를 입력합니다.

    또는 마스터 노드의 명령줄에서 다음 명령을 실행하여 하둡 작업을 종료할 수 있습니다. 여기서 job-id는 하둡 작업의 식별자이며 하둡 사용자 인터페이스에서 검색할 수 있습니다.

    hadoop job -kill job-id

Hive 및 DynamoDB에 대한 데이터 유형

다음 테이블에는 사용 가능한 Hive 데이터 유형, 해당하는 기본 DynamoDB 유형, 매핑할 수 있는 대체 DynamoDB 유형이 나와 있습니다.

Hive 형식 기본 DynamoDB 유형 대체 DynamoDB 유형
문자열

문자열(S)

bigint 또는 double

숫자(N)

이진수

이진수(B)

boolean

BOOLEAN (BOOL)

array list (L)

숫자 세트(NS), 문자열 세트(SS) 또는 이진수 세트(BS)

map<string,string> item

map (M)

map<string,?> map (M)
null (NULL)

Hive 데이터를 해당하는 대체 DynamoDB 유형으로 쓰거나 DynamoDB 데이터에 대체 DynamoDB 유형의 대체값이 포함된 경우 dynamodb.type.mapping 파라미터를 이용해 열 및 DynamoDB 유형을 지정할 수 있습니다. 다음 예제는 대체 형식 매핑을 지정하기 위한 구문을 보여줍니다.

CREATE EXTERNAL TABLE hive_tablename (hive_column1_name column1_datatype, hive_column2_name column2_datatype...) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodb_tablename", "dynamodb.column.mapping" = "hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name...", "dynamodb.type.mapping" = "hive_column1_name:dynamodb_attribute1_datatype");

형식 매핑 파라미터는 선택 사항이며 대체 형식을 사용하는 열에 대해서만 지정해야 합니다.

예를 들어 다음 Hive 명령은 DynamoDB 테이블 dynamodbtable2를 참조하는 hivetable2라는 테이블을 생성합니다. col3 열을 문자열 집합(SS) 형식으로 매핑하는 것을 제외하고는 hivetable1와 유사합니다.

CREATE EXTERNAL TABLE hivetable2 (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable2", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays", "dynamodb.type.mapping" = "col3:SS");

Hive에서 hivetable1hivetable2는 동일합니다. 하지만 이러한 테이블에 있는 데이터는 해당하는 DynamoDB 테이블에 기록되며, dynamodbtable1은 목록을 포함하고 dynamodbtable2는 문자열 세트를 포함합니다.

Hive null 값을 DynamoDB null 유형의 속성으로 작성하려는 경우 dynamodb.null.serialization 파라미터를 사용하면 됩니다. 다음 예제는 null 직렬화를 지정하기 위한 구문을 보여줍니다.

CREATE EXTERNAL TABLE hive_tablename (hive_column1_name column1_datatype, hive_column2_name column2_datatype...) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodb_tablename", "dynamodb.column.mapping" = "hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name...", "dynamodb.null.serialization" = "true");

Null 직렬화 파라미터는 선택 사항이며 지정하지 않으면 false로 설정됩니다. DynamoDB null 속성은 파라미터 설정에 상관없이 Hive의 null 값으로 읽힙니다. null 값을 가진 Hive 컬렉션은 null 직렬화 파라미터가 true로 설정된 경우에만 DynamoDB에 기록됩니다. 그렇지 않으면 Hive 오류가 발생합니다.

Hive의 bigint 형식은 Java long 형식과 동일하고, Hive double 형식은 정밀도의 측면에서 Java double 형식과 동일합니다. 즉, Hive 데이터 유형에서 사용할 수 있는 것보다 더 높은 정밀도를 가진 숫자 데이터가 DynamoDB에 저장되어 있는 경우 Hive를 사용하여 DynamoDB 데이터를 내보내거나, 가져오거나, 참조하면 정밀도가 손실되거나 Hive 쿼리 오류가 발생할 수 있습니다.

DynamoDB에서 Amazon Simple Storage Service(S3) 또는 HDFS로 내보낸 이진수 유형은 Base64로 인코딩된 문자열로 저장됩니다. 데이터를 Amazon S3 또는 HDFS에서 DynamoDB 이진수 유형으로 가져올 경우 데이터를 Base64 문자열로 인코딩해야 합니다.

Hive 옵션

다음 Hive 옵션을 설정하여 Amazon DynamoDB에서의 데이터 전송을 관리할 수 있습니다. 이러한 옵션은 현재 Hive 세션 동안만 지속됩니다. Hive 명령 프롬프트를 닫았다가 나중에 클러스터에서 다시 열면 해당 설정은 기본값으로 되돌아갑니다.

Hive 옵션 설명
dynamodb.throughput.read.percent

DynamoDB 프로비저닝 처리 속도를 테이블에 할당된 범위로 유지하도록 읽기 작업 속도를 설정합니다. 값은 0.11.5 사이입니다.

값 0.5는 기본 읽기 속도이며, 이 설정에서 Hive는 테이블에서 읽기 프로비저닝된 처리량 리소스의 1/2을 소비하려고 시도합니다. 이 값을 0.5보다 크게 설정하면 읽기 요청 속도가 빨라집니다. 이 값을 0.5보다 작게 설정하면 읽기 요청 속도가 느려집니다. 이 읽기 속도는 근사값입니다. 실제 읽기 속도는 DynamoDB의 키 분포가 균일한지 여부와 같은 요소에 따라 달라집니다.

Hive 작업에서 프로비저닝된 처리량을 자주 초과하거나 실시간 읽기 트래픽 병목 현상이 너무 자주 발생하는 경우 이 값을 0.5보다 작게 줄이십시오. 용량이 충분하고 Hive 작업을 더 빠르게 수행하려면 이 값을 0.5보다 크게 설정하십시오. 사용되지 않은 입력/출력 작업이 사용 가능한 경우 이 값을 최대 1.5까지 초과 설정할 수도 있습니다.

dynamodb.throughput.write.percent

DynamoDB 프로비저닝 처리 속도를 테이블에 할당된 범위로 유지하도록 쓰기 작업 속도를 설정합니다. 값은 0.11.5 사이입니다.

값 0.5는 기본 쓰기 속도이며, 이 설정에서 Hive는 테이블에서 쓰기 프로비저닝된 처리량 리소스의 1/2을 소비하려고 시도합니다. 이 값을 0.5보다 크게 설정하면 쓰기 요청 속도가 빨라집니다. 이 값을 0.5보다 작게 설정하면 쓰기 요청 속도가 느려집니다. 이 쓰기 속도는 근사값입니다. 실제 쓰기 속도는 DynamoDB의 키 분포가 균일한지 여부와 같은 요소에 따라 달라집니다.

Hive 작업에서 프로비저닝된 처리량을 자주 초과하거나 실시간 쓰기 트래픽 병목 현상이 너무 자주 발생하는 경우 이 값을 0.5보다 작게 줄이십시오. 용량이 충분하고 Hive 작업을 더 빠르게 수행하려면 이 값을 0.5보다 크게 설정하십시오. 사용되지 않은 입력/출력 작업이 사용 가능한 경우나 테이블에 데이터를 처음으로 업로드하고 아직 실시간 트래픽이 없는 경우 이 값을 최대 1.5까지 초과 설정할 수도 있습니다.

dynamodb.endpoint

DynamoDB 서비스에 대한 엔드포인트를 지정합니다. 사용 가능한 DynamoDB 엔드포인트에 대한 자세한 내용은 리전 및 엔드포인트를 참조하세요.

dynamodb.max.map.tasks

DynamoDB에서 데이터를 읽을 때 최대 맵 작업 수를 지정합니다. 이 값은 1보다 크거나 같아야 합니다.

dynamodb.retry.duration

Hive 명령 재시도를 위한 제한 시간으로 사용할 시간(분)을 지정합니다. 이 값은 0보다 크거나 같은 정수입니다. 기본 제한 시간은 1분입니다.

다음 예제에 표시된 것처럼 이러한 값은 SET 명령을 사용하여 설정합니다.

SET dynamodb.throughput.read.percent=1.0; INSERT OVERWRITE TABLE s3_export SELECT * FROM hiveTableName;