2016-07-07 4 views
-1

カスタムRマップを使ってHDFSにデータを書き込もうとしています。私はかなり早い段階でプロセスを読み込んでいますが、後処理にはかなりの時間を要します。私は、しかし、はwrite.table部分的にしか情報を書き込む(最初の数行と最後の数行)とwriteLinesが動作しない(ファイル接続に書き込むことができる機能)RからHDFSに書き込む最速の方法(パッケージ無し)

output <- file("stdout", "w") 
write.table(base,file=output,sep=",",row.names=F) 
writeLines(t(as.matrix(base)), con = output, sep = ",", useBytes = FALSE) 

を試してみました。だから今私は試みている:

for(row in 1:nrow(base)){ 
     cat(base[row,]$field1,",",base[row,]$field2,",",base[row,]$field3,",",base[row,]$field4,",", 
      base[row,]$field5,",",base[row,]$field6,"\n",sep='') 
    } 

しかし、これは非常に遅い書き込み速度。ここについてのいくつかのログには、どのように遅い書き込み速度は次のとおりです。

2016年7月7日08:59:30557 INFO [スレッド-49] org.apache.hadoop.streaming.PipeMapRed:レコードR/W = 921203/406056 2016-07-07 08:59:40,567 INFO [Thread-49] org.apache.hadoop.streaming.PipeMapRed:レコードR/W = 921203/406422 2016-07-07 08:59:50,582 INFO [Thread-49] org.apache.hadoop.streaming.PipeMapRed:レコードR/W = 921203/406710 2016-07-07 09:00:00,947 INFO [スレッド49] org.apache.hadoop.streaming .PipeMapRed:レコードR/W = 921203/407001 2016-07-07 09:00:11,392 INFO [スレッド49] org.apache .hadoop.streaming.PipeMapRed:レコードR/W = 921203/407316 2016-07-07 09:00:21,832 INFO [スレッド49] org.apache.hadoop.streaming.PipeMapRed:レコードR/W = 921203/407683 2016-07-07 09:00:31,883 INFO [スレッド49] org.apache.hadoop.streaming.PipeMapRed:レコードR/W = 921203/408103 2016-07-07 09:00:41,892情報[スレッド49] org.apache.hadoop.streaming.PipeMapRed:レコードR/W = 921203/408536 2016-07-07 09:00:51,895 INFO [スレッド49] org.apache.hadoop.streaming.PipeMapRed :レコードR/W = 921203/408969 2016-07-07 09:01:01,903情報[Thread-49] org.apache.hadoop.streaming.PipeMapRed:レコードR/W = 921203/409377 2016-07- 07 09:01:12,187 INFO [スレッド49] org.apache.hadoop.streaming.PipeMapRed:レコードR/W = 921203/409782 2016-07-07 09:01:22,198 INFO [Thread-49] org.apache.hadoop.streaming.PipeMapRed:レコードR/W = 921203/410161 2016-07-07 09:01:32,293 INFO [Thread-49] org.apache.hadoop.streaming.PipeMapRed:レコードR/W = 921203/410569 2016-07-07 09:01 :42,509 INFO [Thread-49] org.apache.hadoop.streaming.PipeMapRed:レコードR/W = 921203/410989 2016-07-07 09:01:52,515 INFO [Thread-49] org.apache.hadoop 。Streaming.PipeMapRed:レコードR/W = 921203/411435 2016-07-07 09:02:02,525 INFO [Thread-49] org.apache.hadoop.streaming.PipeMapRed:レコードR/W = 921203/411814 2016-07-07 09:02:12,625情報[T hread-49] org.apache.hadoop.streaming.PipeMapRed:レコードR/W = 921203/412196 2016-07-07 09:02:22,988 INFO [スレッド49] org.apache.hadoop.streaming.PipeMapRed :レコードR/W = 921203/412616 2016-07-07 09:02:32,991 INFO [スレッド49] org.apache.hadoop.streaming.PipeMapRed:レコードR/W = 921203/413078 2016-07- 07 09:02:43,104 INFO [Thread-49] org.apache.hadoop.streaming.PipeMapRed:レコードR/W = 921203/413508 2016-07-07 09:02:53,115 INFO [Thread-49] 組織.apache.hadoop.streaming.PipeMapRed:レコードR/W = 921203/413975 2016-07-07 09:03:03,122 INFO [Thread-49] org.apache.hadoop.streaming。PipeMapRed:レコードR/W = 921203/414415 2016-07-07 09:03:13,128 INFO [スレッド49] org.apache.hadoop.streaming.PipeMapRed:レコードR/W = 921203/414835 2016-07 -07 09:03:23,131 INFO [Thread-49] org.apache.hadoop.streaming.PipeMapRed:レコードR/W = 921203/415210 2016-07-07 09:03:33,143 INFO [スレッド49] org.apache.hadoop.streaming.PipeMapRed:レコードR/W = 921203/415643 2016-07-07 09:03:43,153 INFO [スレッド49] org.apache.hadoop.streaming.PipeMapRed:レコードR/W = 921203/416031

私は何か間違っていると思います。私はdata.tableを使用しています。

+0

おそらく['write.hdfs'](http://www.inside-r.org/packages/cran/rHadoopClient/docs/write.hdfs)。 – nrussell

+0

おそらくwrite.hdfs 'write.hdfs < - のコードではありません(データ、hdfs.path、hadoop.cmd =" hadoop "、sep =" \ t "){ tmp.file < - sprintf(" tmp_hadoop_% (データ、ファイル= tmp.file、row.names = F、引用符= F、col.names = F、sep = sep) cmd < - sprintf( "cat%s |%s fs -put - %s"、tmp.file、hadoop.cmd、hdfs.path) 結果< - system(command = cmd) file.remove(tmp.file ) result } write.table(data、file = tmp.file'は、JVMメモリを消費し、中間ファイルを書き込んでHDFSにロードした後、良い解決策のように見えません。 – abhiieor

答えて

0

私は最速以下見つかったファイルの書き込み機能を持つ様々な機能を持つ私の別の実験法に基づいて:

xsapplyスローと as.charactersapplyは、混乱を防ぐためであるNULLリターンをキャプチャするだけであり
base <- data.table(apply(base,2,FUN=as.character),stringsAsFactors = F) 
x <- sapply(1:nrow(base), 
FUN = function(row) { 
cat(base$field1[row],",", base$field2[row], "," , base$field3[row], "," , 
base$field4[row], "," , base$field5[row], "," , base$field6[row], "\n" , sep='') 
        } 
) 
rm(x) 

ファクタ(実際の値よりも印刷の内部因子値)になるのは、catです。

関連する問題