HDFS + Apache Spark をインストールし、Javaでテキスト検索アプリを実行してみた
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 を稼働させて、テキスト検索アプリケーションを実行してみます。
環境と必要なソフトウェア
ちなみに、この記事の環境や必要なソフトウェアは、以下の通りです。
- OS は、「Windows 10 Home 日本語版」です。
- Java は、「JDK 1.8」がインストール済みです。
- IDE は、「Intellij IDEA」を使っています。
- Hadoop は、「Apache Hadoop-2.7.7」を使用します。
- Spark は、「Apache Spark-2.4.5-bin-hadoop-2.7」を使用します。
- 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 でテキスト検索アプリケーションを作成し、実行してみました。
今回の記事を参考に、検索アプリなどを作ってみてはいかがでしょうか!
こちらの記事もオススメ!
2020.07.28Java 特集実装編※最新記事順に並べています。Amazon EMRのHadoop完全分散モードクラスタ上でApache Spark...
2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
「好きを仕事にするエンジニア集団」の(株)ライトコードです! ライトコードは、福岡、東京、大阪、名古屋の4拠点で事業展開するIT企業です。 現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。 いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。 システム開発依頼・お見積もり大歓迎! また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」を積極採用中です! インターンや新卒採用も行っております。 以下よりご応募をお待ちしております! https://rightcode.co.jp/recruit
おすすめ記事
immichを知ってほしい
2024.10.31