• トップ
  • ブログ一覧
  • HDFS + Apache Spark をインストールし、Javaでテキスト検索アプリを実行してみた
  • HDFS + Apache Spark をインストールし、Javaでテキスト検索アプリを実行してみた

    広告メディア事業部広告メディア事業部
    2020.05.26

    IT技術

    Apache Spark を HDFS 上で稼働させて、テキスト検索アプリを実行しよう

    このビッグデータの時代、膨大なデータに対する高効率かつハイスピードのデータ分析エンジンが不可欠となっています。

    そこで登場したのが、「Apache Spark」です。

    「Apache Spark」のウェブサイトによると、Hadoop の MapReduce より、Spark の方が100倍も速いとのこと。

    【Apache Spark】
    https://spark.apache.org/

    それでは、Spark とは、どのようなソフトウェアなのでしょうか

    Apache Spark とは?

    Spark のウェブサイトでは、「Apache Spark™ is a unified analytics engine for large-scale data processing.」と定義されていました。

    簡単に翻訳すると、「Spark とは、大規模のデータを処理するための統合的な分析エンジンのことです。

    Sparkの成り立ち

    Spark は、「SQL」と「Dataframes」、機械学習のための「MLib」、グラフデータ処理のための「GraphX」、及び「Spark Streaming」のライブラリから成り立っています。

    統合的というのは、これらのライブラリを一つのアプリケーションで円滑に統合できることを意味しています。

    大規模のデータを高速に処理するため、Spark は、多数のマシーンから成り立つクラスター上で並列分散処理を実行。

    分析エンジンとして、Spark は独自の永続性記憶装置機能を持っていません。

    とはいえ、Spark はHDFS(Hadoop Distributed File System)や「Apache Mesos」、「Apache HBase」など、様々な分散システム上で稼働することができます。

    この記事では、HDFS 上で Spark を稼働させて、テキスト検索アプリケーションを実行してみます。

    環境と必要なソフトウェア

    ちなみに、この記事の環境や必要なソフトウェアは、以下の通りです。

    1. OS は、「Windows 10 Home 日本語版」です。
    2. Java は、「JDK 1.8」がインストール済みです。
    3. IDE は、「Intellij IDEA」を使っています。
    4. Hadoop は、「Apache Hadoop-2.7.7」を使用します。
    5. Spark は、「Apache Spark-2.4.5-bin-hadoop-2.7」を使用します。
    6. Windows OS のための Hadoop のパッチファイルが必要となります。

    Apache Hadoop をインストールしよう

    HDFS 上で Spark を稼働するためには、まず、Hadoop をインストールする必要があります。

    HDFS(Hadoop Distributed File System)は、名前の通り「Apache Hadoop」の分散ファイルシステムです。

    「Apache Hadoop」とは単純なプログラミングモデルを用いて、コンピューターのクラスター上で大規模なデータセットの分散処理を可能とするフレームワークのことです。

    【Apache Hadoop】
    https://hadoop.apache.org/

    ※Hadoop や HDFS の詳細について、またの機会があればまとめたいと思います!

    Apache Hadoop のダウンロード

    それでは、まず、「Apache Hadoop-2.7.7」を以下からダウンロードしましょう。

    【archive.apache.org】
    https://archive.apache.org/dist/hadoop/common/hadoop-2.7.7/

    「Apache Hadoop 2」スタンドアローンモードのインストール

    次に、「Apache Hadoop 2」をスタンドアローンモードでインストールていきましょう。

    インストールは、以下のステップで行っていきます。

    ステップ1:「Hadoop-2.7.7.tar.gz」ファイルを解凍

    初めに、ダウンロードした「Hadoop-2.7.7.tar.gz」ファイルを、「C:\hadoop-2.7.7」フォルダに解凍します。

    ステップ2:「hadoop-env.cmd」ファイルを編集して JAVA_HOME を設定

    次に、「C:\hadoop-2.7.7\etc\hadoop」フォルダにある「hadoop-env.cmd」ファイルを編集し、JAVA_HOME の設定を行います。

    この記事の環境では、「JAVA_HOME=C:"\Program Files\Java\jdk1.8.0_241"」と設定しました。

    1@rem Set Hadoop-specific environment variables here.
    2
    3@rem The only required environment variable is JAVA_HOME.  All others are
    4@rem optional.  When running a distributed configuration it is best to
    5@rem set JAVA_HOME in this file, so that it is correctly defined on
    6@rem remote nodes.
    7
    8@rem The java implementation to use.  Required.
    9
    10set JAVA_HOME=C:"\Program Files\Java\jdk1.8.0_241"

    ステップ3:「core-site.xml」ファイルを編集

    「C:\hadoop-2.7.7\etc\hadoop」フォルダにある「core-site.xml」ファイルを、以下のように編集します。

    1<!-- Put site-specific property overrides in this file. -->
    2
    3<configuration>
    4  <property>
    5    <name>fs.defaultFS</name>
    6    <value>hdfs://localhost:9000</value>
    7  </property>
    8</configuration>

    ステップ4:「hdfs-site.xml」ファイルを編集

    「C:\hadoop-2.7.7\etc\hadoop」フォルダにある「hdfs-site.xml」ファイルを編集し、レプリカの数と namenode、datanode ディレクトリの設定を行います。

    1<!-- Put site-specific property overrides in this file. -->
    2
    3<configuration>
    4  <property>
    5    <name>dfs.replication</name>
    6    <value>1</value>
    7  </property>
    8  <property>
    9    <name>dfs.namenode.name.dir</name>
    10    <value>/C:/hadoop-2.7.7/data/namenode</value>
    11  </property>
    12  <property>
    13    <name>dfs.datanode.data.dir</name>
    14    <value>/C:/hadoop-2.7.7/data/datanode</value>
    15  </property>
    16</configuration>

    ステップ5:「mapred-site.xml.template」ファイルをコピーして編集

    「C:\hadoop-2.7.7\etc\hadoop」フォルダにある「mapred-site.xml.template」ファイルを、「mapred-site.xml」ファイルにコピーします。

    つまり、「mapred-site.xml.template」ファイルを同じフォルダにコピーし、そのコピーを「mapred-site.xml」と名付けます

    そして、「mapred-site.xml」ファイルを次の通りに編集します。

    1<!-- Put site-specific property overrides in this file. -->
    2
    3<configuration>
    4  <property>
    5    <name>mapreduce.framework.name</name>
    6    <value>yarn</value>
    7  </property>
    8</configuration>

    ステップ6:「yarn-site.xml」ファイルを編集

    「C:\hadoop-2.77\etc\hadoop」フォルダにある「yarn-site.xml」ファイルを、以下のように編集します。

    1<!-- Site specific YARN configuration properties -->
    2
    3<configuration>
    4  <property>
    5    <name>yarn.nodemanager.aux-services</name>
    6    <value>mapreduce_shuffle</value>
    7  </property>
    8  <property>
    9    <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
    10    <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    11  </property>
    12</configuration>

    ステップ7:Windows 用の Hadoop パッチファイルに置き換える

    Windows の環境上で Hadoop を稼働するため、Windows 用の Hadoop パッチファイルが必要となります。

    デフォルトでは、このパッチファイルは、Hadoop のディストリビューションに入っていません。

    Hadoop のパッチファイルは、以下のウェブサイトからダウンロードできます。

    【GitHub】
    https://github.com/wmwijaya/hadoop2-standalone-windows7-windows10/tree/master/bin

    ここで、「C:\hadoop-2.7.7\bin」フォルダにある全てのファイルを削除し、上記のウェブサイトにある全てのファイルで置き換えます

    ステップ8:環境変数に HADOOP_HOME を作成して Hadoop のパスを設定

    Windows 10 のシステム環境変数に、HADOOP_HOME という変数を新規作成し、その値に「C:\hadoop-2.7.7」を設定。

    システム環境変数の Path 変数を編集し、「C:\hadoop-2.7.7\bin」と「C:\hadoop-2.7.7\sbin」を新規の値として追加します。

    ステップ9:HDFS をフォーマット

    「Windows PowerShell」を管理者として実行し、HDFS をフォーマットする hdfs namenode -format コマンドを実行。

    フォーマットが成功すると、以下のような画面が表示されます。

    ステップ10:HDFS を起動

    Hadoop の Namenode、Datanode、Resource Manager、Nodemanager を起動するため、管理者として実行した「Windows PowerShell」で start-dfs.cmd と start-yarn.cmd コマンドを実行。

    このとき、以下の4つの新しいコマンドプロンプトの画面が起動されます。

    また、この4つのプロセス(Namenode、Datanode、Resource Manager、NodeManager)が動いているかどうかは、以下のように、jps コマンドで確認できます。

    以上で、Hadoop のスタンドアローンモードのインストールは完了です。

    Hadoop の Resource Manager や Namenode の動作状況は、ウェブブラウザで確認できます

    Resource Manager の URL:http://localhost:8088
    Namenode の URL:http://localhost:50070

    Resource Manager の動作状況

    Namenode の動作状況

    Apache Spark のセットアップ

    次に、Apache Spark のセットアップを行っていきましょう。

    Apache Spark のセットアップは、Hadoop のインストールと比べると簡単です。

    Apache Spark のダウンロード

    まず、「Apache Spark-2.4.5-bin-hadoop-2.7」を以下のウェブサイトからダウンロードしてください。

    【Apache Spark】
    https://spark.apache.org/downloads.html

    Apache Spark のインストール

    以下のようなステップで、Apache Spark をインストールしていきます。

    ステップ1:「Apache Spark-2.4.5-bin-hadoop-2.7.tgz」を解凍

    ダウンロードした「Apache Spark-2.4.5-bin-hadoop-2.7.tgz」ファイルを「C:\spark-2.4.5-bin-hadoop2.7」フォルダーに解凍します。

    ステップ2:「winutils.exe」ファイルをコピー

    Hadoop のホームディレクトリ(C:\hadoop-2.7.7)の「C:\hadoop-2.7.7\bin」ディレクトリから、「winutils.exe」ファイルを「C:\spark-2.4.5-bin-hadoop2.7\bin」へコピーします。

    ステップ3:環境変数に SPARK_HOME を作成して Spark のパスを設定

    Windows 10 のシステム環境変数に SPARK_HOME という変数を新規作成し、その値に「C:\spark-2.4.5-bin-hadoop2.7」と設定します。

    そして、システム環境変数の Path 変数を編集し、「C:\spark-2.4.5-bin-hadoop2.7\bin」を新規の値として追加します。

    ステップ4:Sparkを起動

    管理者として実行した「Windows PowerShell」で、 spark-shell.cmd を実行し、「Spark Shell」を起動。

    「Spark Shell」の起動が成功すると、「Windows PowerShell」で以下のような画面が表示されます。

    これで、Apache Spark のセットアップは、完了です。

    Spark テキスト検索アプリケーションを Java で作成・実行

    HDFS と Spark の準備が完了しましたので、いよいよ、Spark のテキスト検索アプリケーションの作成に移ります。

    まず、検索対象となるテキストファイルを用意しましょう。

    ここでは、「sakura.txt」、「ninja.txt」、「osake.txt」という3つのテキストファイルを作成しました。

    これらのテキストファイルの内容は、ファイル名の通り、英語の Wikipedia からコピーしたテキストです。

    HDFS へテキストファイルをアップロード

    テキストファイルの準備ができたら、HDFS にアップロードしましょう。

    その前に、管理者として実行した「Windows PowerShell」で以下のコマンドを実行し、HDFS でそれらのテキストファイルを格納するためのディレクトリを作成します。

    1hdfs dfs -mkdir /tmp
    2hdfs dfs -mkdir /tmp/input

    HDFS へアップロード

    次は、用意したテキストファイルを1個づつ HDFS へアップロードします。

    1hdfs dfs -copyFromLocal C:\Users\wijaya\Documents\ninja.txt /tmp/input/ninja.txt
    2hdfs dfs -copyFromLocal C:\Users\wijaya\Documents\osake.txt /tmp/input/osake.txt
    3hdfs dfs -copyFromLocal C:\Users\wijaya\Documents\sakura.txt /tmp/input/sakura.txt

    コマンドで確認

    アップロード完了したら、hdfs dfs -ls /tmp/input コマンドで確認しましょう。

    ちなみに、今回の実行環境では、以下の画像のようになります。

    テキスト検索アプリケーションの作成・実行

    この記事では、「Intellij IDEA」を使用していますので、「Intellij IDEA」の方法で Spark テキスト検索アプリケーションを作成します。

    次のようなステップでやっていきます。

    ステップ1:テキスト検索アプリのプロジェクトを作成

    「Intellij IDEA」を管理者として実行し、「Maven Project」を新規作成します。

    このプロジェクトに「SparkTextSearch」というプロジェクト名を付けます。

    そして、「C:\spark-2.4.5-bin-hadoop2.7\jars」フォルダを、プロジェクトのモジュールのディペンデンシーに追加します。

    ステップ2:テキスト検索アプリを作成

    プロジェクトの「src > main > java」に「TextSearch.java」という新しい Java クラスを作成します。

    そのソースコードは、次のようになります。

    1import org.apache.spark.sql.*;
    2/*
    3TextSearch.java
    4 */
    5
    6public class TextSearch {
    7
    8    public final SparkSession spark;
    9    public static String HDFS = "hdfs://localhost:9000/tmp/input/*.txt";
    10
    11    public TextSearch(){
    12        super();
    13        spark = SparkSession
    14                .builder()
    15                .appName("TextSearch")
    16                .master("local[1]")
    17                .getOrCreate();
    18    }
    19
    20    public static void main(String[] args){
    21        TextSearch ts = new TextSearch();
    22        //HDFSからファイルを読み込んで、Spark Dataframeで"value"と言うフィールドに格納。
    23        Dataset<String> df = ts.spark.read().textFile(HDFS);
    24        df.show(20, false); //Dataframeを20行のみ表示。
    25
    26        Dataset<Row> textQuery = df.select("value").filter("value like '%sakura%'");
    27
    28        textQuery.show(10, false);
    29        System.out.println("上のテーブルは'sakura'の検索結果です");
    30    }
    31
    32}

    完成した「SparkTextSearch」のプロジェクト構成は、以下のようになります。

    ステップ3:テキスト検索アプリを実行

    「TextSearch.java」を実行し、実行結果を確認しましょう。

    実行が成功すると、以下の画像に示されるような結果が得られます。

    ご覧の通り、テキストのクエリを含む文は、行ごとに出力されます。

    さいごに

    すこし長くなってしまいましたが、いかがでしたでしょうか?

    Windows 環境において、「Apache Spark + HDFS」をインストールし、Java でテキスト検索アプリケーションを作成し、実行してみました。

    今回の記事を参考に、検索アプリなどを作ってみてはいかがでしょうか!

    こちらの記事もオススメ!

    featureImg2020.07.28Java 特集実装編※最新記事順に並べています。Amazon EMRのHadoop完全分散モードクラスタ上でApache Spark...

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    広告メディア事業部

    広告メディア事業部

    おすすめ記事