2017-11-01 4 views
1

나는 hadoop 하이브에 대한 실험을하고 있습니다. 이 실험에서는 두 가지 하드웨어 설정에서 동일한 하이브 작업을 실행합니다. 이것은 AWS EMR에서 호스팅됩니다.Hadoop 하이브가 AWS EMR에서 스케일되지 않음

laborder = 40 MB 
labresult = 150 MB 
labspecimen = 46 MB 

이 작업은 약 40 초 실행 : 나는 다음과 같은 데이터 세트의 크기가이 스크립트를 실행

DROP DATABASE IF EXISTS labtest; 

CREATE DATABASE labtest; 

CREATE TABLE IF NOT EXISTS laborder (Insertts TIMESTAMP, ordernr STRING, Patientnr STRING, visitnr STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' 
WITH SERDEPROPERTIES (
    "separatorChar" = ",", 
    "quoteChar"  = "\"" 
) ; 
LOAD DATA INPATH '${INPUT}/laborder.csv' OVERWRITE INTO TABLE laborder; 

CREATE TABLE IF NOT EXISTS labanalyse (resultaat STRING, deleted BOOLEAN, analysecodePk INT, Inserttimestamp TIMESTAMP, 
specimennr STRING, uitvoeringsts TIMESTAMP 
) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' 
WITH SERDEPROPERTIES (
    "separatorChar" = ",", 
    "quoteChar"  = "\"" 
) ; 
LOAD DATA INPATH '${INPUT}/labresult.csv' OVERWRITE INTO TABLE laborder; 

CREATE TABLE IF NOT EXISTS labspecimen (specimennr STRING, ordernr STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' 
WITH SERDEPROPERTIES (
    "separatorChar" = ",", 
    "quoteChar"  = "\"" 
) ; 
LOAD DATA INPATH '${INPUT}/labspecimen.csv' OVERWRITE INTO TABLE labspecimen; 


CREATE TABLE IF NOT EXISTS labanalysecode (pk INT, analysecode STRING, analysecodeversion STRING, view INT, referencevalue STRING, unit STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' 
WITH SERDEPROPERTIES (
    "separatorChar" = ",", 
    "quoteChar"  = "\"" 
) ; 
LOAD DATA INPATH '${INPUT}/labordercodes.csv' OVERWRITE INTO TABLE labanalysecode; 


SELECT * FROM laborder 
INNER JOIN labspecimen ON labspecimen.ordernr = laborder.ordernr 
INNER JOIN labanalyse ON labanalyse.specimennr = labspecimen.specimennr 
INNER JOIN labanalysecode ON labanalysecode.pk = labanalyse.analysecodepk; 

: 는 여기에 내가 실행 hive.sql 스크립트입니다. 제 생각에는 1 개의 마스터 노드와 2 개의 코어 노드를 가진 설정에서 이것을 실행하는 것이 1 개의 마스터/4 코어 노드 시스템에서 실행하는 것보다 느립니다. 그러나 차이는 거의 없습니다. 내가 잘못하고있는 것에 대한 단서가 있습니까? 여러 컴퓨터를보다 효율적으로 사용하려면 어떻게해야합니까?

+1

벤치 마킹을 수행하는 데 필요한 데이터 양이 매우 적습니다. 느린 자연을위한 많은 가능성이있을 것입니다. JVM 초기화 등 – Achyuth

+0

hadoop 블록 크기는 아마도 128MB입니다. 따라서'labresults' 데이터로 최대 두 개의 병렬지도 작업 만 얻을 수 있습니다. 따라서 4 코어가 활용 될 것입니다. –

+0

데이터 양을 1.5GB x 400MB x 460MB로 늘 렸습니다. – user213979

답변

0

각 입력 내용은 하나의 파일로 보입니다. 이것은 데이터를 병렬로 처리하도록 설계 되었기 때문에 하이브를 작동 시키는데 비효율적 인 방법입니다.

많은 파일이있는 디렉토리, 각 노드에 대해 하나 이상의 파일 또는 클러스터에서 실행할 수있는 각 슬라이스에 대해 하나의 파일을 가리키는 것이 가장 좋습니다.

또한 입력 데이터가 매우 작습니다. Hadoop과 Hive는 GB 및 심지어 TB의 데이터에서 작동하도록 설계되었습니다. 40MB 정도의 작은 것이 작업을 시작하는 오버 헤드가 실제로 데이터를 처리하는 것보다 오래 걸릴 수있는 Hive의 좋은 사용 사례는 아닙니다.

데이터가 작 으면 전통적인 데이터베이스 또는 Excel 스프레드 시트를 사용하십시오!

+0

팁 주셔서 감사. 데이터 양을 1.5GB x 400MB x 460MB로 늘 렸습니다. 디렉토리 위로 파일을 분할 해 봅니다. – user213979