LinuxでPySparkをマスターする:Pythonで数百GBのデータを処理する方法

Python tutorial - IT technology blog
Python tutorial - IT technology blog

なぜビッグデータにはPandasだけでは不十分なのか?

Pandasを使ってデータ処理を頻繁に行っているなら、CSVファイルがRAMの容量を超えてしまい、PCがフリーズしてしまった経験があるのではないでしょうか。16GBのRAMを搭載したノートPCで20GBのログファイルを読み込もうとしたことがありますが、結果としてシステムは数秒で完全にハングアップしてしまいました。これは純粋なPythonの物理的な限界です。Pythonは単一のCPUコアで動作し、単一マシンのRAM容量に縛られてしまうからです。

Apache Sparkはこの問題を解決するために誕生しました。データを一箇所に詰め込もうとするのではなく、Sparkはデータを細かく分割し、複数のCPUコア、あるいはクラスター内の数百台のサーバーで並列処理を行います。

PySparkは、その分散処理の力をPythonから制御するためのライブラリです。複雑なJavaやScalaを学ぶ必要はありません。慣れ親しんだPythonの構文だけで、数十億行のデータをスムーズに処理できます。

Linux環境へのPySparkのインストール

UbuntuやCentOSでPySparkを安定して動作させるには、標準的なJava環境を構築する必要があります。SparkはPython上で直接動作するのではなく、Java仮想マシン(JVM)を介して動作するためです。

1. Java (JRE/JDK) のインストール

実務経験上、SparkはJava 8または11で最も安定して動作します。ライブラリの互換性エラーが発生しやすいため、Java 21のような最新バージョンを急いでインストールしないようにしましょう。

sudo apt update
sudo apt install openjdk-11-jdk -y
# バージョンを再確認
java -version

2. Apache Sparkのダウンロードと設定

Hadoop用にビルド済みのSparkを選択することをお勧めします。この例では、現在非常に安定しているバージョン3.5.0を使用します:

wget https://archive.apache.org/dist/spark/spark-3.5.0/spark-3.5.0-bin-hadoop3.tgz
tar -xvzf spark-3.5.0-bin-hadoop3.tgz
sudo mv spark-3.5.0-bin-hadoop3 /opt/spark

3. pipによるPySparkライブラリのインストール

マシン内にSparkのソースコードがあっても、PythonからSparkの関数を呼び出すためには追加のパッケージをインストールする必要があります:

pip install pyspark

環境変数の設定:最も重要なステップ

インストールを終えても、pysparkコマンドを入力すると「command not found」と表示されることがよくあります。このエラーは、OSがSparkやJavaの場所を認識していないために発生します。

シェルの設定ファイル(.bashrcまたは.zshrc)を開きます:

nano ~/.bashrc

ファイルの末尾に以下の行を追加してパスを定義します:

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export SPARK_HOME=/opt/spark
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
export PYSPARK_PYTHON=python3

保存して、次のコマンドで新しい設定を反映させます:

source ~/.bashrc

初めてのPySparkスクリプト作成:実践的なデータ分析

大規模なデータセット内の単語をカウントする問題を解いてみましょう。これは検索システムやユーザー行動分析の基礎となります。

pyspark_demo.pyファイルを作成します:

from pyspark.sql import SparkSession
from pyspark.sql.functions import explode, split, col

# SparkSessionの初期化 - アプリケーションの「心臓部」
spark = SparkSession.builder \
    .appName("LogAnalysisApp") \
    .getOrCreate()

# 実際には、spark.read.csv("path/to/bigfile.csv") を使用します
data = [("PySparkはデータ処理が非常に速い",), 
        ("Linuxはビッグデータにとって素晴らしい環境です",), 
        ("PythonとSparkは最高のコンビです",)]

df = spark.createDataFrame(data, ["content"])

# 文章を個別の単語に分割
words_df = df.select(explode(split(col("content"), " ")).alias("word"))

# 出現頻度の統計
word_counts = words_df.groupby("word").count().orderBy("count", ascending=False)

word_counts.show()
spark.stop()

Spark専用のコマンドを使用してスクリプトを実行します:

spark-submit pyspark_demo.py

Spark Web UIによるパフォーマンス監視

システムがどのように動作しているかを知らずにテラバイト級のデータを扱うのは大きな間違いです。スクリプトの実行中にブラウザを開き、http://localhost:4040にアクセスしてください。

システムがどのように動作しているかを知らずにテラバイト級のデータを扱うのは大きな間違いです。ここでは、Stagesタブに特に注目してください。あるタスクに20分かかっている一方で他のタスクが数秒で終わっている場合、それは「Data Skew(データの偏り)」の兆候です。この現象は、1つのCPUコアがワークロードの90%を負担することになり、システム全体の速度を低下させます。

また、素早くテストしたい場合は、ターミナルでpysparkと入力するだけです。Jupyter Notebookのような対話型環境(REPL)がビッグデータ専用に開き、メインスクリプトに組み込む前の小さなコードのデバッグに非常に役立ちます。

Sparkがいかにタスクを分散させるかを理解すれば、ビッグデータ処理は決して手の届かないものではありません。このガイドが、Linuxプラットフォーム上でビッグデータプロジェクトを自信を持って展開する助けになれば幸いです。

Share: