2012-05-21 18 views
17

我需要將大約1.3億個項目(總共5+ Gb)的初始上傳執行到單個DynamoDB表中。在我面對problems上傳使用我的應用程序中的API後,我決定嘗試使用EMR。長期以來,即使在最強大的羣集中,導入非常平均(用於EMR)的數據量也需要很長時間,耗時數百小時,進展非常小(大約20分鐘來處理測試2Mb數據位,並且沒有設法在12小時內完成測試700Mb文件)。Amazon Elastic MapReduce - 從S3到DynamoDB的大容量插入速度非常慢

我已經聯繫了Amazon Premium Support,但到目前爲止,他們只告訴「由於某種原因,DynamoDB導入速度很慢」。

我曾嘗試以下說明我的互動蜂巢會話:

CREATE EXTERNAL TABLE test_medium (
    hash_key string, 
    range_key bigint, 
    field_1 string, 
    field_2 string, 
    field_3 string, 
    field_4 bigint, 
    field_5 bigint, 
    field_6 string, 
    field_7 bigint 
) 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '|' 
LOCATION 's3://my-bucket/s3_import/' 
; 

CREATE EXTERNAL TABLE ddb_target (
    hash_key string, 
    range_key bigint, 
    field_1 bigint, 
    field_2 bigint, 
    field_3 bigint, 
    field_4 bigint, 
    field_5 bigint, 
    field_6 string, 
    field_7 bigint 
) 
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
TBLPROPERTIES (
    "dynamodb.table.name" = "my_ddb_table", 
    "dynamodb.column.mapping" = "hash_key:hash_key,range_key:range_key,field_1:field_1,field_2:field_2,field_3:field_3,field_4:field_4,field_5:field_5,field_6:field_6,field_7:field_7" 
) 
; 

INSERT OVERWRITE TABLE ddb_target SELECT * FROM test_medium; 

各種標誌似乎不會有任何明顯的效果。已嘗試以下設置而不是默認設置:

SET dynamodb.throughput.write.percent = 1.0; 
SET dynamodb.throughput.read.percent = 1.0; 
SET dynamodb.endpoint=dynamodb.eu-west-1.amazonaws.com; 
SET hive.base.inputformat=org.apache.hadoop.hive.ql.io.HiveInputFormat; 
SET mapred.map.tasks = 100; 
SET mapred.reduce.tasks=20; 
SET hive.exec.reducers.max = 100; 
SET hive.exec.reducers.min = 50; 

運行HDFS而不是DynamoDB目標的相同命令在幾秒鐘內完成。

這似乎是一個簡單的任務,一個非常基本的用例,我真的很想知道我在這裏可能會做什麼錯。

+0

你在同一個過程中領先我一步,我不喜歡我在這裏看到的..有沒有人有成功的故事在這裏分享(大數據導入到發電機)? –

+0

我已經聯繫了Amazon Premium Support,他們只確認了這個問題,並承認「DynamoDB中存在某種問題」,幾乎在一週內沒有更多:(如果知道更多,我會更新。到目前爲止,我切換到本地數據庫。 – Yuriy

+0

我也嘗試在不同地區運行場景,並且也從腳本運行而不是從交互會話運行。 – Yuriy

回答

15

這是我最近從AWS支持獲得的答案。希望可以幫助別人了類似的情況:

EMR工人爲單線程工作人員目前已實施, 每一個勞動者,寫一個項目接一個(使用PUT,不BatchWrite)。 因此,每次寫入消耗1個寫入容量單位(IOP)。

這意味着您正在建立很多連接,在某種程度上會降低性能。如果使用BatchWrites,則它意味着您可以在單個操作中承諾多達25行,其中 的性能價格較低(但如果我理解 ,則價格相同)。這是我們所知道的,並且可能在將來的EMR中實現 。我們不能提供時間表。

如前所述,這裏的主要問題是,您在DynamoDB 表在到達配置的吞吐量,從而儘量提高其 暫時進口,然後隨意將其降低到 任何你需要的水平。

這聽起來有點方便,但是當您這樣做時, 警報出現問題,這就是爲什麼您從未收到過 警報。自那以後,問題一直得到解決。

+0

+1關於這個奇怪的問題 - 謝謝!這是否意味着您已經設法通過相應地臨時提高您的預置寫入吞吐量來加速導入? –

+0

我還沒有嘗試過,但說實話,因爲我忙於實施基於本地託管數據庫的替代解決方案:(這不再看作是適合我的方法,但不久將做測試,並會考慮到未來的項目 – Yuriy

+1

我把這個擱置的另一個原因是,即使我目前的吞吐量(400個單位)增加了樣本60K記錄,這個記錄用了一個小時,並且它不應該根據這個解釋和我的理解 – Yuriy