복붙노트

[HADOOP] Hive를 사용하여 HDFS에서 파일 크기를 확인하는 방법

HADOOP

Hive를 사용하여 HDFS에서 파일 크기를 확인하는 방법

사용중인 작업 공간은 Hive 1.1.0 및 CDH 5.5.4로 설정되어 있습니다. 22 개의 파티션 결과를 가져 오는 쿼리를 만듭니다. 이 파티션 디렉토리에 저장된 파일은 항상 고유하며 20MB에서 700MB까지 다양합니다.

내가 이해 한 바에 따르면, 이것은 쿼리 프로세스에 사용되는 감속기의 수와 관련이 있습니다. 1 대신 각 파티션마다 5 개의 파일을 원한다고 가정 하고이 명령을 사용합니다.

set mapreduce.job.reduces=5;

이렇게하면 시스템이 1 단계에서 5 개의 축소 작업을 사용하지만 2 단계에서 자동으로 1 개의 감속기로 전환됩니다 (컴파일 시간에 자동으로 결정됨). 내가 읽은 것으로부터, 이것은 감속기의 수를 선택할 때 구성보다 컴파일러가 더 중요하기 때문입니다. 일부 작업은 '병렬화'할 수 없으며 하나의 프로세스 또는 감속기 작업으로 만 수행 할 수 있으므로 시스템에서 자동으로 결정합니다.

코드 :

insert into table core.pae_ind1 partition (project,ut,year,month)
select ts,date_time, if(
-- m1
code_ac_dcu_m1_d1=0
and (min(case when code_ac_dcu_m1_d1=1 then ts end ) over (partition by ut 
order by ts rows between 1 following and 1000 following)-ts) <= 15,
min(case when code_ac_dcu_m1_d1=1 then ts end ) over (partition by ut order 
by ts rows between 1 following and 1000 following)-ts,NULL) as 
t_open_dcu_m1_d1,

if( code_ac_dcu_m1_d1=2
and (min(case when code_ac_dcu_m1_d1=3 then ts end ) over (partition by ut 
order by ts rows between 1 following and 1000 following)-ts) <= 15,
min(case when code_ac_dcu_m1_d1=3 then ts end ) over (partition by ut order 
by ts rows between 1 following and 1000 following)-ts, NULL) as 
t_close_dcu_m1_d1,
project,ut,year,month

from core.pae_open_close
where ut='902'
order by ut,ts

결국에는 큰 파일이 생깁니다. 이 결과 파일을 더 작은 크기로 나누는 방법이 있는지 알고 싶습니다 (바람직하게는 크기로 제한).

해결법

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

    1.@DuduMarkovitz가 지적했듯이 코드에는 전 세계적으로 데이터 세트를 주문하는 지침이 포함되어 있습니다. 이것은 단일 감속기에서 실행됩니다. 당신은 당신의 테이블에서 선택하는 동안 더 나은 주문. 이러한 삽입 후 파일이 순서대로 정렬되어 파일이 분할 가능하더라도 많은 맵퍼에서 읽 히면 병렬 처리로 인해 결과가 순서대로 표시되지 않으므로 주문해야합니다. 인서트에서 ut, ts를 사용하여이 순서를 제거하고 다음 구성 설정을 사용하여 감속기 수를 제어하십시오.

    @DuduMarkovitz가 지적했듯이 코드에는 전 세계적으로 데이터 세트를 주문하는 지침이 포함되어 있습니다. 이것은 단일 감속기에서 실행됩니다. 당신은 당신의 테이블에서 선택하는 동안 더 나은 주문. 이러한 삽입 후 파일이 순서대로 정렬되어 파일이 분할 가능하더라도 많은 맵퍼에서 읽 히면 병렬 처리로 인해 결과가 순서대로 표시되지 않으므로 주문해야합니다. 인서트에서 ut, ts를 사용하여이 순서를 제거하고 다음 구성 설정을 사용하여 감속기 수를 제어하십시오.

    set hive.exec.reducers.bytes.per.reducer=67108864;  
    set hive.exec.reducers.max = 2000; --default 1009 
    

    에 따라 결정되는 감속기의 수

    mapred.reduce.tasks-작업 당 기본 감소 작업 수입니다. 일반적으로 사용 가능한 호스트 수에 가까운 소수로 설정합니다. mapred.job.tracker가 "local"인 경우 무시됩니다. 하둡은 기본적으로 이것을 1로 설정 한 반면, Hive는 -1을 기본값으로 사용합니다. 이 속성을 -1로 설정하면 Hive는 자동으로 감속기 수를 계산합니다.

    hive.exec.reducers.bytes.per.reducer-Hive 0.14.0 이하의 기본값은 1GB입니다.

    또한 hive.exec.reducers.max-사용될 최대 감속기 수입니다. mapred.reduce.tasks가 음수이면 Hive는 자동으로 감속기 수를 결정할 때이를 최대 감속기 수로 사용합니다.

    따라서 리듀서 병렬 처리를 늘리려면 hive.exec.reducers.max를 늘리고 hive.exec.reducers.bytes.per.reducer를 줄이십시오. 각 감속기는 각 파티션마다 하나의 파일을 만듭니다 (hive.exec.reducers.bytes.per.reducer보다 크지 않음). 하나의 감속기가 많은 파티션 데이터를 수신 할 수 있으며 결과적으로 각 파티션에 많은 작은 파일이 생성 될 수 있습니다. 셔플 단계 파티션에서 데이터가 많은 감속기 사이에 분배되기 때문입니다.

    각 리듀서가 모든 (또는 너무 많은) 파티션을 생성하지 않게하려면 파티션 키를 순서대로 분배하십시오. 이 경우 파티션의 파일 수는 partition_size / hive.exec.reducers.bytes.per.reducer와 비슷합니다.

  2. from https://stackoverflow.com/questions/45346040/how-to-determine-file-size-in-hdfs-using-hive by cc-by-sa and MIT license