기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
아마존 하이브의 차이점 및 고려 사항 EMR
Amazon의 아파치 EMR 하이브와 아파치 하이브의 차이점
Hive 권한 부여
EMRAmazon은 Hive 인증을
Amazon S3와 Hive 파일 병합 동작
Apache Hive는 hive.merge.mapfiles
가 true이고 작업의 평균 출력 크기가 hive.merge.smallfiles.avgsize
설정보다 작은 경우에만 병합이 트리거되면 맵 전용 작업의 끝에서 작은 파일을 병합합니다. 최종 출력 경로가 인 경우 Amazon EMR Hive는 정확히 동일한 동작을 수행합니다. HDFS 출력 경로가 Amazon S3에 있는 경우 hive.merge.smallfiles.avgsize
파라미터는 무시됩니다. 이 상황에서 hive.merge.mapfiles
가 true
로 설정된 경우 병합 작업이 항상 트리거됩니다.
ACID트랜잭션 및 아마존 S3
Amazon EMR 6.1.0 이상에서는 Hive ACID (원자성, 일관성, 격리, 내구성) 트랜잭션을 지원하므로 데이터베이스의 속성을 준수합니다. ACID 이 기능을 사용하면 Amazon Simple Storage Service (Amazon S3) 의 데이터를 사용하여 Hive 관리 테이블에서 INSERT UPDATEDELETE,, 및 MERGE 작업을 실행할 수 있습니다.
Hive Live Long and Process () LLAP
LLAP기본 아파치 하이브 버전 2.0에 추가된 기능은
Amazon EMR 버전 6.0.0 이상에서는 Hive의 롱 라이브 및 프로세스 (LLAP) 기능을 지원합니다. 자세한 내용은 Hive 사용을 참조하십시오. LLAP
아마존 EMR 릴리스 버전 4.x와 5.x 사이의 Hive 차이점
이 섹션에서는 Hive 구현을 Amazon 릴리스 4.x의 Hive 버전 1.0.0에서 EMR Amazon 릴리스 5.x의 Hive 2.x로 마이그레이션하기 전에 고려해야 할 차이점을 설명합니다. EMR
작업 차이점 및 고려 사항
ACID(원자성, 일관성, 격리 및 내구성) 트랜잭션에
대한 지원 추가: Amazon EMR 4.x의 Hive 1.0.0과 기본 Apache Hive 간의 이러한 차이가 제거되었습니다. Amazon S3에 대한 직접 쓰기 제거: Amazon의 Hive EMR 1.0.0과 기본 Apache Hive 간의 이러한 차이가 제거되었습니다. Amazon EMR 릴리스 5.x의 Hive 2.1.0은 이제 Amazon S3에 저장된 임시 파일을 생성하고, 임시 파일에서 읽고, 씁니다. 따라서 동일한 테이블에서 읽고 쓰기 위해 해결 방법으로 더 이상 클러스터의 로컬 HDFS 파일 시스템에 임시 테이블을 생성할 필요가 없습니다. 버전이 지정된 버킷을 사용하는 경우 아래 설명한 대로 이러한 임시 파일을 관리해야 합니다.
Amazon S3 버전 지정된 버킷을 사용하는 경우 임시 파일 관리: 생성된 데이터의 대상이 Amazon S3인 Hive 쿼리를 실행하면 많은 임시 파일과 디렉터리가 생성됩니다. 앞에서 설명한대로 새로운 동작입니다. 버전 지정된 S3 버킷을 사용하는 경우 이러한 임시 파일은 Amazon S3를 복잡하게 만들며, 이를 삭제하지 않으면 비용이 발생합니다. 짧은 기간(예: 5일) 후에
/_tmp
접두사가 있는 데이터가 삭제되도록 수명 주기 규칙을 조정하십시오. 자세한 내용은 수명 주기 구성 지정을 참조하세요.Log4j가 log4j 2로 업데이트됨: log4j를 사용하는 경우 이 업그레이드로 인해 로깅 구성을 변경해야 할 수 있습니다. 자세한 내용은 Apache log4j 2
를 참조하십시오.
성능 차이점 및 고려사항
Tez와의 성능 차이: Amazon EMR 릴리스 5.x에서는 Tez가 Hive 대신 Tez가 기본 실행 엔진입니다. MapReduce Tez은 대부분의 워크플로에서 개선된 성능을 제공합니다.
파티션이 많은 테이블: 많은 수의 동적 파티션을 생성하는 쿼리는 실패할 수 있으며 많은 파티션이 있는 테이블에서 선택하는 쿼리는 실행하는 데 예상보다 오래 걸릴 수 있습니다. 예를 들어, 100,000 개의 파티션 중에서 선택하려면 10분 이상 걸릴 수 있습니다.
아마존 하이브의 추가 기능 EMR
아마존은 다른 AWS 서비스와의 하이브 통합을 지원하는 새로운 기능으로 하이브를 EMR 확장합니다. 예를 들어, Amazon Simple Storage Service (Amazon S3) 및 DynamoDB에서 읽고 쓸 수 있는 기능 등이 있습니다.
Hive의 변수
달러 기호와 중괄호를 사용하여 스크립트에 변수를 포함할 수 있습니다.
add jar ${LIB}/jsonserde.jar
다음 예제와 같이 -d
파라미터를 사용하여 명령줄에서 이러한 변수의 값을 Hive로 전달할 수 있습니다.
-d LIB=s3://elasticmapreduce/samples/hive-ads/lib
또한 Hive 스크립트를 실행하는 단계로 값을 전달할 수 있습니다.
콘솔을 사용하여 변수 값을 Hive 단계로 전달하려면
https://console.aws.amazon.com/emr
에서 아마존 EMR 콘솔을 엽니다. -
클러스터 생성을 선택합니다.
-
Steps(단계) 섹션의 Add Step(단계 추가)에 있는 목록에서 Hive Program(Hive 프로그램)을 선택하고 Configure and add(구성 및 추가)를 선택합니다.
-
Add Step(단계 추가) 대화 상자에서 다음 표를 가이드로 사용하여 파라미터를 지정한 다음 Add(추가)를 선택합니다.
필드 작업 Script S3 location* Amazon S3에서 스크립트가 URI 있는 위치를 지정합니다. 값은 다음과 같은 형식이어야 합니다. BucketName
/path
/ScriptName
. 예를 들면 다음과 같습니다s3://elasticmapreduce/samples/hive-ads/libs/response-time-stats.q
.Input S3 location Amazon S3에서 입력 파일이 URI 있는 위치를 지정할 수도 있습니다. 값은 다음과 같은 형식이어야 합니다. BucketName
/path
/. 지정된 경우 이 매개 변수는 Hive 스크립트에 라는 매개 변수로 전달됩니다.INPUT
예:s3://elasticmapreduce/samples/hive-ads/tables/
.Output S3 location Amazon S3에서 출력을 저장할 URI 위치를 지정할 수도 있습니다. 값은 다음과 같은 형식이어야 합니다. BucketName
/path
. 지정된 경우 이 매개 변수는 Hive 스크립트에 라는OUTPUT
매개 변수로 전달됩니다. 예:s3://mybucket/hive-ads/output/
.인수 또는 Hive에 전달할 인수 목록(공백으로 구분된 문자열)을 입력합니다. Hive 스크립트에서 $ {SAMPLE} 라는 경로 변수를 정의한 경우, 예를 들면 다음과 같습니다. CREATE EXTERNAL TABLE logs (requestBeginTime STRING, requestEndTime STRING, hostname STRING) PARTITIONED BY (dt STRING) \ ROW FORMAT serde 'com.amazon.elasticmapreduce.JsonSerde' WITH SERDEPROPERTIES ( 'paths'='requestBeginTime, requestEndTime, hostname' ) LOCATION '${SAMPLE}/tables/impressions';
변수 값을 전달하려면 Arguments(인수) 창에 다음을 입력합니다.
-d SAMPLE=s3://elasticmapreduce/samples/hive-ads/
.Action on Failure 이 옵션은 오류 발생 시 클러스터가 수행해야 할 동작을 결정합니다. 이 설정에 사용할 수 있는 값은 다음과 같습니다.
-
클러스터 종료: 단계가 실패할 경우 클러스터를 종료합니다. 클러스터에 종료 방지 기능이 활성화된 AND Keep alive 기능이 활성화되어 있는 경우 클러스터는 종료되지 않습니다.
-
취소 및 대기: 단계가 실패할 경우 남은 단계를 취소합니다. 클러스터에 연결 유지 기능이 활성화된 경우에는 클러스터가 종료되지 않습니다.
-
계속: 단계가 실패할 경우 다음 단계가 계속 수행됩니다.
-
-
필요에 따라 값을 선택하고 Create cluster(클러스터 생성)를 선택합니다.
다음을 사용하여 변수 값을 Hive 단계로 전달하려면 AWS CLI
를 사용하여 변수 값을 Hive 단계로 전달하려면 --steps
매개 변수를 사용하고 인수 목록을 포함하십시오. AWS CLI
-
참고
가독성을 위해 Linux 줄 연속 문자(\)가 포함됩니다. Linux 명령에 사용하거나 제외할 수 있습니다. Windows에서는 제외시키거나 캐럿(^)으로 바꿉니다.
aws emr create-cluster --name "
Test cluster
" --release-labelemr-7.2.0
\ --applications Name=Hive
Name=Pig
--use-default-roles --ec2-attributes KeyName=myKey
--instance-typem5.xlarge
--instance-count3
\ --steps Type=Hive
,Name="Hive Program
",ActionOnFailure=CONTINUE
,Args=[-f,s3://elasticmapreduce/samples/hive-ads/libs/response-time-stats.q
,-d,INPUT=s3://elasticmapreduce/samples/hive-ads/tables
,-d,OUTPUT=s3://mybucket/hive-ads/output/
,-d,SAMPLE
=s3://elasticmapreduce/samples/hive-ads/
]에서 Amazon EMR 명령을 사용하는 방법에 대한 자세한 내용은 AWS CLI을 참조하십시오https://docs.aws.amazon.com/cli/latest/reference/emr.
Java를 사용하여 변수 값을 Hive 단계로 전달하려면 SDK
-
다음 예제는 를 사용하여 변수를 단계로 전달하는 방법을 보여줍니다. SDK 자세한 내용은 StepFactory AWS SDK for Java API참조의 클래스를 참조하십시오.
StepFactory stepFactory = new StepFactory(); StepConfig runHive = new StepConfig() .withName("Run Hive Script") .withActionOnFailure("TERMINATE_JOB_FLOW") .withHadoopJarStep(stepFactory.newRunHiveScriptStep(“s3://mybucket/script.q”, Lists.newArrayList(“-d”,”LIB= s3://elasticmapreduce/samples/hive-ads/lib”));
부분적인 DynamoDB 스키마를 수용하기 위한 Amazon EMR Hive 쿼리
Amazon EMR Hive는 쿼리에 모든 열을 포함하도록 요구하는 대신 데이터를 필터링할 수 있는 열의 하위 집합을 지정할 수 있으므로 DynamoDB 테이블을 쿼리할 때 유연성을 극대화할 수 있습니다. 이 부분 스키마 쿼리 기술은 스파스 데이터베이스 스키마가 있고 타임스탬프 필터링 같은 몇 개 열에 기초하여 레코드를 필터링해야 하는 경우에 효과적입니다.
다음 예제에서는 Hive 쿼리를 사용하여 다음을 수행하는 방법을 보여 줍니다.
-
DynamoDB 테이블을 생성합니다.
-
DynamoDB에서 항목 하위 세트(행)를 선택하고 데이터의 범위를 특정 열로 좁힙니다.
-
결과 데이터를 Amazon S3에 복사합니다.
DROP TABLE dynamodb; DROP TABLE s3; CREATE EXTERNAL TABLE dynamodb(hashKey STRING, recordTimeStamp BIGINT, fullColumn map<String, String>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ( "dynamodb.table.name" = "myTable", "dynamodb.throughput.read.percent" = ".1000", "dynamodb.column.mapping" = "hashKey:HashKey,recordTimeStamp:RangeKey"); CREATE EXTERNAL TABLE s3(map<String, String>) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 's3://bucketname/path/subpath/'; INSERT OVERWRITE TABLE s3 SELECT item fullColumn FROM dynamodb WHERE recordTimeStamp < "2012-01-01";
다음 테이블에는 DynamoDB에서 임의의 항목 조합을 선택하기 위한 쿼리 구문이 표시됩니다.
쿼리 예제 | 결과 설명 |
---|---|
SELECT * FROM table_name ; |
해당 테이블에서 모든 항목(행)을 선택하고 이러한 항목에 사용할 수 있는 모든 열의 데이터를 포함합니다. |
SELECT * FROM table_name WHERE
field_name
=value ; |
해당 테이블에서 일부 항목(행)을 선택하고 이러한 항목에 사용할 수 있는 모든 열의 데이터를 포함합니다. |
SELECT column1_name ,
column2_name ,
column3_name FROM
table_name ; |
해당 테이블에서 모든 항목(행)을 선택하고 이러한 항목에 사용할 수 있는 일부 열의 데이터를 포함합니다. |
SELECT column1_name ,
column2_name ,
column3_name FROM
table_name WHERE
field_name
=value ; |
해당 테이블에서 일부 항목(행)을 선택하고 이러한 항목에 사용할 수 있는 일부 열의 데이터를 포함합니다. |
다양한 AWS 리전의 DynamoDB 테이블 간에 데이터 복사
Amazon EMR Hive는 DynamoDB 테이블별로 설정할 수 있는 dynamodb.region
속성을 제공합니다. dynamodb.region
을 두 테이블에서 서로 다르게 설정할 경우 테이블 간에 복사하는 모든 데이터가 지정된 리전 사이에서 자동으로 발생합니다.
다음 예제에서는 dynamodb.region
속성을 설정하는 Hive 스크립트를 사용하여 DynamoDB 테이블을 생성하는 방법을 보여줍니다.
참고
테이블당 리전 속성은 전역 Hive 속성을 재정의합니다.
CREATE EXTERNAL TABLE dynamodb(hashKey STRING, recordTimeStamp BIGINT, map<String, String> fullColumn) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ( "dynamodb.table.name" = "myTable", "dynamodb.region" = "eu-west-1", "dynamodb.throughput.read.percent" = ".1000", "dynamodb.column.mapping" = "hashKey:HashKey,recordTimeStamp:RangeKey");
테이블당 DynamoDB 처리량 값 설정
Amazon EMR Hive를 사용하면 테이블 정의에서 테이블별로 readThroughputPercent DynamoDB writeThroughputPercent 및 설정을 설정할 수 있습니다. 다음 Amazon EMR Hive 스크립트는 처리량 값을 설정하는 방법을 보여줍니다. DynamoDB 처리량 값에 대한 자세한 내용은 테이블의 읽기/쓰기 요건 지정을 참조하세요.
CREATE EXTERNAL TABLE dynamodb(hashKey STRING, recordTimeStamp BIGINT, map<String, String> fullColumn) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ( "dynamodb.table.name" = "myTable", "dynamodb.throughput.read.percent" = ".4", "dynamodb.throughput.write.percent" = "1.0", "dynamodb.column.mapping" = "hashKey:HashKey,recordTimeStamp:RangeKey");