0

1億行を超える大きなテーブルを含むデータベースがあります。このデータをエクスポートし(このテーブルを他のいくつかのテーブルと結合したり、いくつかのフィールドをクリーンアップしたりするなどの変換後)、後でHadoopで処理できるように、大きなテキストファイルに保存します。

これまでのところ、私は2つのことを試しました。

  1. Pythonを使用して、このサブクエリのトリックを使用してチャンク(通常は一度に10000レコード)でテーブルを参照し、各行で変換を実行して、テキストファイルに直接書き込みます。トリックは役に立ちますがLIMIT、エクスポートが進むにつれて、はだんだん遅くなります。これではテーブル全体をエクスポートできませんでした。

  2. mysqlコマンドラインツールを使用して、クエリの結果をCSVフォームでテキストファイルに直接出力しようとしました。サイズが原因で、メモリが不足してクラッシュしました。

現在、データを直接インポートするツールとしてSqoopを調査していますHDFSが、他の人がこのような大規模なエクスポートをどのように処理するのか疑問に思いました。

4

2 に答える 2

2

メモリの問題は、間違ったデータベースクエリメカニズムを使用していることを示しています。

通常、mysql_store_result()Cレベルで使用することをお勧めします。これは、CursorまたはDictCursorPythonレベルでの使用に対応します。これにより、データベースができるだけ早く再び解放され、クライアントは必要に応じてデータを処理できるようになります。

ただし、データはクライアントプロセスにキャッシュされるため、大量のデータには適していません。これは非常にメモリを消費する可能性があります。

mysql_use_result()この場合、 (C)respを使用する方がよい場合があります。SSCursor/ SSDictCursor(Python)。これにより、結果セット全体を取得し、その間データベース接続で他に何もする必要がなくなります。しかし、それはあなたのクライアントプロセスに多くのメモリを節約します。mysqlCLIを使用すると、引数を使用してこれを実現できます-q

于 2013-01-18T12:15:58.510 に答える
1

ここで指定していないため、正確にどのクエリを使用したかはわかりませんが、制限とオフセットを指定していると思います。これは、データの開始時に非常に高速なクエリですが、非常に遅くなります。

IDなどの一意の列がある場合は、最初のN行のみをフェッチできますが、クエリ句を変更します。

WHERE ID > (last_id)

これはインデックスを使用し、許容できる速度になります。

ただし、一般的には単純に実行する方が高速です。

SELECT * FROM table

適度に大きなフェッチサイズで、そのようなクエリのカーソルを開きます。

于 2013-01-18T11:53:29.627 に答える