学习环境清单
ubuntu 16.04
windows 7
hadoop 2.9.0
jdk 8
一 下载安装hadoop
首先创建好目录,用于后续文件的归类存放,执行下述命令
sudo mkdir -p /data/software #用于存放下载的软件
接下来都用默认账户进行操作
1.下载hadoop
访问 http://hadoop.apache.org/releases.html进行下载,我学习的版本是2.9.0,选择binary文件进行下载
下载完成后将hadoop-2.9.0.tar.gz文件传输到ubuntu服务器上.
也可以直接在服务器中输入下面命令直接在服务器上下载
sudo wget http://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.9.0/hadoop-2.9.0.tar.gz -P /data/software
2.下载jdk
hadoop依赖于jdk,所以需要再下载一下jdk。
访问 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html进行下载
下载完成后,传输到服务器上。
3.配置环境变量
此时在/data/software下已经有hadoop和jdk的安装包了,下面需要配置环境变量来让他们正常工作。
先将两个文件解压
tar -zxvf jdk-8u161-linux-x64.tar.gz
tar -zxvf hadoop-2.9.0.tar.gz
解压完成后
由于目录名比较长,为两个目录建立一下软连接,以便后续好设置环境变量
ln -s hadoop-2.9.0/ hadoop
ln -s jdk1.8.0_161/ jdk
使用vim编辑/etc/environment文件sudo vim /etc/environment
,在其中加入如下配置
JAVA_HOME="/data/software/jdk"
HADOOP_HOME="//data/software/hadoop" PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin"
编辑完成之后执行source /etc/environment
命令
然后执行javac
命令和hadoop version
命令,出现如下界面,即证明环境变量安装成功
不过这样当我们重启机器或者切换用户,环境变量将会丢失,需要重新source /etc/environment
可以vim编辑一下/etc/bash.bashrc这个文件sudo vim /etc/bash.bashrc
,在这个文件的末尾追加一下这个命令
这个脚本是每次进入bash都会执行,就省去了我们手动source /etc/environment
这个操作。
二 hadoop简单配置
1. 单机模式(本地模式)
hadoop的默认模式就是单机模式,在/data/software/hadoop/sbin下有一些用于启动的脚本文件。
先直接用start-all.sh启动一下(hadoop启动会使用ssh程序,请确保已经安装,如果没有,执行
sudo apt-get install openssh-server
)
因为单机模式使用的是本地文件系统,可以看到没有启动名称节点和数据节点,而启动的ResourceManager和NodeManager是用于资源调度的,所以单机模式适合用于本地调试mapreduce程序。
执行一下 hadoop fs
命令可以看到如下提示
然后再执行一下hadoop fs -ls /
看一下有什么文件
可以看到hadoop直接使用的就是本地文件系统。
2.伪分布式
单机模式一般只适用于编写mapreduce程序的测试运行,不适合hadoop学习和实际运用。
伪分布式是hadoop在单机环境下模拟运行一个集群,会启动hadoop的所有进程,适合用来学习hadoop的基本组件。
hadoop的主要配置文件都在/data/software/hadoop/etc/hadoop下
下面来修改这4个文件来完成伪分布式的配置
创建目录用于存放hadoop文件系统的数据
sudo mkdir -p /data/hadoop
- core-site.xml(hadoop的核心配置)
vim core-site.xml
fs.defaultFS
hdfs://localhost/
hadoop.tmp.dir
/data/hadoop
- hdfs-site.xml(hdfs的相关配置)
vim hdfs-site.xml
dfs.replication
1
- mapred-site.xml(mapreduce的相关配置)
这个文件目录下默认是没有的,执行cp mapred-site.xml.template mapred-site.xml
获取,然后再编辑
vim mapred-site.xml
mapreduce.framework.name
yarn
- yarn-site.xml(yarn的相关配置)
vim yarn-site.xml
yarn.resourcemanager.hostname
localhost
yarn.nodemanager.aux-services
mapreduce_shuffle
配置完毕,执行hadoop namenode -format
格式化一下文件系统
格式化完成后再执行一下start-all.sh
可以看到所有节点都已经启动了。
通过ifconfig获取一下服务器的ip
这时可以访问一下hdfs的webui来看一下,ip地址:50070。
我的是http://192.168.92.141:50070/
至此,伪分布式配置完成。伪分布式是属于麻雀虽小,但五脏俱全,适合去了解一下hadoop的基本操作。
3.分布式
伪分布式虽然可以满足我们的基本学习,但是在真正环境下,都是多节点协同工作的,伪分布式属于单节点,不利于我们了解多节点下hadoop的工作流程。
我使用了5个节点进行学习
一个namenode名称节点 hadoop01
一个secondeNamenode辅助名称节点 hadoop05
三个datanode数据节点 hadoop02、hadoop03、hadoop04
我根据ubuntu01 克隆了其他四台机器
1. 规划ip
首先我们得规划一下每台机器的ip,然后配置一下hosts
选择虚拟机->设置
可以看到网络为nat模式
再查看虚拟网络编辑器
配置一下子网ip和子网掩码
然后修改每台虚拟机的这个文件,配置一下ip
sudo vim /etc/network/interfaces
auto lo
iface lo inet loopback
auto ens33
iface ens33 inet static
address 192.168.92.141 #ip地址
netmask 255.255.255.0 #子网掩码
gateway 192.168.92.2 #网关
dns-nameservers 192.168.92.2 #dns服务器地址
配置完之后再修改每台主机的/etc/hosts文件,将自己配置的ip地址和自己想的域名映射上去,这样之后就可以用域名进行访问了
2. 修改hadoop配置
对伪分布式下的配置进行修改以变成分布式
- core-site.xml
fs.defaultFS
hdfs://hadoop01:8020/
hadoop.tmp.dir
/data/hadoop
- hdfs-site.xml
dfs.replication
3
dfs.namenode.secondary.http-address
hadoop05:50090
- mapred-site.xml
不做更改
- yarn-site.xml
yarn.resourcemanager.hostname
hadoop01
yarn.nodemanager.aux-services
mapreduce_shuffle
-
slaves
这个配置文件是用来配置所有数据节点的
将数据节点三个hadoop02、hadoop03、hadoop04写入即可
3.同步文件
修改完hadoop配置之后需要将配置同步到所有节点。
如果在每个节点中都去vim编辑修改的话,无疑是一个很让人烦躁的工作。
我们可以通过rsync这个工具把文件同步到其他节点上
在使用这个工具之前,先配置一下免密登录,以便之后不需要每次都去输入密码。我以hadoop01这台机器为主机,执行下述命令,以使hadoop01可以免密登录到hadoop02、hadoop03、hadoop04、hadoop05上
ssh-keygen -t rsa #生成密钥
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop02 #将密钥添加到远程机器hadoop02上
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop03 #将密钥添加到远程机器hadoop03上
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop04 #将密钥添加到远程机器hadoop04上
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop05 #将密钥添加到远程机器hadoop05上
ssh hadoop02 #这样就可以不用输入密码登录到hadoop02上(第一次使用还是需要输入密码的,之后就不需要了)
免密登录配置完成之后,下面我们可以使用如下命令,将指定文件同步到其他机器上
rsync -rvl 文件路径 user@host:文件路径
rsync -rvl /data/hadoop/etc/hadoop/ hadoop@hadoop01:/data/hadoop/etc/hadoop/
我们有四个节点,同步一个文件或者目录也需要执行四次,也是比较麻烦的,根据这个命令的固定格式,我们可以写一个脚本文件,只调用一次就可以完成所有节点的同步。
可以在/usr/local/sbin下建立一个文件,命名为mysync。这个目录默认是配置在环境变量下的,在其下的可执行脚本可以在任意处执行。
sudo touch /usr/local/sbin/mysync
然后给其赋予执行权限
sudo chmod a+x /usr/local/sbin/mysync
脚本内容如下
#!/bin/bash
pcount=$#
#如果没有参数,那么给出提示
if((pcount < 1));then
echo no args
exit;
fi
#如果给出了路径,获取其绝对路径
p1=$1;
#获取文件名
fname=`basename $p1`
#获取目录名
dname=`cd -P $(dirname $p1);pwd`
#获取当前用户
cuser=`whoami`;
#循环节点,同步文件,用于hadoop01节点
for((host=2;host < 6;host=host+1));do
echo ------------- start send hadoop0$host --------------------
rsync -rvl $dname/$fname $cuser@hadoop0$host:$dname
echo ------------- finished hadoop0$host --------------------
done
这样我们只需执行一下 mysync /data/software/hadoop/etc/hadoop
即可将文件同步到所有节点上了
同样的我们根据这个可以再写一个脚本,用于所有节点的命令的调用
sudo touch /usr/local/sbin/mycall
sudo chmod a+x /usr/local/sbin/mycall
脚本内容如下
#!/bin/bash
pcount=$#
if(( pcount < 1));then
echo no args
exit;
fi
for((host=1;host<6;host=host+1));do
echo ------- start operate hadoop0$host -----------
#ssh远程执行命令
ssh hadoop0$host $@
echo ------- finished hadoop@$host ------------
done
这样我们就可以看到每个节点的命令执行情况了
4.启动hadoop
所有节点文件同步完成之后
然后清空一下每台机器下的/data/hadoop目录
rm -rf /data/hadoop
因为克隆过去的时候将之前hadoop01的机器的节点信息带过去了,不删除的话可能会导致启动出错
然后再hadoop namenode -format
格式化一下文件,然后start-all.sh启动hadoop
使用刚才写的脚本,看一下每一个节点启动的进程情况
mycall jps
可以看到hadoop01启动了名称节点和资源管理器节点,由hadoop01进行统一调度,hadoop02、hadoop03、hadoop04三个节点启动了数据节点和节点管理器,用于数据的存储和被调度,hadoop05启动了辅助名称节点,用于同步名称节点的数据。至此,hadoop的分布式搭建完成
可以通过webui查看节点情况
其他的webui端口
secondNamenode 50090
datanode 50075
三 hadoop的文档
可以访问http://hadoop.apache.org/docs/r2.9.0/获取hadoop 2.9.0的文档
对hdfs和mapreduce都有很好的说明
最下方有四个配置文件的所有配置项的说明。