Hadoop初体验——初试单机及伪分布模式

Hadoop初体验——初试单机及伪分布模式

要学习Hadoop,首先要配置好一个Hadoop的环境。Apache提供了一份快速入门指南,基本上跟着一步一步做就行了。不过JAVA配置部分略微不够详细。

创建Hadoop用户组和用户

这一步不是必须的,只是为了方便权限管理。

首先创建一个叫hadoop的用户组。

$ groupadd hadoop

然后创建一个叫hadoop的用户。网上有些教程指定用户的主目录(HOME_DIR)到/usr下面,其实是错误的。usr并不是user的意思,是Unix System Resources的意思,用来存放系统的应用程序,文档,库等文件。

$ useradd hadoop -m -g hadoop -G users

最后为用户创建一个密码

$ passwd hadoop

安装JAVA

到目前为止,Hadoop的最新版本是2.7.2。按照Hadoop的官方文档,Open JDK 1.7和Oracle JDK 1.7都是支持的,但是Open JDK仅仅在RHEL5/CentOS5上被测试过。也就是说红帽子系是没问题的。不过我们还是安装更为通用的Oracle JDK。

理论上JDK是向后兼容的,所以我们到Oracle下载最新版的JDK 1.8u73。安装JAVA需要用root登录(如果不是安装在”/usr”下面,root也不是必须的)。

首先把下载回来的jdk-8u73-linux-x64.tar.gz放到/usr/local/lib。当然,根据个人的文件组织习惯,也可以选择放在其他目录。

然后用tar命令解压。

$ cd /usr/local/lib
$ tar -zxvf jdk-8u73-linux-x64.tar.gz

如果解压出来的文件不属于当前用户的话,更改所有者。

$ chown -R root:root jdk1.8.0_73

最后删除下载回来的包。

$ rm -f jdk-8u73-linux-x64.tar.gz

为了方便以后版本更换,我们建立一个软链接jdk指向刚才创建的jdk路径

$ ln -s jdk1.8.0_73 jdk
$ ll
total 4
lrwxrwxrwx. 1 root root   11 Feb 11 20:24 jdk -> jdk1.8.0_73
drwxr-xr-x. 8 root root 4096 Jan 30 09:53 jdk1.8.0_73

这时候的JDK其实已经可以用的了。但是一般来说,我们都会设置好JAVA_HOME以及把bin加到环境变量中。下面我们仅仅为新建的hadoop用户配置JAVA环境变量,你也可以根据习惯配置shell的全局环境变量。

打开/home/hadoop下面的.bashrc,然后添加下面的代码。

JAVA_HOME="/usr/local/lib/jdk"
JRE_HOME="${JAVA_HOME}/jre"
CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JRE_HOME/lib
PATH=$JRE_HOME/bin:$JAVA_HOME/bin:$PATH:$HOME/.local/bin:$HOME/bin

export JAVA_HOME
export JRE_HOME
export CLASSPATH
export PATH

这里有段小插曲,让我弄了一整天。一开始的时候我是加在.bash_profile里面的。在单机模式下Hadoop可以正常运行,可是在伪分布模式下,会出现找不到JAVA_HOME的错误。后来才发现,Hadoop是利用ssh来远程执行命令,这时打开的是一个interactive non-login shell,.bash_profile是不会被执行的。最后改到在.bashrc配置环境变量就解决了。

安装rsync

rsync也是Hadoop的所需软件。安装很简单,用yum就行了。

$ yum -y install rsync

安装Hadoop

现在可以说一切就绪,只差Hadoop了。我们在Hadoop的官方网站上下载最新的Hadoop发行版,本例子是2.7.2版。然后用刚才创建的的Hadoop用户上传到系统的某个目录,例如/home/hadoop。(虽然这个目录看起来不是一个好的选择,不过作为练习使用也无妨。真正部署的话最好是在放置在middleware的目录下创建一个hadoop目录)。
然后解压Hadoop。

