Sparkで少サイズ大量データの課題にどう立ち向かう?
日々ビッグデータと格闘しておられる私たちデータエンジニアにはなじみ深いSparkのの話です。
小サイズ&大量ファイルのデータを扱うことがなぜ苦手なのか、どう対処すればよいかを見てみましょう。
なぜ小サイズ&大量ファイルが苦手?
Sparkは細切れのデータを扱うのがメモリ効率やパフォーマンスの面で苦手です。
具体的なサイズをいうと数KB~数MBだと悪影響が出てきますね。
なぜ細切れのファイルを扱いのが苦手なのかというと、ファイルを開いて・読んで・閉じる必要があるためです。
極端な話、ファイルがひとつだけであれば一度だけの開け閉めと読み取りでいいですから。
またタスクを平行で走らせるときのオーバーヘッドもファイル数に応じて大きくなっていきます。
さらにSparkのメモリ管理は大規模で連続したメモリ領域に特化していて、細切れのファイルだとメモリが枯渇してしまうんですよね。
どう対処する?
第一に細切れのファイルをしゃぶしゃぶ肉ぐらいのサイズに…などと分かりにくい例えをしたのは、ファイルサイズの目安は計算資源や扱うデータに、行う処理によって異なるからです。
本当にあくまで目安でいうと、128MB~数GBといわれています。
既に細切れになってしまったファイルは`hdfs dfs -getmerge`などを用いてより大きいファイルに融合するとよいでしょう。
他の対処として、特定のキーに基づいてパーティションを切ると同じキーの値を持つファイルを一度に処理することになって効率的に処理できます。
またファイル形式を列形式であるParquetやORCにするのも有効です。
さらに頻繁にアクセスされるデータをメモリ、またはディスク上に一時保存することで再処理を避けたり、メモリやコア数、パーティション数といった処理資源や構成を調整するのもアリです。
Sparkのパフォーマンスチューニングは奥が深いのでここでは詳細には立ち入らず、別の記事にお譲りします。
Apache Spark: Config Cheatsheet
感想
本当に感想なのですが、Sparkってやっぱり扱うのが難しいです。
ジョブ自体もそうですが、ジョブ管理も色々課題がわいてきます。
SQLで完結するようなデータ処理であれば、RedshiftのようなMPPデータベースで完結させたいですね。
参考
Why loading 100K small files into Apache Spark pose a challenge?
よろしければサポートお願いします! いただいたサポートはクリエイターとしての活動費に使わせていただきます!