本系列文章是学习《Hadoop权威指南 第三版》的笔记和总结。
本文是第一篇,记录了如何在 Ubuntu14.04搭建Hadoop 2.6 伪分布环境,以及运行自带的wordcount实例的详细步骤。
本文假设读者对Hadoop并无太多了解,对Ubuntu的常见操作有一定了解,会对部分操作予以了较为详细的解释或给予有助于更深入理解的链接。
主要分为以下几步:
- 安装Java 8 环境
- 新建Hadoop专用账户
- 配置本地ssh免登陆
- 安装并配置Hadoop伪分布模式
- 测试运行wordcount实例
1. 安装Java 8
Java 8 正式版 于 2014 年 3 月发布,该版本是一个有重大改变的版本,对 JAVA 带来了诸多新特性。详细信息可以参看 Java 8 新特性概述
1.1安装基础开发套件
安装Ubuntu下的基础开发套件,其中包括接下来 1.2 中要用到的 add-apt-repository 命令:
sudo apt-get install software-properties-common
sudo apt-get install python-software-properties
1.2 通过ppa安装Java 8
关于ppa(Personal Package Archives)的解释可以参考什么是Ubuntu PPA以及为什么要用它
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer
# 便捷: sudo apt-get install software-properties-common && sudo apt-get install python-software-properties && sudo apt-get update && sudo apt-get install oracle-java8-installer
1.3 验证安装的Java版本
在根据以上的步骤安装了Java之后,可以通过以下命令检测是否安装成功,及安装的版本:
java -version
1.4 通过PPA配置Java的环境
1.2中添加的Webupd8 ppa 仓库提供了一个包来设置Java的环境变量,通过以下命令安装:
sudo apt-get install oracle-java8-set-default
完成以上步骤后即已经成功的配置了安转Hadoop所需的Java开发环境。
2. 新建Hadoop专用账户
为了营造一个更加独立的Hadoop运行环境,我们可以为系统新建一个Hadoop账户,以后执行Hadoop相关操作时都以该用户的身份登陆。
2.1 新建hadoop用户
sudo useradd -m hadoop #-m参数表示同时创建用户的家目录
sudo usermod -s /bin/bash hadoop # 指定默认登陆shell
sudo passwd hadoop #修改用户默认的密码
# 便捷: export user=heamon7 && sudo useradd -m $user && sudo usermod -s /bin/bash $user && sudo passwd $user
2.2 提升hadoop用户的权限
sudo命令可以让你切换身份来执行命令,其执行过程是:
- 当用户执行sudo时,系统于/etc/sudoers文件中查找该用户是否具有sudo的权限;
- 当用户具有可执行sudo的权限后,便让用户输入用户自己的密码来确认;
- 若密码输入成功,便开始进行sudo后续接得命令(但root执行sudo时不需要输入密码, 若欲切换的身份与执行者的身份相同,则也不需要输入密码);
因此我们需要编辑/etc/sudoers文件,将我们的hadoop用户添加进去:
sudo chmod u+w /etc/sudoers #为当前用户添加对/etc/sudoers文件的写权限,该文件默认root只读
sudo vim /etc/sudoers
在文件中找到这两行:
# User privilege specification
root ALL=(ALL:ALL) ALL
在其下面添加一行
hadoop ALL=(ALL) NOPASSWD:ALL
这里解释一下这一行四个参数的意思,第一个是用户的账号,表示系统中得哪个账户可以使用sudo命令,默认是root,第二个是登录者的来源主机名,默认值root可以来自任何一台网络主机,第三个参数是可切换的身份,默认root可以切换成任何用户,若添加冒号,则表示的是用户组;第四个参数是可执行的命令,需使用绝对路径,默认root可以执行任何命令。其中ALL是特殊的关键字,表示任何主机、用户,或命令。
所以添加上面一行之后,我们的hadoop用户今后也具有和root一样的权限。
最后
最后我们撤销文件的写权限:
sudo chmod u-w /etc/sudoers
#合并操作 sudo chmod u+w /etc/sudoers && sudo vim /etc/sudoers && sudo chmod u-w /etc/sudoers
3. 配置本地ssh免登陆
因为Hadoop是通过ssh管理各个组件,并实现通信的,为了避免每次需要输入密码,我们可以配置本地ssh免登陆。关于ssh的登陆方式及原理可以参考这里 SSH原理与运用
su hadoop
ssh-keygen -t rsa #用RSA算法生成公钥和密钥
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys #授权本机ssh免登陆
可以通过以下命令测试是否配置成功:
ssh localhost
若配置成功,则应该不需要输入密码。接着退出ssh登陆:
exit
上面是假设已经安装了SSH,如果没有安装,可以通过以下命令安装并启动:
sudo apt-get install openssh-server
sudo /etc/init.d/ssh start
4. 安装并配置Hadoop伪分布模式
4.1 下载Hadoop 2.6
这里直接从官网下载Hadoop并放到hadoop用户主目录:
cd ~
wget http://apache.claz.org/hadoop/common/hadoop-2.6.0/hadoop-2.6.0.tar.gz
解压并简化路径:
tar xzf hadoop-2.6.0.tar.gz
mv hadoop-2.6.0 hadoop
4.2. 配置环境变量
首先设置Hadoop运行所需要的环境变量,我们编辑 ~/.bashrc 文件,添加我们的环境变量
#注意此处的路径和你的hadoop文件最后解压存放的位置是一致的
export HADOOP_HOME=/home/hadoop/hadoop
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
然后我们重新导入~/.bashrc文件中的内容到shell中:
$ source ~/.bashrc
接着我们编辑文件$HADOOP_HOME/etc/hadoop/hadoop-env.sh ,为Hadoop设置 Java环境变量:
vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh
修改其中JAVA_HOME的值为:
export JAVA_HOME=/usr/lib/jvm/java-8-oracle #如果按照前面安装Java 8 的方法,则Java应该在此路径,也可以通过 echo $JAVA_HOME 命令来查看
4.3 修改Hadoop的配置文件
Hadoop在目录 $HADOOP_HOME/etc/hadoop 下有很多配置文件,我们在此配置伪分布式,需要修改其中四个配置文件。首先进入配置文件目录:
$ cd $HADOOP_HOME/etc/hadoop
然后编辑 core-site.xml 文件:
vim core-site.xml
在 configuration 标签里添加属性,这里需要添加的是HDFS的NameNode的地址,修改成以下值:
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
接着修改 hdfs-site.xml 文件:
vim hdfs-site.xml
修改为以下值:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>file:///home/hadoop/hadoopdata/hdfs/namenode</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>file:///home/hadoop/hadoopdata/hdfs/datanode</value>
</property>
</configuration>
上面的 dfs.replication 属性是指定副本数量,这里数据只保存一份,默认是三份;而 dfs.name.dir 属性指定的是NameNode在本地的保存地址,dfs.data.dir 属性指定的是DataNode在本地的保存地址。
然后修改 mapred-site.xml 文件,但是默认Hadoop只提供了该配置的模板文件,我们需要复制模板编辑:
cp mapred-site.xml.template mapred-site.xml
vim mapred-site.xml
将该文件修改为以下值:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
从字面意义也可以看出这里指定了MapReduce运行在Hadoop的Yarn框架上。
最后修改 yarn-site.xml 文件:
vim yarn-site.xml
修改为以下值:
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
这里 yarn.nodemanager.aux-services 属性指定了Yarn的NodeManager获取数据的方式是shuffle,关于shuffle的介绍可以看这里MapReduce:详解shuffle过程
4.4 启动Hadoop
在使用HDFS文件系统前,我们需要先将其格式化:
hdfs namenode -format
此时应该有大量日志输出……
然后启动HDFS:
start-dfs.sh
此时应该有大量日志输出……
最后启动Yarn:
start-yarn.sh
此时应该有大量日志输出……
此时通过jps命令,应该可以看到除了jps本身外,还有5个Java进程,如下:
hadoop@ubuntu:~$ jps
14049 Jps
13811 ResourceManager
13459 DataNode
13642 SecondaryNameNode
13931 NodeManager
13342 NameNode
5. 测试运行wordcount实例
Hadoop自带有很多MapReduce的例子,其中一个比较和编程语言领域的 Hello World 齐名的是wordcount,能够统计出文件中每个单词出现的次数,我们可以用wordcount示例测试Hadoop环境。
5.1 上传输入文件到HDFS
首先我们在本地文件系统新建几个文本文件:
cd ~
mkdir input
echo "hello hadoop" > input/f1.txt
echo "hello world" > input/f2.txt
echo "hello wordcount" > input/f3.txt
然后通过以下命令上传这三个文件到HDFS:
hdfs dfs -mkdir -p /home/hadoop/input
hdfs dfs -put input/* /home/hadoop/input
可以通过以下命令查看上传的文件:
hdfs dfs -ls /home/hadoop/input/
5.2 执行wordcount示例
Hadoop 通过把MapReduce代码捆绑到 jar 文件上,然后使用以下命令运行Streaming作业:
hadoop jar <jar> [mainClass] args..
在 目录 $HADOOP_HOME/share/hadoop/mapreduce/ 下有一些运行MapReduce任务所需的已编译好的jar包,其中 hadoop-mapreduce-examples-2.6.0.jar 包含了一些示例程序,wordcount便在其中,我们可以通过下面的命令来运行wordcount:
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar wordcount /home/hadoop/input /home/hadoop/output
注意此处的output文件夹不应该事先存在,应该由hadoop自己创建,否则会执行失败。
5.3 查看运行结果
稍后片刻,待程序运行结束,我们可以通过以下命令来查看产生的结果文件:
hdfs dfs -ls /home/hadoop/output
这里的输出是:
hadoop@ubuntu:~$ hdfs dfs -ls /home/hadoop/output
15/06/18 02:47:10 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 2 items
-rw-r--r-- 1 hadoop supergroup 0 2015-06-18 02:13 /home/hadoop/output/_SUCCESS
-rw-r--r-- 1 hadoop supergroup 32 2015-06-18 02:13 /home/hadoop/output/part-r-00000
可以通过以下命令查看最后的输出结果:
hdfs dfs -cat /home/hadoop/output/part-r-00000
这里看到的结果是:
hadoop@ubuntu:~$ hdfs dfs -cat /home/hadoop/output/part-r-00000
15/06/18 02:49:38 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
hadoop 1
hello 3
java 1
world 1
hadoop@ubuntu:~$
至此,Hadoop的单机伪分布环境搭建成功。
已经按照此方法搭建了三次,写完本文后,又在一个全新的 Ubuntu 14.04 上一步步搭建了一次,一切正常。
最后,学习Hadoop到现在,虽然谈不上已经入门,但感受是:Hadoop入门过程困难的部分不是环境的搭建,而在于出现错误时对日志的分析,和问题的定位,然后还有就是出现性能问题时解决方案的搜寻。
扩展阅读: