Hadoop完全分布式集群环境搭建及测试
准备工作
三台虚拟机,其中:一台主机,两台节点。
需要提前下载好的文件:
linuxmint-18.3-cinnamon-64bit.iso
jdk-9.0.1_linux-x64_bin.tar
hadoop-2.9.0.tar.gz
文中提到因为jdk 9.0版本不兼容所导致的问题,本人在后面搭建 hive 的时候将jdk的版本降到8.0,不再提示警告,且hive也不会报错,后面学习的同学注意了,不要以为版本越新越好。
linux虚拟机安装操作流程
第一步: 装机
点击 vmware workstation 左上角 文件 → 新建虚拟机 然后一路点击 下一步 即可。
第二步: 配置虚拟机
- 点击 编辑虚拟机设置 ;
- 内存、处理器、硬盘 可根据自己主机的配置和个人需求去配置,如不懂,可不更改。;
- 点击 CD/DVD(SATA) 自动检测, 右边 连接 选项,选择 使用ISO镜像文件, 点击 浏览 选择你已经下载好的镜像文件。该文件的存储路径最好是不会轻易删除的那种,建议放D盘自定义英文目录下。然后点击 确定,配置完成。
第三步: 安装系统
- 回到主界面,点击 开启此虚拟机,进入安装步骤。
- 系统进入主界面后,此时系统是未安装的,双击桌面的驱动器图标,第一个界面可设置系统语言,然后一路点击 continue 即可,安装完成后提示是否重启,点击 Restart Now 重启即可。
安装完成后,进入系统之后,你会发现几个问题
- 虚拟机不自动适应软件窗口,不能与客户机之间复制粘贴,以拖动的方式移动文件。
- 没有中文输入法
- 使用
sudo apt-get install xx
命令安装软件连接失败
我们先解决后面两个问题(最好按下面这个顺序):
-
使用
sudo apt-get install xx
命令安装软件,总是提示连接失败。解决方法是更改软件源,具体操作如下:
点击 菜单(menu) → 系统设置(system settings) → 软件源(software sources), 将 mirrors 下面的 main 和 base 两个选项改成中国的网址。我的 main 选择 TUNA,base 选择一个速度最快的即可,我选择的是阿里云的网址;然后点击 更新缓存(update the cache)。等待安装完成即可,如弹出异常,不用管,关闭就好了。使用
sudo apt-get install git
测试安装,应该是可以成功的。 -
安装中文输入法
点击 菜单(menu) → 软件管理(software manager),搜索 “input”,在结果中找到 “fcitx” ,点击 安装(Install) → continue → 输入密码,等待安装完成即可。提示:如没有先更改软件源,这里安装可能会失败。
关于输入法的配置,网上有很多方法,这里不作重复了。重启之后会提示选择文件系统的语言,建议选择keep old names。
-
关于vmware tools的安装问题
最后这个问题最容易遇到,也最麻烦,不出现则已,一出现折磨死人,尤其是对于强迫症患者。
先不管,不影响系统运行。
另一种方式是建立共享文件夹,添加主机共享文件夹目录,在linux中的对应目录是/mnt/hgfs/共享的文件夹名称
完全分布式hadoop集群安装
1. 准备三台虚拟机,含Linux系统。
在vmware workstation里面,将上面我们所安装好的系统克隆两次,最终得到三台虚拟机。
-
启动三台虚拟机,对刚刚克隆出来的虚拟机进行重命名,上面的名字是你在vmware里看到的计算机名,我们要更改的是它们真正的hostname,也就是命令窗口中@符号后面那个。
进入系统,打开命令行,输入命令sudo vim /etc/hostname
按 shift + i 进行编辑,修改好之后按 ESC 键退出编辑,然后依次按 shift + :、 wq 保存并退出;
最后重启系统。(以上是关于vim的操作命令,大家可查阅其他博客文档。)
修改了hostname之后的命令窗口如下:
2. 修改 /etc/hosts
文件,使得三台虚拟机之间能够互ping。
- 输入
ifconfig
命令,依次查看三台虚拟机的IP地址,如下:
- 查看好之后,依次在三台虚拟机的命令行中输入
sudo vim /etc/hosts
,修改的命令同上一步,注意注释第二行,如下:
- 修改好之后,用下面的命令测试三台虚拟机之间是否可以互ping
ping 192.168.19.197 //检测是否可以ping通自己的IP
ping ubuntu-01 //检测是否可以ping通自己的hostname
ping 192.168.19.198 //检测是否可以ping通ubuntu-01-node1的IP
ping ubuntu-01-node1 //检测是否可以ping通ubuntu-01-node1的hostname
ping 192.168.19.199 //检测是否可以ping通ubuntu-01-node2的IP
ping ubuntu-01-node2 //检测是否可以ping通ubuntu-01-node2的hostname
3. 建立hadoop运行帐号
-
即为hadoop集群专门设置一个用户组及用户,设置hadoop用户组命令:
sudo groupadd hadoop
-
添加一个had_user用户,此用户属于hadoop用户组。
sudo useradd –s /bin/bash –d /home/had_user –m had_user –g hadoop
-
设置用户had_user登录密码
sudo passwd had_user
usermod -G sudo had_user
# 将had_user用户分配到sudo组下,使之拥有sudo命令权限。 -
切换到had_user用户中,之后的操作都是在该用户下进行
su had_user
上述3个虚机结点均需要进行以上步骤来完成hadoop运行帐号的建立,建好之后如下:
4. SSH无密码验证配置
SSH主要通过RSA算法来产生公钥与私钥,在数据传输过程中对数据进行加密来保障数据的安全性和可靠性,公钥部分是公共部分,网络上任一结点均可以访问,私钥主要用于对数据进行加密,以防他人盗取数据。总而言之,这是一种非对称算法,想要**还是非常有难度的。Hadoop集群的各个结点之间需要进行数据的访问,被访问的结点对于访问用户结点的可靠性必须进行验证,hadoop采用的是ssh的方法通过**验证及数据加解密的方式进行远程安全登录操作,当然,如果hadoop对每个结点的访问均需要进行验证,其效率将会大大降低,所以才需要配置SSH免密码的方法直接远程连入被访问结点,这样将大大提高访问效率。
-
安装 SSH
在root用户下输入命令:
sudo apt-get install ssh
-
生成公钥、私钥(注意:用rsa,而不是dsa,dsa可能会导致无密码登录失败。)
ssh-****** -t rsa -P ''
提示输入保存**的路径,直接enter使用默认值就好了,如下:
1 为私钥路径, 2 为公钥路径。-
紧接着把id_rsa.pub追加到授权的key里面去,这个步骤是必须的,过程如下:
cat id_dsa.pub >> authorized_keys #把id_rsa.pub追加到授权的key里面去 ls -l # 查看文件权限命令 chmod 600 authorized_keys #设置该文件的权限
-
测试是否可以用ssh无密码登录本地localhost
ssh localhost
在welcome前面未提示输入密码,则成功,如果不成功,则不行,需要搜索相关文档解决这个问题,才能进行下一步。 在另外两个节点虚拟机上重复以上步骤。
-
ssh无密码登录两个子节点
重复一下:我的主节点是 ubuntu-01,子节点分别是:ubuntu-01-node1, ubuntu-01-node2
分别在两个子节点的命令终端执行下面的命令:scp aaa@qq.com01:~/.ssh/id_rsa.pub ./ubuntu-01_rsa.pub cat ubuntu-01_rsa.pub >> authorized_keys
完成之后,回到主节点 ubuntu-01 主机的命令窗口,执行下面的命令测试能否无密码登录。
ssh ubuntu-01-node1
可以看到未提示输入密码,说明已经成功了。对于节点2 ubuntu-01-node2 重复执行以上步骤并进行测试,成功再进行下一步。
我遇到的坑: 第一次生成密码时按照某博客的截图输入命令
ssh-****** -t dsa -P ''
,后面测试发现不行,找了好多方法,包括权限配置,关闭防火墙,更改配置文件等等都不见生效,后面干脆删除原来生成的文件,重新使用ssh-****** -t rsa -P ''
生成**,就没有出错了,一次成功。
5. jdk、hadoop安装
-
在had_user用户的根目录下创建文件夹local,jdk、hadoop都安装在这个文件夹下面
sudo had_user # 切换用户 cd ~ # 切换到用户根目录 mkdir /local # 新建local文件夹 chown had_user:hadoop /home/had_user/local # 修改目录拥有者,用户名:用户组
-
将下载好的jdk、和hadoop文件复制到 local 目录下并解压
cp /mnt/hgfs/linux/jdk-9.0.1_linux-x64_bin.tar.gz /home/had_user/local/jdk.tar.gz // 前者是我windows系统共享虚拟机的文件目录,后者是刚刚新建的文件目录// tar zxvf jdk.tar.gz # 解压到当前目录 rm jdk.tar.gz # 删除压缩包 cp /mnt/hgfs/linux/hadoop-2.9.0.tar.gz /home/had_user/local/hadoop.tar.gz // 前者是我windows系统共享虚拟机的文件目录,后者是刚刚新建的文件目录// tar zxvf hadoop.tar.gz # 解压到当前目录 rm hadoop.tar.gz # 删除压缩包
完成后,查看local目录
至此,文件复制已经完成。 -
环境变量配置
打开并编辑配置文件~/.bashrc(不是/etc/profile)
vim ~/.bashrc
按图中所示,输入下面三行:
export JAVA_HOME=/local/jdk-9.0.1 export HADOOP_HOME=/local/hadoop-2.9.0 export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
接下来执行
source ~/.bashrc
使文件生效通过查看版本来检查是否配置成功,命令如下:
6. Hadoop的环境配置
集群/分布式模式需要修改 /local/hadoop-2.9.0/etc/hadoop 中的5个配置文件: slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml
注意:关于文件的配置,网上不同的博客配置大同小异,可能完全按照步骤的,最终却不成功,下面这个是我一开始按照某些博客失败之后不断尝试配置文件最终得到了我的正确结果的版本,读者如照搬之后失败,请继续参考多个博客,能看懂官方文档的看官方文档比较靠谱。
slaves
slaves文件中记录的主机都会作为DataNode使用,根据表1所示,3台主机都有DataNode,所以将3台主机的主机名都写入该文件中,配置如下:
执行sudo vim slaves
,添加三台主机的主机名:-
core-site.xml
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://ubuntu-01:9000</value> // 注意主机名,不要用localhost,可以用主机的ip </property> <property> <name>hadoop.tmp.dir</name> <value>/local/hadoop-2.9.0/tmp</value> // 注意路径 </property> <property> <name>fs.trash.interval</name> <value>10080</value> </property> </configuration>
-
hdfs-site.xml
<configuration> <property> <name>dfs.namenode.secondary.http-address</name> <value>ubuntu-01:50090</value> </property> <property> <name>dfs.replication</name> <value>3</value> // 这个数字根据集群的个数(主机+节点)来定 </property> <property> <name>dfs.namenode.name.dir</name> <value>/home/had_user/local/hadoop-2.9.0/hdfs/name</value> // 注意路径 </property> <property> <name>dfs.datanode.data.dir</name> <value>/home/had_user/local/hadoop-2.9.0/hdfs/data</value> // 注意路径 </property> </configuration>
-
mapred-site.xml
没有这个文件的,需要先执行cp mapred-site.xml.template mapred-site.xml
复制一份,然后再sudo vim mapred-site.xml
。<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> // 有些博客还添加了其他配置,我不知道有没有影响,所以没加 </configuration>
-
yarn-site.xml
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.resourcemanager.hostname</name> // 没加这部分的时候,访问 8088 看不到子节点 <value>ubuntu-01</value> // 主机名,不要用localhost </property> </configuration>
以上操作在主节点 ubuntu-01 上执行,然后格式化 namenode,只格式化一次,执行下面的命令:
hadoop namenode -format
注意:上面只要出现 “successfully formatted” 就表示成功了。
7. 子节点配置
打开另外两台虚拟机,通过下面的命令将环境复制到子节点中,注意:子节点需要进行第5步的配置更改。
scp -r jdk-9.0.1 aaa@qq.com-01-node1:~/local/jkd-9.0.1
scp -r jdk-9.0.1 aaa@qq.com-01-node2:~/local/jkd-9.0.1
scp -r hadoop-2.9.0 aaa@qq.com-01-node1:~/local/hadoop-2.9.0
scp -r hadoop-2.9.0 aaa@qq.com-01-node2:~/local/hadoop-2.9.0
再次提醒:记得在两个子节点上配置 ~/.bashrc
文件,配置好之后,按上面的方法测试一下。
8. 启动集群
进入主机ubuntu-01的下面的目录 local/hadoop-2.9.0/sbin
,执行 ./start-all.sh
, 注意查看下面的关键字眼,警告信息是由于jdk 9.0版本导致,暂为找到解决方案,可以忽略。
分别在三台机器中输入 jps
,查看是否启动成功,我的如下:
我感觉主要是要关注 NameNode、DataNode、DataNode
9. 浏览器访问 8088 和 50070
在虚拟机或windows主机浏览器中输入 192.168.19.197:8088
,注意IP地址,是一开始分配好的ubuntu-01的IP。
再访问 192.168.19.197:50070
试试,页面会自动跳转
如果两个界面都能看到节点信息,说明hadoop的分布式集群环境基本已经安装好了。
10. 测试集群
为确保我们安装的集群能够正常使用,我们还需要对hadoop集群进行测试。
-
向hadoop集群系统提交第一个mapreduce任务(wordcount)
进入本地hadoop目录(/usr/hadoop)
bin/hdfs dfs -mkdir -p /data/input
在虚拟分布式文件系统上创建一个测试目录/data/input
hdfs dfs -put README.txt /data/input
将当前目录下的README.txt 文件复制到虚拟分布式文件系统中bin/hdfs dfs-ls /data/input
查看文件系统中是否存在我们所复制的文件
结果如下:(警告信息可以忽略,网查了一下,是 jdk9.0 版本的问题。)
-
向hadoop提交单词统计任务
-
进入jar文件目录,执行下面的指令。
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount /data/input /data/output/result
注意留意上面命令中空格的地方
查看 result,结果在 result 下面的 part-r-00000 中
hdfs dfs -cat /data/output/result/part-r-00000
看到结果和上面类似的话,到这里说明我们的hadoop分布式集群环境搭建成功。
-
11. 关闭集群
进入 local/hadoop-2.9.0/sbin
目录,执行下面的命令:
./stop-all.sh
即可。
最后附上linux系统解压文件常用的操作命令
压缩/解压命令
.tar
解包:tar xvf FileName.tar
打包:tar cvf FileName.tar DirName
(注:tar是打包,不是压缩!)
———————————————
.gz
解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz
压缩:gzip FileName
.tar.gz 和 .tgz
解压:tar zxvf FileName.tar.gz
压缩:tar zcvf FileName.tar.gz DirName
———————————————
.bz2
解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩: bzip2 -z FileName
.tar.bz2
解压:tar jxvf FileName.tar.bz2
压缩:tar jcvf FileName.tar.bz2 DirName
———————————————
.bz
解压1:bzip2 -d FileName.bz
解压2:bunzip2 FileName.bz
压缩:未知
.tar.bz
解压:tar jxvf FileName.tar.bz
压缩:未知
———————————————
.Z
解压:uncompress FileName.Z
压缩:compress FileName
.tar.Z
解压:tar Zxvf FileName.tar.Z
压缩:tar Zcvf FileName.tar.Z DirName
———————————————
.zip
解压:unzip FileName.zip
压缩:zip FileName.zip DirName
———————————————
.rar
解压:rar x FileName.rar
压缩:rar a FileName.rar DirName
———————————————
.lha
解压:lha -e FileName.lha
压缩:lha -a FileName.lha FileName
———————————————
.rpm
解包:rpm2cpio FileName.rpm | cpio -div
———————————————
.deb
解包:ar p FileName.deb data.tar.gz | tar zxf -
下一篇: MongoDB数据库