5

데이터를 여러 개의 출력 파일로 분할하도록 지시하는 방법이 있습니까? 아니면 출력 파일의 크기를 제한하십시오. 나는 우리가 하이브 데이터를 모두 밖으로 사전 처리 http://docs.aws.amazon.com/redshift/latest/dg/t_splitting-data-files.html하이브 - 파일간에 데이터 분할

병렬 로딩을 할 수 있도록 여러 파일로 분할 데이터를 권장 Redshift에를 사용하는 계획입니다, 만들 수있는 방법이 있는지 궁금 해요

, 10 말 1GB 파일로 복사 속도가 빨라질 수 있습니다.

나는 https://cwiki.apache.org/Hive/adminmanual-configuration.htmlhttps://cwiki.apache.org/confluence/display/Hive/Configuration+Properties보고 있었다하지만 난 당신이 하이브 출력을 분할에 대해 갈 수있는 몇 가지 방법이 있습니다

답변

10

아무것도 찾을 수 없습니다. 가장 쉬운 방법은 감속기의 수를 설정하는 것입니다. 각각은 자체 출력 파일에 대한 쓰기를 줄이므로 지정하는 reducers의 수는 기록 된 출력 파일의 수와 일치합니다. 일부 하이브 쿼리는 지정한 축소 자 수를 가져 오지 않습니다 (예 : SELECT COUNT(*) FROM some_table은 항상 하나의 축소 기가됩니다). 감속기의 수를 지정하려면 쿼리하기 전에이 작업을 실행 : 여러 출력 파일로 분할 할 수

set mapred.reduce.tasks=10 

또 다른 방법은 하이브 파티션 된 테이블에 쿼리의 결과를 삽입해야하는 것입니다. 이렇게하면 파티션 당 하나 이상의 파일이 생성됩니다. 이것을 이해하려면 파티션 할 수있는 합리적인 열이 있어야합니다. 예를 들어, 고유 한 ID 컬럼으로 파티션하지 않거나 각 레코드마다 하나의 파일을 가질 수 있습니다. 이 접근 방식은 파티션 당 적어도 출력 파일을 보장하며 최대 값은 numPartitions * numReducers입니다. 다음은 예입니다 (hive.exec.dynamic.partition.mode에 대해 걱정하지 마세요.이 쿼리가 작동하도록 설정해야합니다).

hive.exec.dynamic.partition.mode=nonstrict 

CREATE TABLE table_to_export_to_redshift (
    id INT, 
    value INT 
) 
PARTITIONED BY (country STRING) 

INSERT OVERWRITE TABLE table_to_export_to_redshift 
PARTITION (country) 
SELECT id, value, country 
FROM some_table 

더 세밀한 제어를 얻으려면, 당신은 하이브하고 여러 파일에 스크립트 쓰기를 감소하도록 전달하는 데 자신의 감소 스크립트를 작성할 수 있습니다. 자신의 감속기를 작성하면 원하는대로 할 수 있습니다.

마지막으로, 당신은 하이브가 완료되면 자신을 파일의 원하는 번호를 출력으로 하이브를 기동하고 그냥 떨어져 깨려고 포기할 수 있습니다. 기본적으로 Hive는 테이블을 압축되지 않은 상태로 일반 텍스트로웨어 하우스 디렉토리 (예 : /apps/hive/warehouse/table_to_export_to_redshift)에 저장합니다. Hadoop 셸 명령, MapReduce 작업, Pig를 사용하거나 Linux로 가져 와서 원하는대로 분리 할 수 ​​있습니다.

나는 적색 편이 경험이없는, 나의 제안 중 일부는 어떤 이유로 Redshift에 의해 소비를 위하여는 적절하지 않을 수 있습니다.

노트의 몇 : 더 작은 파일로 분할 파일은 하둡에 대한 일반적으로 나쁘다. Redshift의 속도가 빨라지지만 Hadoop 에코 시스템의 다른 부분 (MapReduce, Hive, Pig 등)에서 파일을 사용하는 경우 파일이 너무 작 으면 성능 손실이 발생할 수 있습니다 (1GB는 괜찮을지라도) . 또한 Redshift 데이터로드와 병행하여 처리/개발자 시간을 추가로 확보하면 시간을 절약 할 수 있습니다.

+0

최고, 감사 –

+1

귀하의 예는 분할을하지 않습니다. 'CREATE TABLE'과'INSERT OVERWRITE' 명령 모두 사용할 파티션을 지정해야합니다. – libjack

+0

@libjack 잡기 주셔서 감사합니다. 위에 고정. –