Help us understand the problem. What is going on with this article?

virtualbox、vagrant、ubuntuを使ってhadoopを動かす

More than 3 years have passed since last update.

やること

macにvirtualboxとvagrantを入れてubuntuを動かす、その上でhadoopを動かしてみる。
本読んだりサイト見たりしてても、書いてあることがバラバラでどれを写経していいのか分からないので備忘録として残しておく。

環境

Mac OS X 10.11.3
Vagrant 1.8.1
- ubuntu 14.04
Hadoop 2.7.2

始める前に

後先考えずに行くとhadoopって単語が山ほど出てきてこんがらがるので、判別できるようにする。ユーザー名とかディレクトリ名とか。

  • hdtest1
  • testdir2
  • hduser3

ターミナルの入力も、どの環境で、誰を操作しているのか、混同しないようにする

実践

準備

vagrantでubuntuを用意する。事前にhadoopをダウンロードしておく。

mac$ mkdir hdtest1
mac$ mv hadoo-2.7.2.tar.gz hdtest1/
mac$ cd hdtest1
mac$ vagrant init ubuntu/trusty64
mac$ vagrant up
mac$ vagrant ssh

vagrant$ vi .profile

とりあえずやっておく

.profile
# 本題と関係ないけどメモ
export HISTSIZE=10000
export HISTFILESIZE=10000
export HISTCONTROL=ignoredups
export HISTIGNORE=ls:ll:lla:pwd:history
# 必要に応じて実行
vagrant$ sudo apt-get autoremove -y
vagrant$ sudo apt-get update -y
vagrant$ sudo apt-get upgrade -y
vagrant$ sudo apt-get install -y default-jdk

スタンドアロンモードで動かす

Standalone Operation

# macのディレクトリをマウントできているものとする
vagrant$ cp /vagrant/hadoop-2.7.2.tar.gz .
vagrant$ tar zxvf hadoop-2.7.2.tar.gz
vagrant$ cd hadoop-2.7.2

