Symfoware

Symfowareについての考察blog

Apache Hadoop 2.2.0 を Debian 7にインストールする

最近、クラスターもののソフトウェアを扱おうとすると、
Apache HadoopというかHadoop Distributed File System(HDFS)を前提にしたものが増えたように感じます。

Prestoや、Sparkとか。

今までなんとなく難しそうだなと思って避けてきたのですが、
HDFSやYARNが面白そうなので、まずはスタンドアロンな環境を作ってみようと思います。


インストールはこちらのサイトを参考にしました。
Setup newest Hadoop 2.x (2.2.0) on Ubuntu




最初は準備編。


Javaのインストール



apt-getでOpenJDKをインストールしました。


# apt-get install -y openjdk-7-jdk




1.7.0_25がインストール出来ました。


# java -version
java version "1.7.0_25"
OpenJDK Runtime Environment (IcedTea 2.3.10) (7u25-2.3.10-1~deb7u1)
OpenJDK 64-Bit Server VM (build 23.7-b01, mixed mode)








hadoopグループ、hduserユーザーの追加



hadoopは別ユーザーで動かすのが作法のようです。
というか、普段面倒がってrootでログインしちゃうほうがマズいきもしますが。

sudoをインストール。
hadoopグループを追加。
作成したhadoopグループにhduserというユーザーを追加します。


# apt-get install sudo

# addgroup hadoop
グループ `hadoop' (グループ ID 1001) を追加しています...
完了。

# adduser --ingroup hadoop hduser
ユーザ `hduser' を追加しています...
新しいユーザ `hduser' (1001) をグループ `hadoop' として追加しています...
ホームディレクトリ `/home/hduser' を作成しています...
`/etc/skel' からファイルをコピーしています...
新しいUNIXパスワードを入力してください:[適当なパスワードを入力]
新しいUNIX パスワードを再入力してください:[適当なパスワードを入力]
passwd: パスワードは正しく更新されました
hduser のユーザ情報を変更中
新しい値を入力してください。標準設定値を使うならリターンを押してください
    フルネーム []: [そのままエンター]
    部屋番号 []: [そのままエンター]
    職場電話番号 []: [そのままエンター]
    自宅電話番号 []: [そのままエンター]
    その他 []: [そのままエンター]
以上で正しいですか? [Y/n] Y

# adduser hduser sudo
ユーザ `hduser' をグループ `sudo' に追加しています...
ユーザ hduser をグループ sudo に追加
完了。




これでユーザーの作成は完了です。





sshの設定




sshの設定を行います。


ローカルに、先ほど作成したユーザー「hduser」がパス無しでssh接続できる必要があります。
まず、sshをインストール。


# apt-get install -y ssh




ユーザーをhduserに変更。


# su - hduser




ssh-keygenでパス無しのキーを作成。


$ ssh-keygen -t rsa -P ''
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hduser/.ssh/id_rsa): [そのままエンター]
Created directory '/home/hduser/.ssh'.
Your identification has been saved in /home/hduser/.ssh/id_rsa.
Your public key has been saved in /home/hduser/.ssh/id_rsa.pub.
The key fingerprint is:
ae:e7:74:41:7f:d5:f2:62:54:4c:8c:21:49:7d:02:49 hduser@debian1
The key's randomart image is:
+--[ RSA 2048]----+
+-----------------+


$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys





sshでlocalhostに接続できるか試してみます。
初回接続のみ、「yes」と入力する必要があります。


$ ssh localhost
The authenticity of host 'localhost (::1)' can't be established.
ECDSA key fingerprint is 64:d4:f3:f7:94:58:f2:4e:af:ce:52:e9:34:ee:8e:79.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
Linux debian1 3.2.0-4-amd64 #1 SMP Debian 3.2.51-1 x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.






一回「yes」としておけば、次からは何も入力せずにssh接続できるはずです。


$ ssh localhost
Linux debian1 3.2.0-4-amd64 #1 SMP Debian 3.2.51-1 x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Dec 31 17:52:43 2013 from localhost





これで下準備は完了です。







Hadoop 2.2.0のダウンロード



http://www.apache.org/dyn/closer.cgi/hadoop/core/
ここを見て、近い場所からダウンロードします。

今回ダウンロードするファイルは「hadoop-2.2.0.tar.gz」です。
作業は引き続きhduserの状態で行いました。


/usr/local/srcに移動してファイルをダウンロード。
展開後できたhadoop-2.2.0を/usr/local/hadoopに移動します。


$ cd /usr/local/src/
$ sudo wget http://ftp.riken.jp/net/apache/hadoop/core/hadoop-2.2.0/hadoop-2.2.0.tar.gz
$ sudo tar zxf hadoop-2.2.0.tar.gz
$ sudo mv hadoop-2.2.0 /usr/local/hadoop




/usr/local/hadoopの所有者をhduserに。


$ cd /usr/local
$ sudo chown -R hduser:hadoop hadoop







Hadoop用環境変数の設定



Hadoopの起動に必要な環境変数の設定を行います。
作業は引き続きhduserの状態で行いました。

.bashrcを編集。


$ vi ~/.bashrc





ファイルの末尾に追加。


#Hadoop variables
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/
export HADOOP_INSTALL=/usr/local/hadoop
export PATH=$PATH:$HADOOP_INSTALL/bin
export PATH=$PATH:$HADOOP_INSTALL/sbin
export HADOOP_MAPRED_HOME=$HADOOP_INSTALL
export HADOOP_COMMON_HOME=$HADOOP_INSTALL
export HADOOP_HDFS_HOME=$HADOOP_INSTALL
export YARN_HOME=$HADOOP_INSTALL
###end of paste





もう一箇所、/usr/local/hadoop/etc/hadoop/hadoop-env.shにも
JAVA_HOMEの記載を行います。


