2017-02-01 6 views
0

임팔라 JDBC 드라이버를 사용하여 임팔라에 배치 데이터를 일괄 적으로 삽입하고 있습니다. 현재 배치 크기가 1000이고 배치 쿼리를 실행하기 위해 PreparedStatement에 의해 INSERT INTO VALUES 절을 사용합니다. 임팔라 데몬 3 대와 임팔라 카탈로그 서버, 상태 저장소가 4 대 기계에서 실행됩니다.임팔라에 배치를 너무 오래 걸립니다.

임팔라에 일괄 삽입 쿼리 계획은 다음과 같습니다 : 우리가 볼 수 있듯이

Query Timeline: 35s398ms 
    - Query submitted: 0.000ns (0.000ns) 
    - Planning finished: 34s822ms (34s822ms) 
    - Submit for admission: 34s886ms (63.997ms) 
    - Completed admission: 34s886ms (0.000ns) 
    - Ready to start 1 fragment instances: 34s886ms (0.000ns) 
    - All 1 fragment instances started: 34s958ms (71.997ms) 
    - DML data written: 35s082ms (123.996ms) 
    - DML Metastore update finished: 35s286ms (203.993ms) 
    - Request finished: 35s298ms (11.999ms) 
    - Unregister query: 35s374ms (75.997ms) 
- ComputeScanRangeAssignmentTimer: 0.000ns 

계획이 모든 시간을 할애한다 마쳤다. 우리는 두 가지 형식, PARQUET 및 일반 형식을 모두 만들려고했습니다. 그러나 계획이 끝날 때마다 파트가 너무 높습니다.

수행해야 할 구성 변경이 있습니까? 아니면 내가 잘못하고있는거야?

답변

1

첫 번째 주목할 점은 하나의 PreparedStatement을 일괄 처리로 사용하는 경우에도 각 행에 여전히 고유 한 INSERT 문이 적용된다는 것입니다. 예를 들어, 준비된 명령문

INSERT INTO t VALUES (?, ?); 

INSERT INTO t VALUES ('a', 1); 
INSERT INTO t VALUES ('b', 2); 

으로 두 행을 삽입하고 하둡에서 하나의 행을 삽입하는 것은 매우입니다하지 않는 것이

INSERT INTO t VALUES ('a', 1), ('b', 2); 

고려해야 할 다음 일은으로 각 행에 대해 새로운 HDFS 파일을 생성해야하므로 비효율적입니다. the Impala documentation에서

발췌

:

INSERT ... VALUES 기술은 삽입 동작은 병렬 처리 될 수 없기 때문에, HDFS 기반 테이블로 대량의 데이터를 로딩하기에 적합하지 않고, 각각이 별도의 데이터 파일을 생성한다. SQL 구문 또는 HBase 테이블을 실험하기 위해 작은 치수 표나 작은 양의 데이터를 설정하는 데 사용하십시오. 대형 ETL 작업이나로드 조작에 대한 벤치 마크 테스트에는 사용하지 마십시오. 매번 한 행을 삽입하는 수천 개의 INSERT ... VALUES 문으로 스크립트를 실행하지 마십시오. INSERT ... VALUES 작업을 실행하여 준비 테이블에 ETL 파이프 라인의 한 단계로 데이터를로드하는 경우 가능한 경우 각 VALUES 절 내에 여러 행 값을 포함하고 작업이 많은 작은 파일을 생성하는 경우 별도의 데이터베이스를 사용하여 정리 작업을 쉽게 만듭니다.