$ cd /home/hadoop
$ ll
total 207080
-rw-rw-r--. 1 hadoop hadoop 212046774 Feb 11 20:40 hadoop-2.7.2.tar.gz
$ tar -zxvf hadoop-2.7.2.tar.gz

解压后把Hadoop的包给删除。

$ rm -f hadoop-2.7.2.tar.gz

这样,Hadoop就安装了在/home/hadoop/hadoop-2.7.2下面。我们也为hadoop建立一个软链接。

$ ln -s hadoop-2.7.2 hadoop

我们这时可以在.bashrc添加环境变量。注意一点,PATH是已存在的,我们只是在后面把Hadoop的bin和sbin加进去。

HADOOP_HOME="/home/hadoop/hadoop"
PATH=$JRE_HOME/bin:$JAVA_HOME/bin:$PATH:$HOME/.local/bin:$HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

在hadoop用户的一个session里面执行hadoop命令,就可以看到Hadoop的信息了。

单机模式的操作方法

假设我们就在“/home/hadoop”,首先创建一个input目录。

$ mkdir input

接着创建两个文件。

$ cd /home/hadoop/input

$ cat >> file1 << EOF
Apple Orange
Apple
Banana Grape
Watermelon Apple
EOF

$ cat >> file2 << EOF
Apple
Apple Apple
Orange Grape
EOF

然后试一下Hadoop提供的一个例子来抓取文件的匹配项,结果输出到output目录。

$ cd /home/hadoop/hadoop-2.7.2
$ hadoop jar ${HADOOP_HOME}/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep /home/hadoop/input /home/hadoop/output 'Apple'
$ cat ~/output/*
6       Apple

伪分布模式的操作方法

使用如下的配置

/home/hadoop/hadoop-2.7.2/etc/hadoop/core-site.xml:

<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:9000</value>
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/home/hadoop/hadoop-data</value>
  </property>
</configuration>

这里特别说明一下hadoop.tmp.dir。Hadoop的文档给出的定义是所有临时目录的基础目录,默认值是/tmp/hadoop-${user.name}。名字看起来会觉得这个目录只是用来存放临时文件。其实namenode的元数据和datanode的数据都是放在这里。由于/tmp下面的数据很容易被当作临时文件清掉,所以我们把这个基础目录搬到/home/hadoop/hadoop-data

/home/hadoop/hadoop-2.7.2/etc/hadoop/hdfs-site.xml:

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
</configuration>

因为Hadoop用ssh localhost这样的方式来执行远程命令,所以需要设置ssh的互认认证。

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

然后人手访问一次并确认加入hostkey。

$ ssh localhost
The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
ECDSA key fingerprint is **************.
Are you sure you want to continue connecting (yes/no)? y
Please type 'yes' or 'no': yes
Warning: Permanently added '127.0.0.1' (ECDSA) to the list of known hosts.
Last login: Thu Feb 11 22:15:20 2016 from localhost
$ exit

同样的,炮制一下127.0.0.1和0.0.0.0。

$ ssh 127.0.0.1
$ exit
$ ssh 0.0.0.0
$ exit

然后格式化namenode的文件系统:

$ hdfs namenode -format

启动Hadoop守护进程:

$ start-dfs.sh

启动成功后,可以用浏览器访问NameNode的网络接口,例如http://192.168.1.101:50070

为MapReduce任务创建所需的HDFS目录:

$ hdfs dfs -mkdir -p /user/hadoop

复制文件到HDFS:

$ hdfs dfs -put /home/hadoop/input input

执行Hapdoop的示例程序:

$ hadoop jar ${HADOOP_HOME}/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep input output 'Apple'

现在可以查看一下输出:

$ hdfs dfs -cat output/*
6       Apple

下面的命令可以停止Hadoop的守护程序。

$ stop-dfs.sh
SMG
SMG

小小的博主