Microsoft Azure上のUbuntuにHadoopをインストール

1.仮想ネットワーク(Azure Private Network)の構築

1.1.仮想ネットワークの新規作成

Sparkのノードをインターネットからアクセス可能な場所に設置するわけにもいきませんので、最初に仮想ネットワーク(Azure Private Network)を構築します。

新規→仮想ネットワーク→カスタム作成を選択して、適当に名前を設定します。
vpn1
“ポイントからサイト間VPNの構築”にチェックして次へ。
vpn2
ここは変更なし。vpn4
“ゲートウェイサブネットを追加”をクリックしてデフォルト設定のゲートウェイサブネットを追加して確定。vpn3

1.2.証明書の作成と登録

続いてルート証明書を作成します。Windowsには標準では証明書を作成する機能がないため、オープンソースのツールを使ったり、開発用のツールを使ったりして証明書を作成することになります。ここではVisual Studio 2013に付属する開発ツールを使用してルート証明書を作成します。まずは”C:¥Program Files¥Microsoft Visual Studio 12.0¥Common7¥Tools¥Shortcuts”にある”開発者コマンド プロンプト for VS2013″を開いてコマンドプロンプトを表示します。そして次のコマンドを実行して下さい。”SparkVirtualPrivateNetwork”の所は適当な名称に置換えて下さい。

makecert -sky exchange -r -n "CN=SparkVirtualPrivateNetwork" -pe -a sha256 -len 2048 -ss My "SparkVirtualPrivateNetwork.cer"

“SparkVirtualPrivateNetwork.cer”と言うファイルが出来上がります。これを証明書にアップロードします。
次にクライアント証明書を作成します。次のコマンドを実行します。
“ClientCertificateName”は適当な名称に置換えて下さい。

makecert -n "CN=ClientCertificateName" -pe -sky exchange -m 96 -ss My -in "SparkVirtualPrivateNetwork" -is my -a sha256

登録されている証明書を確認します。コマンドプロンプトから”certmgr.msc”を実行します。最初に”信頼されたルート証明機関”の”証明書”に先ほど作成したSparkVirtualPrivateNetworkが登録されているか、”個人”の”証明書”に”ClientCertificateName”が登録されているか確認します。
もしmakecertを実行した以外の環境から仮想ネットワークに接続する場合は、先ほど作成したSparkVirtualPrivateNetworkとClientCertificateNameを登録する必要があります。makecertを実行した環境で、それぞれの証明書の秘密鍵をエクスポートして、新たな環境にてインポートします。

1.3.VPNクライアントのインストール

仮想ネットワークのダッシュボードからクライアントVPNパッケージをダウンロードしてきてインストールします。インストールするとコントロールの”ネットワークと共有センター”に仮想ネットワークへの接続が追加されるので、接続を実行します。このとき使用する証明書を聞いてくるので、先ほど作成したClientCertificateNameを選択して下さい。

2.Apatch Hadoopのインストール

Apatch Sparkを動作させるには、その前にApatch Hadoopを動作させておく必要があります。
と言うわけでUbuntu 14.10の仮想マシンが起動している所から作業をスタートします。

2.1.スタンドアローンで動作する所まで…

hadoopの動作にはJavaが必要になります。OpenJDKでも問題なく動作するそうなので、標準のOpenJDKをインストールしていきます。

sudo apt update
sudo apt upgrade
sudo apt-get install -y default-jdk

最新版のhadoopをダウンロードしてきて展開します。

wget http://ftp.tsukuba.wide.ad.jp/software/apache/hadoop/common/hadoop-2.6.0/hadoop-2.6.0.tar.gz
tar xvfx hadoop-2.6.0.tar.gz

“/etc/profile”を編集して展開したhadoopへのパスを設定します。

...
export PATH=/<展開したディレクトリ>/hadoop-2.6.0/bin:$PATH
...

“hadoop-2.6.0/etc/hadoop/hadoop-env.sh”を編集してJAVA_HOMEのパスを設定します。

...
# set to the root of your Java installation
export JAVA_HOME=/usr/lib/jvm/default-java
...

この時点でスタンドアロンモードでhadoopが動作します。試しに”hadoop”とコマンドを打ってみて下さい。hadoopコマンドが起動するなら、先の設定へと進んでいきましょう。

2.2.疑似分散(Pseudo-Distributed)モードで動作する所まで…

今度は”ssh localhost”とコマンドを打って下さい。hadoopはノード間の接続にsshを使用します。もし”ssh localhost”で接続できないなら、sshがパスワードなどを入力しなくても繋がるように証明書を作成します。

