序章

このチュートリアルでは、DigitalOceanでのHadoopクラスターのセットアップについて説明します。 Hadoopソフトウェアライブラリは、基本的なプログラミングモデルを活用して、サーバークラスター全体に分散した方法で大規模なデータセットを処理できるようにするApacheフレームワークです。 Hadoopが提供するスケーラビリティにより、単一のサーバーから数千台のマシンにスケールアップできます。 また、アプリケーション層での障害検出を提供するため、高可用性サービスとして障害を検出して処理できます。

このチュートリアルで使用する4つの重要なモジュールがあります。

  • Hadoop Common は、他のHadoopモジュールをサポートするために必要な共通のユーティリティとライブラリのコレクションです。
  • Hadoop分散ファイルシステム(HDFS)は、 Apache組織で述べられているように、フォールトトレラント性の高い分散ファイルシステムであり、特にコモディティハードウェアで実行して大規模なデータを処理するように設計されています。セット。
  • Hadoop YARN は、ジョブのスケジューリングとクラスターリソースの管理に使用されるフレームワークです。
  • Hadoop MapReduce は、大規模なデータセットを並列処理するためのYARNベースのシステムです。

このチュートリアルでは、4つのDigitalOceanドロップレットでHadoopクラスターをセットアップして実行します。

前提条件

このチュートリアルには、次のものが必要です。

  • root以外のsudoユーザーが設定された4つのUbuntu16.04ドロップレット。 この設定がない場合は、 Ubuntu 16.04を使用したサーバーの初期設定の手順1〜4に従ってください。 このチュートリアルでは、ローカルマシンのSSHキーを使用していることを前提としています。 Hadoopの言語に従って、これらのドロップレットを次の名前で参照します。

    • hadoop-master
    • hadoop-worker-01
    • hadoop-worker-02
    • hadoop-worker-03
  • さらに、サーバーの初期セットアップと、最初のドロップレットのステップ1および2 (下記)の完了後に、DigitalOceanスナップショットを使用することもできます。

これらの前提条件が整ったら、Hadoopクラスターのセットアップを開始する準備が整います。

ステップ1—各液滴のインストールセットアップ

4つのドロップレットのにJavaとHadoopをインストールします。 各ドロップレットで各ステップを繰り返したくない場合は、ステップ2の最後にあるDigitalOceanスナップショットを使用して、初期インストールと構成を複製できます。

まず、利用可能な最新のソフトウェアパッチでUbuntuを更新します。

  1. sudo apt-get update && sudo apt-get -y dist-upgrade

次に、Ubuntu用のヘッドレスバージョンのJavaを各ドロップレットにインストールしましょう。 「ヘッドレス」とは、グラフィカルユーザーインターフェイスなしでデバイス上で実行できるソフトウェアを指します。

  1. sudo apt-get -y install openjdk-8-jdk-headless

各ドロップレットにHadoopをインストールするには、Hadoopがインストールされるディレクトリを作成しましょう。 私たちはそれを呼ぶことができます my-hadoop-install 次に、そのディレクトリに移動します。

  1. mkdir my-hadoop-install && cd my-hadoop-install

ディレクトリを作成したら、Hadoopリリースリストから最新のバイナリをインストールしましょう。 このチュートリアルの時点で、最新のものは Hadoop 3.0.1.

:これらのダウンロードはミラーサイトを介して配布されることに注意してください。最初に、GPGまたはSHA-256を使用して改ざんされていないか確認することをお勧めします。

選択したダウンロードに満足したら、 wget 次のような、選択したバイナリリンクを使用したコマンド。

  1. wget http://mirror.cc.columbia.edu/pub/software/apache/hadoop/common/hadoop-3.0.1/hadoop-3.0.1.tar.gz

ダウンロードが完了したら、を使用してファイルの内容を解凍します。 tar、Ubuntu用のファイルアーカイブツール:

  1. tar xvzf hadoop-3.0.1.tar.gz

これで、初期構成を開始する準備が整いました。

ステップ2—Hadoop環境構成を更新する

ドロップレットノードごとに、設定する必要があります JAVA_HOME. 次のファイルをnanoまたは選択した別のテキストエディタで開いて、更新できるようにします。

  1. nano ~/my-hadoop-install/hadoop-3.0.1/etc/hadoop/hadoop-env.sh

次のセクションを更新します。 JAVA_HOME 位置しています:

hadoop-env.sh
...
###
# Generic settings for HADOOP
###

