2017-11-01 2 views
1

私はhadoopハイブで実験を行っています。 この実験では、2つの異なるハードウェア設定で同じハイブジョブを実行します。これはAWS EMRでホストされています。AWS EMRでHadoopハイブスケーリングを行わない

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'データで最大2つのパラレルマップタスクしか得られません。したがって、4つのコアが利用される –

+0

データ量を1.5 GB x 400 MB x 460 MBに上げました。 – user213979

答えて

0

あなたの入力はそれぞれ1つのファイルであるようです。これは、データを並行して処理するように設計されているため、Hiveを操作するには非常に非効率的な方法です。

ベストプラクティスは、多数のファイルを持つディレクトリ、ノードごとに少なくとも1つのファイル、またはクラスタ全体で実行できる各スライスの1つのファイルをポイントすることをお勧めします。

また、入力データは非常に小さいです。 HadoopとHiveは、GB、さらにはTBのデータでも動作するように設計されています。 40MBという小さなものは、ジョブを開始するオーバーヘッドが実際にデータを処理するよりも時間がかかることがあるHiveの良いユースケースではありません。

データが小さい場合は、従来のデータベースまたはExcelスプレッドシートを使用してください。

+0

チップをありがとう。データ量を1.5 GB x 400 MB x 460 MBに引き上げました。私はディレクトリ上でファイルを分割しようとします。 – user213979

関連する問題