ssh localhost
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

hadoop-2.6.0/etc/hadoop/core-site.xmlを編集します。
“hadoop.tmp.dir”で指定している”/var/opt/hadoop-2.6.0/cash”はhadoopが生成するファイルの保存先となるディレクトリです。デフォルトでは”/tmp”以下に保存されるために、OSを再起動すると全ての設定やHDFSに格納したデータが失われます。


...


        hadoop.tmp.dir
        /var/opt/hadoop-2.6.0/cash
        fs.defaultFS
        hdfs://localhost:9000


hadoop-2.6.0/etc/hadoop/hdfs-site.xmlを編集します。


...


        dfs.replication
        1


次のコマンドを実行して、HDFS(Hadoop Distributed File System)のnamenodeを初期設定します。

hdfs namenode -format

次のコマンドを実行して、hadoopのデーモンを起動します。

hadoop-2.6.0/sbin/start-dfs.sh

MapReduceで使用するユーザーディレクトリを作成します。

hadoop fs -mkdir /user
hadoop fs -mkdir /user/

最後にサンプルプログラムを実行して、hadoopが疑似分散(Pseudo-Distributed)モードで動作する事を確認します。

cd hadoop-2.6.0
hadoop fs -put etc/hadoop input
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar grep input output 'dfs[a-z.]+'
hadoop fs -cat output/*

2.3.YARN(Pseudo-Distributed)モードで動作する所まで…

“etc/hadoop/”フォルダにある”mapred-site.xml.template”を”mapred-site.xml”にコピーして編集します。

cd etc/hadoop/
cp mapred-site.xml.template
mapred-site.xml

mapreduce.framework.nameにはhadoop



          mapreduce.framework.name
          yarn


再び同じようにサンプルプログラムを実行するとyarn上で動作します。

cd hadoop-2.6.0
hadoop fs -put etc/hadoop input
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar grep input output 'dfs[a-z.]+'
hadoop fs -cat output/*

3.雑記

本当はSprkを動作するところまで行きたかったのだけど、思った以上に面倒で挫折。Sparkの機能であるSparkSQLを動作させるにはHiveのインストールが必要で、Hiveをちゃんと動作させるにはMySQLが必要で・・・。CDHやMapR、HDPの有用性を改めて思い知ったのでした。
というわけで、次はCDHをベースにして再スタートしようと思う。でもきっとこの経験は無駄にはならないと思うんだ。CDHを構成する過程で、Hadoopの知識は再び要求されるはずだしね。

Azure上のUbuntuにRemote Desktopで接続する

Microsoft Azure上にインストールしたUbuntuにRemote Desktopで接続する手順を記しておきます。
実は普通のパソコンにインストールしたUbuntuであれば、Remote Desktopで接続できるように設定を変更するのは難しくありません。以下のコマンドを実行するだけです。

sudo apt install ubuntu-desktop
sudo apt install xrdp

ところがMicrosoft Azure上ではこれだけではRemote Desktopで接続することができません。Remote Desktopから接続してログインしても白黒チェックの背景に、×のマウスカーソルが表示された状態・・・素のX-Serverに接続された状態のまま、グラフィカルシェルが起動しません。
これはMicrosoft Azure上の仮想マシンにはビデオアクセラレータボードが提供されていない事が原因です。Ubuntuの標準グラフィカルシェルのUnityは3Dアクセラレータボードが必須となるために、そのままでは上手く機能しないのです。Unityは3Dアクセラレータがない場合には、OpenGLをソフトウェアでエミュレーションして起動するのですが、2Dのアクセラレータすら提供されてませんので起動しません。ではgnomeならどうかというと、フォントのレンダリングエンジンがアクセラレータボードを必要としてしまうために、やはりそのままでは起動しないのです。
これを回避するにはMicrosoft Azure上のUbuntuにxfceやlubuntuといった軽量グラフィカルシェルをインストールする必要があります。ここではUbuntu用の軽量グラフィカルシェルのlubuntuを使って設定したいと思います。

sudo apt install lubuntu-desktop
sudo apt install xrdp

のようにして必要なパッケージをインストールした後、次のコマンドを実行して.xsessionを作成しlubuntuをグラフィカルシェルとして設定します。

echo lxsession -s Lubuntu -e LXDE > ~/.xsession

Microsoft Azureの管理ポータルから仮想マシンを選択して、エンドポイントにRemote Desktopを追加し、通信を許可します。
以上でRemote Desktopによる接続が可能な状態になります。Windows上でRemote Desktopを起動してURLを入力し接続してログインしてみてください。