[hadoop]Hadoop 小象安装测试在 Ubuntu

[hadoop]Hadoop 小象安装测试在 Ubuntu


小象要开始跑

在了解大概 hadoop 能做什么之后,就来安装试试吧。Michael G. Noll 写了几份非常好的教学。 这里就按照他的教学,一步步重做一遍。就从他的 Running Hadoop On Ubuntu Linux (Single-Node Cluster) 开始让小象跑。

http://www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-single-node-cluster/

而我这篇是让我自己这个新手能够不忘记我是怎么安装的笔记。

安装 ubuntu 在 vmware 里,完成 vmware-tool 安装。

这一步是原来教学没有的步骤。为了大家可以在公司、或自家的电脑试用,所以用 vmware 装一个虚拟电脑。首先要注意,vmware-tool 的安装跟 vmware 版本有关。vmware-tool 最重要的是可以让 host 系统 及 guest 系统用“拖拉”、“复制贴上”的方式,交换文件及文字。我使用的版本是 vmware 8,在装好 ubuntu 12.04 之后,vmware-tool 可使用随附的 8.8.0 版安装。(vmware 7 可装 ubuntu 11.04 配合 6.0.2。)在确认完 vmware 版本之后,就不用担心之后会有问题了。

到 http://www.ubuntu.com/download/desktop 下载 12.04 LTS,下载 iso 档。选择 desktop 是因为有桌面可用,比较方便。

将 ubuntu 安装完毕,先加入一个使用者 hduser,这是之后专门执行 hadoop 程序的使用者。

$ sudo addgroup hadoop

$ sudo adduser --ingroup hadoop hduser

hduser 要加入 sudoer 名单中,才能安装 vmware-tool。

先用安装者的账号执行

$ sudo visudo

再把 hduser (ALL:ALL)=ALL 加在 root (ALL:ALL)=ALL 底下。

或把 hduser 加到 admin 的 group 里面。(首先要确定有 admin 的 group。可参考)

$ sudo usermod -g admin hduser

然后切换使用者为 hduser。

接下来,在 vmware 的“VM”菜单,按下“install VMware tool”,在虚拟电脑里,会 mount 一个文件。点两下,会使用 archie manager 开启文件,把里面的目录“vmware-tools-distrib”拖到桌面上。

启动 terminal,切换到 ~/Desktop/vmware-tools-distrib,执行

$ sudo ./vmware-install.pl

中间经过一连串的问题,都是按 enter 通过。如果有因为任何的错误而停下,都是因为 vmware-tools 的版本与 ubuntu 版本不合导致。我花了很多冤枉时间,才知道是版本问题。vmware 出 vmware-tools 程序一定是可以用才释出,把版本弄对就不用白花时间。

安装完毕,重开机一次。

设定 SSH

因为 hadoop 使用 ssh 管理它的 node,接下来要设定 ssh。

首先,产生 ssh key。

$ su - hduser # 换成 root 权限
[email protected]:~$ 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:
db:35:f4:ae:e3:79:48:d3:95:fa:2d:22:a8:43:5c:dd [email protected]
The key's randomart image is:
...
[email protected]:~$

第二行是产生一个不用密码的 RSA key pari。这样就不用 hadoop 与 node 沟通时,都要人去打密码。

再来,把新产生的 key 放到已认证的 key 中。

[email protected]:~$ cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys

因为 desktop 版没有 ssh server,因此,要加装 openssh-server

[email protected]:~$ sudo apt-get install openssh-server

测试一下能不能连上 ssh server。因为这版的 server 默认使用 ECDSA 所以,ssh 的命令要强迫使用 rsa。

[email protected]:~$ ssh -oHostKeyAlgorithms='ssh-rsa' localhost

The authenticity of host 'localhost (127.0.0.1)' can't be established.
RSA key fingerprint is a3:99:7f:2b:8e:92:34:20:59:2f:2d:10:94:c9:60:74.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (RSA) to the list of known hosts.
Welcome to Ubuntu 12.10 (GNU/Linux 3.5.0-17-generic i686)