# Technically, the only required environment variable is JAVA_HOME.
# All others are optional.  However, the defaults are probably not
# preferred.  Many sites configure these options outside of Hadoop,
# such as in /etc/profile.d

# The java implementation to use. By default, this environment
# variable is REQUIRED on ALL platforms except OS X!
# export JAVA_HOME=

# Location of Hadoop.  By default, Hadoop will attempt to determine
# this location based upon its execution path.
# export HADOOP_HOME=
...

このように見えるために:

hadoop-env.sh
...
###
# Generic settings for HADOOP
###

# Technically, the only required environment variable is JAVA_HOME.
# All others are optional.  However, the defaults are probably not
# preferred.  Many sites configure these options outside of Hadoop,
# such as in /etc/profile.d

# The java implementation to use. By default, this environment
# variable is REQUIRED on ALL platforms except OS X!
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

# Location of Hadoop.  By default, Hadoop will attempt to determine
# this location based upon its execution path.
# export HADOOP_HOME=
...

また、Hadoopとそのモジュールを実行するために、いくつかの環境変数を追加する必要があります。 これらはファイルの最後に追加して、次のようにする必要があります。 sammy sudoのroot以外のユーザーのユーザー名になります。

:クラスタードロップレット全体で異なるユーザー名を使用している場合、特定のドロップレットごとに正しいユーザー名を反映するために、このファイルを編集する必要があります。

hadoop-env.sh
...
#
# To prevent accidents, shell commands be (superficially) locked
# to only allow certain users to execute certain subcommands.
# It uses the format of (command)_(subcommand)_USER.
#
# For example, to limit who can execute the namenode command,
export HDFS_NAMENODE_USER="sammy"
export HDFS_DATANODE_USER="sammy"
export HDFS_SECONDARYNAMENODE_USER="sammy"
export YARN_RESOURCEMANAGER_USER="sammy"
export YARN_NODEMANAGER_USER="sammy"

この時点で、ファイルを保存して終了できます。 次に、次のコマンドを実行してエクスポートを適用します。

  1. source ~/my-hadoop-install/hadoop-3.0.1/etc/hadoop/hadoop-env.sh

とともに hadoop-env.sh スクリプトが更新されて供給された場合、Hadoop分散ファイルシステム(HDFS)のデータディレクトリを作成して、関連するすべてのものを保存する必要があります HDFS ファイル。

  1. sudo mkdir -p /usr/local/hadoop/hdfs/data

それぞれのユーザーでこのファイルの権限を設定します。 ドロップレットごとに異なるユーザー名を使用している場合は、それぞれのsudoユーザーに次の権限を付与するようにしてください。

  1. sudo chown -R sammy:sammy /usr/local/hadoop/hdfs/data

DigitalOceanスナップショットを使用してこれらのコマンドをドロップレットノード全体に複製する場合は、ここでスナップショットを作成し、このイメージから新しいドロップレットを作成できます。 これに関するガイダンスについては、DigitalOceanスナップショットの概要を読むことができます。

4つすべてのUbuntuドロップレットで上記の手順を完了したら、ノード間でこの構成を完了することができます。

ステップ3—各ノードの完全な初期構成

この時点で、更新する必要があります core_site.xml ドロップレットノードのすべての4のファイル。 個々のドロップレット内で、次のファイルを開きます。

  1. nano ~/my-hadoop-install/hadoop-3.0.1/etc/hadoop/core-site.xml

次の行が表示されます。

core-site.xml
...
<configuration>
</configuration>

次のXMLのようにファイルを変更して、各ドロップレットのそれぞれのIPをプロパティ値の中に含めます。 server-ip 書かれました。 ファイアウォールを使用している場合は、ポート9000を開く必要があります。

core-site.xml
...
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://server-ip:9000</value>
    </property>
</configuration>

サーバーの4つすべてについて、関連するドロップレットIPで上記の書き込みを繰り返します。

これで、サーバーノードごとにすべての一般的なHadoop設定を更新する必要があり、SSHキーを介してノードを接続し続けることができます。

ステップ4—ノードごとにSSHを設定する

Hadoopが正しく機能するためには、マスターノードとワーカーノードの間にパスワードなしのSSHを設定する必要があります( masterworker 参照するHadoopの言語です primarysecondary サーバー)。