$ vi /usr/local/hadoop/etc/hadoop/hadoop-env.sh




export JAVA_HOMEの箇所を修正。


#export JAVA_HOME=${JAVA_HOME}
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/




最初、ここは変更しなくていいだとと思っていたのですが、「start-dfs.sh」でエラーになります。






記載した内容を反映。


$ source ~/.bashrc





これでhadoop関連のコマンドが使えるようになったはずです。
バージョンを表示してみます。


$ hadoop version
Hadoop 2.2.0
Subversion https://svn.apache.org/repos/asf/hadoop/common -r 1529768
Compiled by hortonmu on 2013-10-07T06:28Z
Compiled with protoc 2.5.0
From source with checksum 79e53ce7994d1628b240f09af91e1af4
This command was run using /usr/local/hadoop/share/hadoop/common/hadoop-common-2.2.0.jar




ちゃんとバージョンが表示されました。






Hadoopの設定ファイル編集



cote-site.xmlを編集します。

$ vi /usr/local/hadoop/etc/hadoop/core-site.xml


configurationタグの間を追加。
hdfs://の後は、なんとなくこのサーバーのIPアドレスにしておきました。
じゃないと、外部から繋がらなそうだったので(未検証)


<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>

    <property>
        <name>fs.default.name</name>
        <value>hdfs://192.168.1.6:9000</value>
    </property>


</configuration>






次はyarn-site.xml。


$ vi /usr/local/hadoop/etc/hadoop/yarn-site.xml




configurationタグの間を追記します。


<?xml version="1.0"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<configuration>

<!-- Site specific YARN configuration properties -->

    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>


</configuration>






次はmapred-site.xml


$ cp /usr/local/hadoop/etc/hadoop/mapred-site.xml.template /usr/local/hadoop/etc/hadoop/mapred-site.xml
$ vi /usr/local/hadoop/etc/hadoop/mapred-site.xml




これもconfigurationタグの中を追記します。


<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>

</configuration>







あともう少し。
次は、HDFSが使用するファイルを作成します。
おそらく、iSCSIみたいな感じでこのファイルの中身が、HDFSを介すと仮想的にHDDっぽく見えるんだと思います。

namenodeとdatanodeの2つのディレクトリを作成する必要があるようです。
今回は、/var/hdsfに作成しました。


$ sudo mkdir -p /var/hdfs/namenode
$ sudo mkdir -p /var/hdfs/datanode
$ sudo chown -R hduser:hadoop /var/hdfs






最後に、hdfs-site.xmlを編集し、HDFS用に作成したディレクトリを記載します。


$ vi /usr/local/hadoop/etc/hadoop/hdfs-site.xml




これもconfigurationタグの中を追記です。


<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/var/hdfs/namenode</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/var/hdfs/datanode</value>
    </property>

</configuration>





これで設定ファイルの修正は完了です。







NameNodeのフォーマット



HDDのフォーマットみたいに、最初にnamenodeをフォーマットする必要があるみたいです。
hduserで作業を行います。


$ hdfs namenode -format



(もりっとログが出力される)


いっぱいログが出ましたがINFOのみfだったので、多分上手く行ったはず。





起動



起動してみます。

Hadoop Distributed File System起動。


$ start-dfs.sh




続いて、Hadoop YARN起動


$ start-yarn.sh




動いたっぽい。



ブラウザでhttp://[サーバーIP]:50070/を表示すると、稼働状態が見れます。

263_01.png





停止



停止は以下のとおり。



$ stop-yarn.sh
$ stop-dfs.sh






dfs.namenode.rpc-address

HDFSへファイルのコピー



HDFSの操作は、


$ hadoop fs [操作]



という形式で行うようです。


ここがとても詳しいです。ほんと助かりました。
HDFSシェルコマンド一覧



HDFSに/userというディレクトリを作成して、内容を表示。


$ hadoop fs -mkdir /user
$ hadoop fs -ls /user




ローカルにあるKEN_ALL.CSVをHDFSにコピー。
再度/userを表示。


$ hadoop fs -put KEN_ALL.CSV /user/
$ hadoop fs -ls /user
Found 1 items
-rw-r--r-- 1 hduser supergroup 17983116 2013-12-31 19:09 /user/KEN_ALL.CSV



ちゃんとコピーできたようです。








SparkからHDFS上のテキストを解析する



最初からこれがやりたかった。

Apache Sparkのクラスタ構築手順(Spark Standalone Mode使用)
ここで構成したSparkクラスタから、先ほど保存した

hdfs://192.168.1.6:9000/user/KEN_ALL.CSV

を読み込んで解析してみます。


sparkのシェルを起動。


# MASTER=spark://192.168.1.3:7077 ./spark-shell





颯爽と接続。


scala> val file = sc.textFile("hdfs://192.168.1.6:9000/user/KEN_ALL.CSV")
scala> file.count()
java.net.ConnectException: Call to 192.168.1.6/192.168.1.6:9000 failed on connection exception: java.net.ConnectException: 接続を拒否されました
    at org.apache.hadoop.ipc.Client.wrapException(Client.java:1099)
    at org.apache.hadoop.ipc.Client.call(Client.java:1075)
    at org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:225)
    at com.sun.proxy.$Proxy8.getProtocolVersion(Unknown Source)
    at org.apache.hadoop.ipc.RPC.getProxy(RPC.java:396)
    at org.apache.hadoop.ipc.RPC.getProxy(RPC.java:379)
    at org.apache.hadoop.hdfs.DFSClient.createRPCNamenode(DFSClient.java:119)






・・・繋がらない。
また後日調べてみます。





関連記事

テーマ:サーバ - ジャンル:コンピュータ

  1. 2013/12/31(火) 19:52:28|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
次のページ