* Documentation:  https://help.ubuntu.com/

222 packages can be updated.
52 updates are security updates.

Last login: Mon Dec 24 00:56:30 2012 from localhost
[email protected]:~$ exit
logout
Connection to localhost closed.
[email protected]:~$

另一个解决办法是产生 ECDSA,并使用 ECDSA。

[email protected]:~$ ssh-keygen -t ecdsa -P ""
Generating public/private ecdsa key pair.
Enter file in which to save the key (/home/hduser/.ssh/id_ecdsa):
Your identification has been saved in /home/hduser/.ssh/id_ecdsa.
Your public key has been saved in /home/hduser/.ssh/id_ecdsa.pub.
The key fingerprint is:
27:64:63:de:16:4b:97:f4:58:96:11:46:6d:a2:24:7e [email protected]
The key's randomart image is:

因为后续的过程中,按照这个教学的话,hadoop 会自然的使用 ECDSA,所以,还是要用 ECDSA 的方式把 key 加到 .ssh/authorized_keys 里面。

[email protected]:~$ cat $HOME/.ssh/id_ecdsa.pub >> $HOME/.ssh/authorized_keys

Noll 先生说,如果有遇到问题,要检查一下在 /etc/ssh/sshd_config 里:

  • PubkeyAuthentication 应该是 yes。
  • AllowUsers 如果有打开,则要把 hduser 加进去。
  • 如果 ssh server 的设定有异动,要强迫 ssh server 重载设定。 $ sudo /etc/init.d/ssh reload

安装 java

java 至少要用到 ,我们可以使用命令来检查 java 版本

[email protected]:~$ java -version
The program 'java' can be found in the following packages:
* default-jre
* gcj-4.6-jre-headless
* gcj-4.7-jre-headless
* openjdk-7-jre-headless
* openjdk-6-jre-headless
Try: sudo apt-get install

新安装的 ubuntu 12.04 desktop LTS 没有装 java runtime。要自己安装。

[email protected]:~$ sudo apt-get install default-jre

[email protected]:~$ java -version
java version "1.7.0_09"
OpenJDK Runtime Environment (IcedTea7 2.3.3) (7u9-2.3.3-0ubuntu1~12.10.1)
OpenJDK Client VM (build 23.2-b09, mixed mode, sharing)
[email protected]:~$

安装小象

从 Apache 下载 hadoop,目前稳定版是 1.0.4,到 http://www.apache.org/dyn/closer.cgi/hadoop/common/ 它会给你最近的 mirror 站点。下载 1.0.4 版的 hadoop-1.0.4.tar.gz。

 image

使用 firefox 下载,默认会放到 ~/Downloads 里面。点两下 hadoop-1.0.4.tar.gz,archive manager 会打开该压缩档,把里面的目录 hadoop-1.0.4 拉到桌面,改名为 hadoop,再移到 /usr/local 里面去。使用命令

[email protected]:~$ sudo mv Desktop/hadoop/ /usr/local/
[sudo] password for hduser:
[email protected]:~$ ls -l /usr/local
total 36
drwxr-xr-x  2 root   root   4096 Oct 17 07:56 bin
drwxr-xr-x  2 root   root   4096 Oct 17 07:56 etc
drwxr-xr-x  2 root   root   4096 Oct 17 07:56 games
drwxr-xr-x 14 hduser hadoop 4096 Dec 24 01:09 hadoop
drwxr-xr-x  2 root   root   4096 Oct 17 07:56 include
drwxr-xr-x  4 root   root   4096 Oct 17 07:59 lib
lrwxrwxrwx  1 root   root      9 Dec 13 10:10 man -> share/man
drwxr-xr-x  2 root   root   4096 Oct 17 07:56 sbin
drwxr-xr-x  7 root   root   4096 Oct 17 08:00 share
drwxr-xr-x  2 root   root   4096 Oct 17 07:56 src

接下来要设定 .bashrc。(ubuntu 默认是用 bash。)使用命令开启 .bashrc 来改。

[email protected]:~$ gedit .bashrc

