
2026/01/18 17:58
**コマンドラインツールは、2014年の Hadoop クラスタより最大 235 倍高速に動作します**
RSS: https://news.ycombinator.com/rss
要約▶
日本語訳:
記事は、多くのビッグデータタスクが Hadoop よりも単純なシェルパイプラインで大幅に効率的に解決できることを示しています。
7 ノードの EMR クラスターで、Tom Hayden のジョブは約1.75 GB のチェスゲームデータを26 分(≈1.14 MB/s)で処理しました。mrjob
基本的なローカルパイプライン()は同じ作業を約70 秒で完了し、Hadoop に比べて約47 倍の速度向上を実現しました。cat *.pgn | grep "Result" | sort | uniq -c
その後の改良として、を AWK スクリプトに置き換え、sort|uniqでfind … | xargs -P4 grep -F "Result"を並列化し、フィルタリングを AWK(grep)へ移動させ、最後に gawk を高速な mawk に差し替えることで実行時間を約12 秒に短縮しました。この最終パイプラインは約235 倍の速度向上(≈270 MB/s のスループット)を達成し、ストリーミングカウンタのおかげでほぼメモリ使用量がゼロでした。awk '/Result/'
本稿では、Hadoop は真に大規模または本質的に分散されたワークロードにのみ正当化されると主張しており、それ以外の場合は軽量なシェルツールでコストを削減し、保守を簡素化し、遥かに高速な結果を提供できると述べています。
元の要約が好きな場合:
- 元の要約はほぼ正確ですが、一部重要な詳細(正確な速度向上数値、中間パイプラインの調整、およびメモリ使用量の説明)が欠けています。 上記の改訂版では、主要ポイントをすべて取り入れつつメッセージを明確かつ簡潔に保っています。
本文
コマンドラインツールは、Hadoop クラスターを 235 倍高速化できる
はじめに
ウェブ閲覧中に、Tom Hayden が Amazon Elastic MapReduce(EMR)と mrjob を使って、MillionBase アーカイブからダウンロードしたチェスゲームの勝敗統計を算出する記事を見つけました。
データセットは約 1.75 GB(≈200 万局)しかなく、Hadoop はオーバーエンジニアリングに思えましたが、Hayden はそれでも Hadoop を使用し、26 分の処理時間(約 1.14 MB/s)を報告しています。
私のノートパソコンで同じ結果を得るまでにわずか 12 秒(≈270 MB/s)しかかからず、235 倍 の高速化が実現しました。
なぜシェルツールが有効なのか
- デフォルトで並列処理:シェルパイプラインは同時に走るため、自分専用のローカル Storm クラスターを持つようなものです。
- 低メモリフットプリント:ストリーミング処理はほぼ RAM を消費しません。
- シンプルさ:cat、grep、awk、xargs などの基本 Unix コマンドで、複雑な MapReduce ジョブを置き換えられます。
データについて
PGN ファイルには次のような行があります:
[Event "F/S Return Match"] ... [Result "1/2-1/2"]
重要なのは
[Result …] 行だけです。
→ ホワイト勝ち1-0
→ ブラック勝ち0-1
→ 引き分け1/2-1/2
「–」のケース(進行中ゲーム)は無視します。
パイプライン構築
1. 参照速度
データを
/dev/null に書き出す:
cat *.pgn > /dev/null
3.46 GB を約 13 秒で処理 → 約 272 MB/s(I/O バウンド)。
2. 基本パイプライン
結果行を抽出し、ソート&カウント:
cat *.pgn | grep "Result" | sort | uniq -c
約 70 秒。
3. awk
を使う
awkソートを避けて直接カウント:
cat *.pgn | grep "Result" | awk '{ split($0, a, "-"); res = substr(a[1], length(a[1]), 1); if (res == 1) white++; if (res == 0) black++; if (res == 2) draw++; } END { print NR, white, black, draw }'
約 65 秒 → 約 47 倍高速化。
ボトルネックの並列化
xargs
を使う
xargsgrep を並列化:
find . -type f -name '*.pgn' -print0 | xargs -0 -n1 -P4 grep -F "Result" | gawk '{ split($0, a, "-"); res = substr(a[1], length(a[1]), 1); if (res == 1) white++; if (res == 0) black++; if (res == 2) draw++; } END { print NR, white, black, draw }'
約 38 秒 → 約 77 倍高速化。
grep
を完全に排除
grepawk が行をフィルタリング:
find . -type f -name '*.pgn' -print0 | xargs -0 -n1 -P4 awk '/Result/ { split($0, a, "-"); res = substr(a[1], length(a[1]), 1); if (res == 1) white++; if (res == 0) black++; if (res == 2) draw++; } END { print NR, white, black, draw }'
ファイルごとのカウントを出力し、次の
awk で集計:
... | awk '{games += $1; white += $2; black += $3; draw += $4} END {print games, white, black, draw}'
約 18 秒 → 約 174 倍高速化。
さらに速くするために mawk
を使用
mawkfind . -type f -name '*.pgn' -print0 | xargs -0 -n4 -P4 mawk '/Result/ { split($0, a, "-"); res = substr(a[1], length(a[1]), 1); if (res == 1) white++; if (res == 0) black++; if (res == 2) draw++ } END {print NR, white, black, draw}' | mawk '{games += $1; white += $2; black += $3; draw += $4} END {print games, white, black, draw}'
約 12 秒 → 約 235 倍高速化(270 MB/s)、元のベンチマークと一致。
結論
単純なシェルパイプラインは、実際に多くのデータ処理タスクで Hadoop を上回る性能を示します。特にワークロードが「エンバラストリー・パラレル」であり、一台のマシンに収まる場合です。
真に大規模な分散処理が必要なときは、Hadoop や類似フレームワークが正当化されます。それ以外では、従来のリレーショナルデータベースや軽量ツールがコスト低減・保守性向上に寄与することが多いです。