このチュートリアルでは、マスターノードは次のようになります。 hadoop-master ワーカーノードはまとめて次のように呼ばれます hadoop-worker、ただし、合計で3つあります( -01, -02、 と -03). まず、マスターノードに公開鍵と秘密鍵のペアを作成する必要があります。マスターノードは、IPアドレスがに属するノードになります。 hadoop-master.

にいる間 hadoop-master ドロップレット、次のコマンドを実行します。 を押します enter キーの場所のデフォルトを使用するには、を押します enter 空のパスフレーズを使用するには2回:

  1. ssh-keygen

ワーカーノードごとに、マスターノードの公開鍵を取得して各ワーカーノードにコピーする必要があります。 authorized_keys ファイル。

を実行してマスターノードから公開鍵を取得します catid_rsa.pub あなたのにあるファイル .ssh フォルダ、コンソールに印刷するには:

  1. cat ~/.ssh/id_rsa.pub
  2. ```
  3. Now log into each worker node Droplet, and open the `authorized_keys` file:
  4. ```custom_prefix(sammy@hadoop-worker$)
  5. [environment fourth]
  6. nano ~/.ssh/authorized_keys
  7. ```
  8. You’ll copy the master node’s public key — which is the output you generated from the `cat ~/.ssh/id_rsa.pub` command on the master node — into each Droplet’s respective `~/.ssh/authorized_keys` file. Be sure to save each file before closing.
  9. When you are finished updating the 3 worker nodes, also copy the master node’s public key into its own `authorized_keys` file by issuing the same command:
  10. ```custom_prefix(sammy@hadoop-master$)
  11. [environment second]
  12. nano ~/.ssh/authorized_keys
  13. ```
  14. On `hadoop-master`, you should set up the `ssh` configuration to include each of the hostnames of the related nodes. Open the configuration file for editing, using nano:
  15. ```custom_prefix(sammy@hadoop-master$)
  16. [environment second]
  17. nano ~/.ssh/config
  18. ```
  19. You should modify the file to look like the following, with relevant IPs and usernames added.
  20. ```
  21. [environment second]
  22. [label config]
  23. Host hadoop-master-server-ip
  24. HostName hadoop-example-node-server-ip
  25. User sammy
  26. IdentityFile ~/.ssh/id_rsa
  27. Host hadoop-worker-01-server-ip
  28. HostName hadoop-worker-01-server-ip
  29. User sammy
  30. IdentityFile ~/.ssh/id_rsa
  31. Host hadoop-worker-02-server-ip
  32. HostName hadoop-worker-02-server-ip
  33. User sammy
  34. IdentityFile ~/.ssh/id_rsa
  35. Host hadoop-worker-03-server-ip
  36. HostName hadoop-worker-03-server-ip
  37. User sammy
  38. IdentityFile ~/.ssh/id_rsa
  39. ```
  40. Save and close the file.
  41. From the `hadoop-master`, SSH into each node:
  42. ```custom_prefix(sammy@hadoop-master$)
  43. [environment second]
  44. ssh sammy@hadoop-worker-01-server-ip
  45. ```
  46. Since it’s your first time logging into each node with the current system set up, it will ask you the following:
  47. ```
  48. [environment second]
  49. [secondary_label Output]
  50. are you sure you want to continue connecting (yes/no)?
  51. ```
  52. Reply to the prompt with `yes`. This will be the only time it needs to be done, but it is required for each worker node for the initial SSH connection. Finally, log out of each worker node to return to `hadoop-master`:
  53. ```custom_prefix(sammy@hadoop-worker$)
  54. [environment fourth]
  55. logout
  56. ```
  57. Be sure to **repeat these steps** for the remaining two worker nodes.
  58. Now that we have successfully set up passwordless SSH for each worker node, we can now continue to configure the master node.
  59. ## Step 5 — Configure the Master Node
  60. For our Hadoop cluster, we need to configure the HDFS properties on the master node Droplet.
  61. While on the master node, edit the following file:
  62. ```custom_prefix(sammy@hadoop-master$)
  63. [environment second]
  64. nano ~/my-hadoop-install/hadoop-3.0.1/etc/hadoop/hdfs-site.xml
  65. ```
  66. Edit the `configuration` section to look like the XML below:
  67. ```xml
  68. [environment second]
  69. [label hdfs-site.xml]
  70. ...
  71. <configuration>
  72. <property>
  73. <name>dfs.replication</name>
  74. <value>3</value>
  75. </property>
  76. <property>
  77. <name>dfs.namenode.name.dir</name>
  78. <value>file:///usr/local/hadoop/hdfs/data</value>
  79. </property>
  80. </configuration>
  81. ```
  82. Save and close the file.
  83. We’ll next configure the `MapReduce` properties on the master node. Open `mapred.site.xml` with nano or another text editor:
  84. ```custom_prefix(sammy@hadoop-master$)
  85. [environment second]
  86. nano ~/my-hadoop-install/hadoop-3.0.1/etc/hadoop/mapred-site.xml
  87. ```
  88. Then update the file so that it looks like this, with your current server’s IP address reflected below:
  89. ```xml
  90. [environment second]
  91. [label mapred-site.xml]
  92. ...
  93. <configuration>
  94. <property>
  95. <name>mapreduce.jobtracker.address</name>
  96. <value>hadoop-master-server-ip:54311</value>
  97. </property>
  98. <property>
  99. <name>mapreduce.framework.name</name>
  100. <value>yarn</value>
  101. </property>
  102. </configuration>
  103. ```
  104. Save and close the file. If you are using a firewall, be sure to open port 54311.
  105. Next, set up YARN on the master node. Again, we are updating the configuration section of another XML file, so let’s open the file:
  106. ```custom_prefix(sammy@hadoop-master$)
  107. [environment second]
  108. nano ~/my-hadoop-install/hadoop-3.0.1/etc/hadoop/yarn-site.xml
  109. ```
  110. Now update the file, being sure to input your current server’s IP address:
  111. ```xml
  112. [environment second]
  113. [label yarn-site.xml]
  114. ...
  115. <configuration>
  116. <!-- Site specific YARN configuration properties -->
  117. <property>
  118. <name>yarn.nodemanager.aux-services</name>
  119. <value>mapreduce_shuffle</value>
  120. </property>
  121. <property>
  122. <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
  123. <value>org.apache.hadoop.mapred.ShuffleHandler</value>
  124. </property>
  125. <property>
  126. <name>yarn.resourcemanager.hostname</name>
  127. <value>hadoop-master-server-ip</value>
  128. </property>
  129. </configuration>
  130. ```
  131. Finally, let’s configure Hadoop’s point of reference for what the master and worker nodes should be. First, open the `masters` file:
  132. ```custom_prefix(sammy@hadoop-master$)
  133. [environment second]
  134. nano ~/my-hadoop-install/hadoop-3.0.1/etc/hadoop/masters
  135. ```
  136. Into this file, you’ll add your current server’s IP address:
  137. ```
  138. [environment second]
  139. [label masters]
  140. hadoop-master-server-ip
  141. ```
  142. Now, open and edit the `workers` file:
  143. ```custom_prefix(sammy@hadoop-master$)
  144. [environment second]
  145. nano ~/my-hadoop-install/hadoop-3.0.1/etc/hadoop/workers
  146. ```
  147. Here, you’ll add the IP addresses of each of your worker nodes, underneath where it says `localhost`.
  148. ```
  149. [environment second]
  150. [label workers]
  151. localhost
  152. hadoop-worker-01-server-ip
  153. hadoop-worker-02-server-ip
  154. hadoop-worker-03-server-ip
  155. ```
  156. After finishing the configuration of the `MapReduce` and `YARN` properties, we can now finish configuring the worker nodes.
  157. ## Step 6 — Configure the Worker Nodes
  158. We’ll now configure the worker nodes so that they each have the correct reference to the data directory for HDFS.
  159. On **each worker node**, edit this XML file:
  160. ```custom_prefix(sammy@hadoop-worker$)
  161. [environment fourth]
  162. nano ~/my-hadoop-install/hadoop-3.0.1/etc/hadoop/hdfs-site.xml
  163. ```
  164. Replace the configuration section with the following:
  165. ```
  166. [label hdfs-site.xml]
  167. [environment fourth]
  168. <configuration>
  169. <property>
  170. <name>dfs.replication</name>
  171. <value>3</value>
  172. </property>
  173. <property>
  174. <name>dfs.datanode.data.dir</name>
  175. <value>file:///usr/local/hadoop/hdfs/data</value>
  176. </property>
  177. </configuration>
  178. ```
  179. Save and close the file. Be sure to replicate this step on **all three** of your worker nodes.
  180. At this point, our worker node Droplets are pointing to the data directory for HDFS, which will allow us to run our Hadoop cluster.
  181. ## Step 7 — Run the Hadoop Cluster
  182. We have reached a point where we can start our Hadoop cluster. Before we start it up, we need to format the HDFS on the master node. While on the master node Droplet, change directories to where Hadoop is installed:
  183. ```custom_prefix(sammy@hadoop-master$)
  184. [environment second]
  185. cd ~/my-hadoop-install/hadoop-3.0.1/
  186. ```
  187. Then run the following command to format HDFS:
  188. ```custom_prefix(sammy@hadoop-master$)
  189. [environment second]
  190. sudo ./bin/hdfs namenode -format
  191. ```
  192. A successful formatting of the namenode will result in a lot of output, consisting of mostly `INFO` statements. At the bottom you will see the following, confirming that you’ve successfully formatted the storage directory.
  193. ```
  194. [environment second]
  195. [secondary_label Output]
  196. ...
  197. 2018-01-28 17:58:08,323 INFO common.Storage: Storage directory /usr/local/hadoop/hdfs/data has been successfully formatted.
  198. 2018-01-28 17:58:08,346 INFO namenode.FSImageFormatProtobuf: Saving image file /usr/local/hadoop/hdfs/data/current/fsimage.ckpt_0000000000000000000 using no compression
  199. 2018-01-28 17:58:08,490 INFO namenode.FSImageFormatProtobuf: Image file /usr/local/hadoop/hdfs/data/current/fsimage.ckpt_0000000000000000000 of size 389 bytes saved in 0 seconds.
  200. 2018-01-28 17:58:08,505 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
  201. 2018-01-28 17:58:08,519 INFO namenode.NameNode: SHUTDOWN_MSG:
  202. /************************************************************
  203. SHUTDOWN_MSG: Shutting down NameNode at hadoop-example-node/127.0.1.1
  204. ************************************************************/
  205. ```
  206. Now, start the Hadoop cluster by running the following scripts (be sure to check scripts before running by using the `less` command):
  207. ```custom_prefix(sammy@hadoop-master$)
  208. [environment second]
  209. sudo ./sbin/start-dfs.sh
  210. ```
  211. You’ll then see output that contains the following:
  212. ```
  213. [environment second]
  214. [secondary_label Output]
  215. Starting namenodes on [hadoop-master-server-ip]
  216. Starting datanodes
  217. Starting secondary namenodes [hadoop-master]
  218. ```
  219. Then run YARN, using the following script:
  220. ```custom_prefix(sammy@hadoop-master$)
  221. [environment second]
  222. ./sbin/start-yarn.sh
  223. ```
  224. The following output will appear:
  225. ```
  226. [environment second]
  227. [secondary_label Output]
  228. Starting resourcemanager
  229. Starting nodemanagers
  230. ```
  231. Once you run those commands, you should have daemons running on the master node and one on each of the worker nodes.
  232. We can check the daemons by running the `jps` command to check for Java processes:
  233. ```custom_prefix(sammy@hadoop-master$)
  234. [environment second]
  235. jps
  236. ```
  237. After running the `jps` command, you will see that the `NodeManager`, `SecondaryNameNode`, `Jps`, `NameNode`, `ResourceManager`, and `DataNode` are running. Something similar to the following output will appear:
  238. ```
  239. [environment second]
  240. [secondary_label Output]
  241. 9810 NodeManager
  242. 9252 SecondaryNameNode
  243. 10164 Jps
  244. 8920 NameNode
  245. 9674 ResourceManager
  246. 9051 DataNode
  247. ```
  248. This verifies that we’ve successfully created a cluster and verifies that the Hadoop daemons are running.
  249. In a web browser of your choice, you can get an overview of the health of your cluster by navigating to:
  250. ```
  251. http://hadoop-master-server-ip:9870
  252. ```
  253. If you have a firewall, be sure to open port 9870. You’ll see something that looks similar to the following:
  254. ![Hadoop Health Verification](https://assets.digitalocean.com/articles/hadoop-cluster/hadoop-verification.png)
  255. From here, you can navigate to the `Datanodes` item in the menu bar to see the node activity.
  256. ### Conclusion
  257. In this tutorial, we went over how to set up and configure a Hadoop multi-node cluster using DigitalOcean Ubuntu 16.04 Droplets. You can also now monitor and check the health of your cluster using Hadoop’s DFS Health web interface.
  258. To get an idea of possible projects you can work on to utilize your newly configured cluster, check out Apache’s long list of projects [powered by Hadoop](https://wiki.apache.org/hadoop/PoweredBy).