2016-07-02 3 views
0

各行にキーがなくTSV(表形式の区切り値)表記のテキストファイルをロードしています。したがって、ある行は特定の変数を示し、次の行はすべて、その変数が新しい変数になるまでの値です。 PySpark(Python 2.7):SparkContext.newAPIHadoopFile経由で複数行レコードをロードする

は、したがって、私は、カスタム区切り文字を使用してファイルをロードしています(JupyterノートブックのPython 2.7で - Pyspark):

sheet = sc.newAPIHadoopFile(
    'sample.txt', 
    'org.apache.hadoop.mapreduce.lib.input.TextInputFormat', 
    'org.apache.hadoop.io.LongWritable', 
    'org.apache.hadoop.io.Text', 
    conf={'textinputformat.record.delimiter': ’var::'} 
) 

私の質問は、どのような複数行のレコードのサイズは? 1つの変数の値は、何千もの行になる可能性があります。 Sparkは1台のマシンでファイルを一度にロードするか、ブロックを分割して小さなブロック(チャンク)に分割して処理しますか?

メモリが処理ノードで爆発していないことを確認します。すべての説明をありがとう。

reading multiline records

答えて

1

o.a.h.mapreduce.lib.input.TextInputFormatによって返された各(キー、値)ペアは、オフセット(long)と文字列を含む単一のローカルデータ構造です。カスタムHadoop InputFormatを作成せずに、複数のレコード間で値を分割できるメカニズムはありません。

  • ディスク上のサイズは、あなたが最も可能性の高い良い行くことにしている数メガバイト未満の場合:「行数千人は」非常に正確な記述はありませんが、経験則として

  • これ以外の場合は、メモリ使用量とGCを追跡し、設定を調整する必要があります。

大量のレコードを使用すると、最適なリソースが使用されない可能性があります。ワーストケースのシナリオでは、簿記のコストが実際の実行よりもはるかに高い可能性があるタスクごとに1つのレコードで終了することができます。

+0

170MBのファイルには、「時間」と全体で5.252.874行で始まる50の複数行レコードが含まれています。したがって、1レコードには約106.000行があります。それを単一のブロックとして読むのは良い考えではないかもしれません。もう1つのオプションは、すべてのファイルを読み込み、 "Time"が発生した行番号を覚えておき、その情報を使用して後でファイルを再読み込みして、キータイムスタンプ値の3倍を構築することです。 – Matthias

+0

以前と同じアプリですか? – zero323

+0

確かに。しかし、私は小さなサンプルでテストしていました。実際のデータはファイルごとに約70〜170MBです。 – Matthias

関連する問題