5

Amazon Elastic Map Reduceを使用して、数百万ケースの一連のシミュレーションを実行しようとしています。これは、リデューサーのない Rscript ストリーミング ジョブです。EMR コールで Identity Reducer を使用しています--reducer org.apache.hadoop.mapred.lib.IdentityReducer

スクリプト ファイルは、1 行の文字列を手動で渡すときに Linux ボックスのコマンド ラインからローカルでテストおよび実行すると正常に動作し、echo "1,2443,2442,1,5" | ./mapper.R期待どおりの 1 行の結果が得られます。しかし、EMR の入力ファイルから約 10,000 ケース (行) を使用してシミュレーションをテストしたところ、10,000 行の入力行のうち、12 行程度しか出力されませんでした。何度か試しましたが、原因がわかりません。Hadoop ジョブはエラーなしで正常に実行されます。入力行がスキップされているか、ID レデューサーで何かが起こっているようです。出力がある場合の結果は正しいです。

私の入力ファイルは、次のデータ形式の csv で、カンマで区切られた一連の 5 つの整数です。

1,2443,2442,1,5
2,2743,4712,99,8
3,2443,861,282,3177
etc...

これがmapper.RのRスクリプトです

#! /usr/bin/env Rscript

# Define Functions
trimWhiteSpace <- function(line) gsub("(^ +)|( +$)", "", line)
splitIntoWords <- function(line) unlist(strsplit(line, "[[:space:]]+"))
# function to read in the relevant data from needed data files
get.data <- function(casename) {
    list <- lapply(casename, function(x) {
        read.csv(file = paste("./inputdata/",x, ".csv", sep = ""),
                 header = TRUE,
        stringsAsFactors = FALSE)})
    return(data.frame(list))
}

con <- file("stdin")            
line <- readLines(con, n = 1, warn = FALSE) 
line <- trimWhiteSpace(line)
values <- unlist(strsplit(line, ","))
lv <- length(values)
cases <- as.numeric(values[2:lv])
simid <- paste("sim", values[1], ":", sep = "")
l <- length(cases)                      # for indexing

## create a vector for the case names
names.vector <- paste("case", cases, sep = ".")

## read in metadata and necessary data columns using get.data function
metadata <- read.csv(file = "./inputdata/metadata.csv", header = TRUE,
                     stringsAsFactors = FALSE)
d <- cbind(metadata[,1:3], get.data(names.vector))

## Calculations that use df d and produce a string called 'output' 
## in the form of "id: value1 value2 value3 ..." to be used at a 
## later time for agregation.

cat(output, "\n")
close(con)

このシミュレーションの (一般化された) EMR 呼び出しは次のとおりです。

ruby elastic-mapreduce --create --stream --input s3n://bucket/project/input.txt --output s3n://bucket/project/output --mapper s3n://bucket/project/mapper.R --reducer org.apache.hadoop.mapred.lib.IdentityReducer --cache-archive s3n://bucket/project/inputdata.tar.gz#inputdata --name Simulation --num-instances 2

これらの問題が発生している理由について誰かが洞察を持っている場合は、提案や、R スクリプトの変更/最適化を歓迎します。

私の他のオプションは、スクリプトを関数に変換し、R マルチコア パッケージを使用して並列化された適用を実行することですが、まだ試していません。これをEMRで動作させたいと思います。スクリプト作成の基礎として、JD Long

4

1 に答える 1

4

明らかなものは何も飛び出しません。しかし、わずか10行の単純な入力ファイルを使用してジョブを実行できますか? これらの 10 行が、大きなテスト ケースで実行されなかったシナリオであることを確認してください。これを試して、入力が原因で R スクリプトが応答を生成しない可能性を排除してください。

EMR ジョブのデバッグは、独自のスキルです。

編集:

これは完全な釣りの遠征ですが、AWS GUI を使用して EMR インタラクティブ ピッグ セッションを開始します。「対話型豚」セッションは稼働し続けるため、ssh でセッションに接続できます。これはコマンド ライン ツールから行うこともできますが、GUI から行う方が少し簡単です。次に、クラスタに ssh で接続し、キャッシュ ファイルとマッパー内のテスト ケースを転送して、次のコマンドを実行します。

cat infile.txt | yourMapper.R > outfile.txt

これは、マッパーが EMR 環境で Hadoop ビットを介さずに infile を解析できるかどうかをテストするためのものです。

編集2:

後世のために上記のテキストを残していますが、実際の問題は、スクリプトが標準入力に戻ってより多くのデータを取得しないことです。したがって、マッパーごとに 1 回の実行を取得して終了します。上記の 1 つのライナーを実行すると、infile.txt の各行の結果ではなく、1 つの結果のみが得られます。ローカル マシンでもテストを実行した場合はcat、エラーが表示されるはずです。

それでは、R の例でピートの単語数を見てみましょう。

#! /usr/bin/env Rscript

trimWhiteSpace <- function(line) gsub("(^ +)|( +$)", "", line)
splitIntoWords <- function(line) unlist(strsplit(line, "[[:space:]]+"))

## **** could wo with a single readLines or in blocks
con <- file("stdin", open = "r")
while (length(line <- readLines(con, n = 1, warn = FALSE)) > 0) {
    line <- trimWhiteSpace(line)
    words <- splitIntoWords(line)
    ## **** can be done as cat(paste(words, "\t1\n", sep=""), sep="")
    for (w in words)
        cat(w, "\t1\n", sep="")
}
close(con)

スクリプトに欠けている部分は次のとおりです。

 while (length(line <- readLines(con, n = 1, warn = FALSE)) > 0) {
        #do your dance
        #do your dance quick
        #come on everybody tell me what's the word
        #word up
    }

もちろん、Cameo の Word Up! の歌詞を置き換える必要があります。あなたの実際のロジックで。

音楽を適切にデバッグすると、プロセスの苦痛が軽減されることに注意してください。

http://www.youtube.com/watch?v=MZjAantupsA

于 2010-12-14T20:52:55.737 に答える