在文件的最后加进以下的设定。(原文中的 HADOOP_HOME 的设定已经要改用 HADOOP_PREFIX。)

################# for hadoop settings ##############
# Set Hadoop-related environment variables
export HADOOP_PREFIX=/usr/local/hadoop

# Set JAVA_HOME (we will also configure JAVA_HOME directly for Hadoop later on)
export JAVA_HOME=/usr/lib/jvm/default-java

# Some convenient aliases and functions for running Hadoop-related commands
unalias fs &> /dev/null
alias fs="hadoop fs"
unalias hls &> /dev/null
alias hls="fs -ls"

# If you have LZO compression enabled in your Hadoop cluster and
# compress job outputs with LZOP (not covered in this tutorial):
# Conveniently inspect an LZOP compressed file from the command
# line; run via:
#
# $ lzohead /hdfs/path/to/lzop/compressed/file.lzo
#
# Requires installed 'lzop' command.
#
lzohead () {
    hadoop fs -cat $1 | lzop -dc | head -1000 | less
}

# Add Hadoop bin/ directory to PATH
export PATH=$PATH:$HADOOP_PREFIX/bin

其他使用者要用 hadoop 的,也要更新这个 ~/.bashrc

设定 hadoop -- 1

第一个要处理的是 hadoop-env.sh

[email protected]:~$ gedit /usr/local/hadoop/conf/hadoop-env.sh

把里面的

# export JAVA_HOME=/usr/lib/j2sdk1.5-sun

的底下,加上

export JAVA_HOME=/usr/lib/jvm/default-java

再来要把 ipv6 关掉。文件的最后加上

export HADOOP_OPTS=-Djava.net.preferIPv4Stack=true

设定 hadoop -- 2

接下来是 core-site.xml,这是设定 hadoop 要在真实文件系统的位置。因此,先建立一个目录给 hadoop 使用。

[email protected]:~$ sudo mkdir -p /app/hadoop/tmp
[sudo] password for hduser:
[email protected]:~$ ls -l /app/hadoop/
total 4
drwxr-xr-x 2 root root 4096 Dec 24 02:02 tmp
[email protected]:~$ sudo chown hduser:hadoop /app/hadoop/tmp
[email protected]:~$ ls -l /app/hadoop/
total 4
drwxr-xr-x 2 hduser hadoop 4096 Dec 24 02:02 tmp
[email protected]:~$ sudo chmod 750 /app/hadoop/tmp
[email protected]:~$ ls -l /app/hadoop/
total 4
drwxr-x--- 2 hduser hadoop 4096 Dec 24 02:02 tmp
[email protected]:~$

把下列的文字,加到 /usr/local/hadoop/conf/core-site.xml 的 ... 中间:


  hadoop.tmp.dir
  /app/hadoop/tmp
  A base for other temporary directories.



  fs.default.name
  hdfs://localhost:54310
  The name of the default file system.  A URI whose
  scheme and authority determine the FileSystem implementation.  The
  uri's scheme determines the config property (fs.SCHEME.impl) naming
  the FileSystem implementation class.  The uri's authority is used to
  determine the host, port, etc. for a filesystem.

把下列的文字,加到 /usr/local/hadoop/conf/mapred-site.xml 的 ... 中间:


  mapred.job.tracker
  localhost:54311
  The host and port that the MapReduce job tracker runs
  at.  If "local", then jobs are run in-process as a single map
  and reduce task.
  

把下列的文字,加到 /usr/local/hadoop/conf/hdfs-site.xml 的 ... 中间:


  dfs.replication
  1
  Default block replication.
  The actual number of replications can be specified when the file is created.
  The default is used if replication is not specified in create time.
  

如果要对配置文件多了解,可以到以下连结查看:

http://wiki.apache.org/hadoop/GettingStartedWithHadoop

http://hadoop.apache.org/core/docs/current/api/overview-summary.html

格式化 HDFS 的文件系统

Noll 先生在这非常强调,不要对正在使用中的系统做格式化的动作。该系统数据会消失。

我们这个新系统要启用,则必须先格式化文件系统。