# ディレクトリ作って、サンプルのデータを用意しているだけ
vagrant$ mkdir testdir2
vagrant$ mkdir testdir2/input
vagrant$ cp etc/hadoop/*.xml testdir2/input

# 実行
vagrant$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep testdir2/input testdir2/output 'dfs[a-z.]+'
Error: JAVA_HOME is not set and could not be found.

# JAVA_HOMEがないと言われた
# リンクではうまく行かなかった気がするので本体を探す
vagrant$ ls /usr/lib/jvm/
default-java  java-1.7.0-openjdk-amd64  java-7-openjdk-amd64

# JAVA_HOMEを設定して実行
vagrant$ JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep testdir2/input testdir2/output 'dfs[a-z.]+'

vagrant$ ls testdir2/output/
part-r-00000  _SUCCESS

vagrant$ cat testdir2/output/part-r-00000 
1   dfsadmin

動いた

擬似分散モードで動かす

Pseudo-Distributed Operation

いろいろ準備

# 専用のユーザを追加する
# useraddでなくてadduserする
vagrant$ adduser hduser3

# hadoopのインストール先を変えて、先のユーザの所有とする
vagrant$ cd ~
vagrant$ sudo mv hadoop-2.7.2 /usr/local/
vagrant$ sudo chown -R hduser3:hduser3 /usr/local/hadoop-2.7.2/

# hduser3でログインする
vagrant$ ssh hduser3@localhost

# 初回はknown_hostsに追加するのを聞かれる
# パスワード入力が面倒なら鍵認証にするが省略

# 先にvagrantユーザーでもやった.profileの追加をしたりした

# 自分用の鍵認証を設定する
hduser3$ ssh-keygen -t rsa -P ''
hduser3$ cat .ssh/id_rsa.pub >> .ssh/authorized_keys
hduser3$ chmod 0600 .ssh/authorized_keys

hduser3$ cd /usr/local/hadoop-2.7.2

設定ファイルを編集する。core-site.xmlは注意。サイトとか本とかと異なるので公式サイトを参照。

etc/hadoop/core-site.xml
<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:9000</value>
  </property>
</configuration>
etc/hadoop/hdfs-site.xml
<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
</configuration>

hdfsのフォーマット

hduser3$ bin/hdfs namenode -format
Error: JAVA_HOME is not set and could not be found.

# またJAVA_HOMEがないと言われた

設定ファイルを編集する

etc/hadoop/hadoop-env.sh
# The java implementation to use.
#export JAVA_HOME=${JAVA_HOME}
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64

再度実行

hduser3$ bin/hdfs namenode -format
hduser3$ sbin/start-dfs.sh 
hduser3$ jps
12244 Jps
11936 DataNode
12135 SecondaryNameNode
11771 NameNode

hduser3$ bin/hdfs dfs -mkdir /user
hduser3$ bin/hdfs dfs -mkdir /user/hduser3
hduser3$ bin/hdfs dfs -put etc/hadoop input

hduser3$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep input output 'dfs[a-z.]+'
...
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000e0ebb000, 104861696, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 104861696 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /usr/local/hadoop-2.7.2/hs_err_pid12520.log

メモリが足りないらしいので、メモリを増やしてくる

hduser3$ exit
vagrant$ exit
mac$ vi Vagrantfile
Vagrantfile
  # config.vm.provider "virtualbox" do |vb|
  #   # Display the VirtualBox GUI when booting the machine
  #   vb.gui = true
  #
  #   # Customize the amount of memory on the VM:
  #   vb.memory = "1024"
  # end
  config.vm.provider "virtualbox" do |vb|
  #   # Customize the amount of memory on the VM:
    vb.memory = "2048"
  end

再度実行

mac$ vagrant ssh
vagrant$ ssh hduser3@localhost

hduser3$ cd /usr/local/hadoop-2.7.2
hduser3$ sbin/start-dfs.sh
hduser3$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep input output 'dfs[a-z.]+'
16/02/16 15:01:44 INFO Configuration.deprecation: session.id is deprecated. Instead, use dfs.metrics.session-id
16/02/16 15:01:44 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
java.net.ConnectException: Call From vagrant-ubuntu-trusty-64/10.0.2.15 to localhost:9000 failed on connection exception: java.net.ConnectException: Connection refused; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused
...

hduser3$ jps
1835 DataNode
2029 SecondaryNameNode
2168 Jps

こけた。何か足りない。

一旦hdfsのディレクトリを削除してやり直す。

hduser3$ sbin/stop-dfs.sh
hduser3$ rm -rf /tmp/hadoop-hduser3/
hduser3$ bin/hdfs namenode -format
hduser3$ sbin/start-dfs.sh
hduser3$ jps
3080 DataNode
3285 SecondaryNameNode
3394 Jps
2909 NameNode

hduser3$ bin/hdfs dfs -mkdir /user
hduser3$ bin/hdfs dfs -mkdir /user/hduser3
hduser3$ bin/hdfs dfs -put etc/hadoop input

hduser3$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep input output 'dfs[a-z.]+'

hduser3$ bin/hdfs dfs -ls /user/hduser3
Found 2 items
drwxr-xr-x   - hduser3 supergroup          0 2016-02-16 15:05 /user/hduser3/input
drwxr-xr-x   - hduser3 supergroup          0 2016-02-16 15:06 /user/hduser3/output

hduser3$ bin/hdfs dfs -get output output
hduser3$ ls output/
part-r-00000  _SUCCESS

hduser3$ cat output/part-r-00000 
4   dfs.class
4   dfs.audit.logger
3   dfs.server.namenode.
2   dfs.period
2   dfs.audit.log.maxfilesize
2   dfs.audit.log.maxbackupindex
1   dfsmetrics.log
1   dfsadmin
1   dfs.servers
1   dfs.replication
1   dfs.file

動いた。

備考

  • 仮想マシンのメモリ割当を先にやっておくと、途中の手戻りがない
  • adduserじゃなくてuseraddの場合、コマンドにオプションをつけないとホームディレクトリが作成されなかったりする(debian系の場合)
  • 作業ディレクトリを外にするなら、hadoopインストールディレクトリのパスを通したりする
  • start-dfs.shすると http://localhost:50070/ でwebのインターフェイスも参照できるが、Vagrantfileでport forwardの設定が必要

参考サイト

Hadoop

MapReduce Tutorial

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした