要学习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
文章评论