[email protected]:~$ /usr/local/hadoop/bin/hadoop namenode -format

结果如下:

[email protected]:~$ /usr/local/hadoop/bin/hadoop namenode -format
12/12/24 02:14:23 INFO namenode.NameNode: STARTUP_MSG:
/
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = ubuntu/127.0.1.1
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 1.0.4
STARTUP_MSG:   build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.0 -r 1393290; compiled by 'hortonfo' on Wed Oct  3 05:13:58 UTC 2012
/
12/12/24 02:14:23 INFO util.GSet: VM type       = 32-bit
12/12/24 02:14:23 INFO util.GSet: 2% max memory = 19.33375 MB
12/12/24 02:14:23 INFO util.GSet: capacity      = 2^22 = 4194304 entries
12/12/24 02:14:23 INFO util.GSet: recommended=4194304, actual=4194304
12/12/24 02:14:24 INFO namenode.FSNamesystem: fsOwner=hduser
12/12/24 02:14:24 INFO namenode.FSNamesystem: supergroup=supergroup
12/12/24 02:14:24 INFO namenode.FSNamesystem: isPermissionEnabled=true
12/12/24 02:14:24 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100
12/12/24 02:14:24 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)
12/12/24 02:14:24 INFO namenode.NameNode: Caching file names occuring more than 10 times
12/12/24 02:14:25 INFO common.Storage: Image file of size 112 saved in 0 seconds.
12/12/24 02:14:25 INFO common.Storage: Storage directory /app/hadoop/tmp/dfs/name has been successfully formatted.
12/12/24 02:14:25 INFO namenode.NameNode: SHUTDOWN_MSG:
/
SHUTDOWN_MSG: Shutting down NameNode at ubuntu/127.0.1.1
/
[email protected]:~$

启动 cluster

到了要启动系统的时候,使用命令:

[email protected]:~$ /usr/local/hadoop/bin/start-all.sh
看到以下的 log 就代表成功了。

[email protected]:~$ /usr/local/hadoop/bin/start-all.sh
starting namenode, logging to /usr/local/hadoop/libexec/../logs/hadoop-hduser-namenode-ubuntu.out
localhost: starting datanode, logging to /usr/local/hadoop/libexec/../logs/hadoop-hduser-datanode-ubuntu.out
localhost: starting secondarynamenode, logging to /usr/local/hadoop/libexec/../logs/hadoop-hduser-secondarynamenode-ubuntu.out
starting jobtracker, logging to /usr/local/hadoop/libexec/../logs/hadoop-hduser-jobtracker-ubuntu.out
localhost: starting tasktracker, logging to /usr/local/hadoop/libexec/../logs/hadoop-hduser-tasktracker-ubuntu.out
[email protected]:~$

利用 jps 来看是否已启动

Noll 先生说可以使用 jps 来看启动是否成功。但新装的 ubuntu 没有这东西。

The program 'jps' can be found in the following packages:
* openjdk-6-jdk
* openjdk-7-jdk
Ask your administrator to install one of them

于是,安装 openjdk-7-jdk

sudo apt-get install openjdk-7-jdk

再试一次

[email protected]:~$ jps
7516 TaskTracker
7287 SecondaryNameNode
7839 DataNode
12038 Jps
6491 NameNode
6901 JobTracker
[email protected]:~$

也可以用 netstat 来看监听的 port 是否有开。

[email protected]:~$ sudo netstat -plten | grep java

停止 single-node cluster

使用这个命令:

[email protected]:~$ /usr/local/hadoop/bin/stop-all.sh

会看到:

[email protected]:~$ /usr/local/hadoop/bin/stop-all.sh
stopping jobtracker
localhost: Agent admitted failure to sign using the key.
localhost: stopping tasktracker
stopping namenode
localhost: Agent admitted failure to sign using the key.
localhost: stopping datanode
localhost: Agent admitted failure to sign using the key.
localhost: no secondarynamenode to stop
[email protected]:~$

原篇照我的方式走,真的太长。因此下一篇来验证,这个系统真的可以用。

分享