根据视频一点一点做的
- hadoop的安装选择
- 安装系统
- 网络设置
- 设置虚拟机的主机映射
- 使用Xshell连接虚拟机
- 1、系统主机映射设置
- 2、Xshell连接
- 其他补丁的安装
- 防火墙
- 配置用户权限
- 创建文件夹
- 卸载自带的JDK
- 克隆虚拟机
- 克隆
- 克隆配置ip
- 克隆配置名称
- 安装hadoop和JDK
- 准备安装包
- 安装JDK
- 添加系统环境变量
- 重新加载环境变量
- 安装hadoop
- 添加系统环境变量
- 重新加载环境变量
- hadoop本地测试
- 完全分布式运行模式(开发重点)
- 分析
- 编写集群分发脚本
- 安全拷贝命令scp
- 远程同步工具rsync
- 编写脚本
- 同步脚本使用方法
- 同步环境变量
- 将同步脚本同步到客户机
- SSH无密登录配置
- 集群配置
- 核心文件配置
- core-site.xml
- hdfs-site.xml
- yarn-site.xml
- MapReduce配置文件
- 同步配置文件
- 群起集群
- 配置workers
- 启动集群
- 集群测试
- 上传文件到集群
- 历程测试
- 结束
hadoop的安装选择
我是在自己电脑上实现的hadoop部署。首先使用的是CentOS 7系统,以及hadoop 3.1.4。还需要下载JDK。还需要一下通讯工具Xshell、Xftp。
安装系统
1、打开VMware Workstations,创建新的虚拟机。在向导中选择自定义。
选择稍后安装操作系统。操作系统选择Linux,版本选择CentOS 7 64位。因为是专门为hadoop创建的虚拟机,所以可以将虚拟机的名称改为hadoop100(代表的是服务器集群的老大)。
位置E:\bigbase\CentOS\hadoop100。处理器的数量和内核数量要根据自己的电脑配置来选择,实际上这种在自己电脑上的小打小闹1个处理器、1个内核数量已经够用了。(后期是可以调整的)
内存选择1GB内存,太大了的话我的电脑带不动。网络类型选择使用网络地址转换,下面就是使用推荐即可。创建新虚拟磁盘,最大磁盘大小可以给50GB,这里的磁盘大小选择了之后只是虚拟机能够使用的最大的空间,主机电脑仍然是可以使用的。将虚拟磁盘拆分成多个文件。磁盘文件位置的储存位置E:\bigbase\CentOS\hadoop100\hadoop100.vmdk。然后下一步、完成即可。
2、双击此选项。
选择准备环节下载的CentOS镜像文件。
3、完成以上操作就可以开启此虚拟机了。
根据提示回车。
选择中文、并继续。
点击更改日期。
设置为和当前相同的时间。
选择软件安装。
我选择的是GNOME桌面安装,如果你是一位linux大佬可以直接选择最小安装,因为作为服务器都只需要最小安装即可。
点击安装位置来添加磁盘分区。
更改为 我要配置分区 并点击完成。
点击 + 来添加挂载点。
点击完成并接受更改。
点击网络和主机名,并打开链接。
完成以上的这些设置就可以点击开始安装了。在安装期间,根据上面的提示设置root密码(000000)。安装完成之后按提示重启虚拟机。
4、重启之后先点击许可证,同意。
更改主机名称,之前在开启网络的时候也可以设置。
最后创建用户。在第一次安装的时候,我是随便创建的,当时想的是所有操作都在root用户下完成。后来发现那样第一不安全、第二也不规范。所以我这里就创建一个名为hadoop的用户名(123456)。
三者都设置完成之后就可以点击完成配置了。
网络设置
1、将VMnet8的子网设置为一个可用的网络端。
2、设置Windows端和VM在同一个网段内。
3、最后就是设置Centos系统的ip,我们需要给它一个固定ip,关闭DHCP。不能让他下次打开的时候还得重新设置。
先进入root权限下。根据提示输入密码。
su root
然后进入网络配置。
vim /etc/sysconfig/network-scripts/ifcfg-ens33
将 BOOTPROTO 改成静态,然后增加IP、网关、DNS地址。
设置完需要重新启动才能生效。
设置虚拟机的主机映射
如下操作是需要在root权限下才可以使用的。
su root //进入root权限
vim /etc/hosts
添加ip和名称的对应
使用Xshell连接虚拟机
1、系统主机映射设置
首先打开文件夹C:\Windows\System32\drivers\etc,
打开hosts文件,在文件最末尾根据自己的需要添加主机映射。添加完成之后保存。如果无法保存可以另存为 .txt文件,然后将原来的hosts文件删除,再将这个**.txt**文件重命名为hosts.txt,然后将后缀名删除。也可以达到同样的效果。
2、Xshell连接
按下图操作,因为有了主机的映射,在图中名称和主句的位置直接输入hadoop100。
输入名称和主机之后不要忙着确定,再点击 用户身份验证输入登录信息。然后就可以确定了。
确定之后就可以连接到虚拟机了,前提是要保证虚拟机是开启状态。
其他补丁的安装
需要安装epel-release(是“红帽系”操作系统提供的额外的软件包,相当于一个软件仓库)
此时应该是root用户,否则的话是无法安装的。
//进入root用户
su root
yum install -y epel-release
另外:
如果安装的是最小操作系统,还需要安装net-tool、vim。
yum install -y net-tools
yum install -y vim
防火墙
一般公司对于内部的访问不需要防火墙,只对于外部的访问开启防火墙。
也就是说在接下来的练习中都属于内部访问,所以可以关闭防火墙。
//关闭防火墙
systemctl stop firewalld
//关闭防火墙自启动
systemctl disable firewalld.service
配置用户权限
给用于大数据集群操作的hadoop用户root权限,以便于后期执行root权限。
//进入配置文档
vim /etc/sudoers
在下图的位置插入图中标注的语句,NOPASSWD 表示每次使用sudo命令的时候不需要输入密码。
创建文件夹
在/opt/目录下创建文件夹,用于后期的软件安装。
cd /opt //进入/opt/目录
sudo mkdir module //创建module用于安装软件
sudo mkdir software //创建software用于存放安装包
sudo chown hadoop:hadoop module/ software/ //修改文件夹的权限
卸载自带的JDK
如果安装的最小系统,就不再需要卸载JDK。
su root
rpm -qa | grep -i java |xargs -n1 rpm -e --nodeps
完成以上操作之后重启虚拟机。
reboot //重启虚拟机
克隆虚拟机
hadoop是建立在集群之上的,这里我选择再克隆出两台虚拟机。克隆之后需要进行的操作是修改主机名称、更改IP地址。
克隆
克隆之前一定要记得关机。
注意这里要选择完整的克隆。因为我们需要的并不是链接。
虚拟机的集群我选择从hadoop102开始命名。以及明确的存放地址。
这里克隆了两台,一共有三台虚拟机来组建集群。
克隆配置ip
参考之前的网络配置一节,将两台克隆机的ip分别配置为192.168.146.102 、 192.168.146.103。
vim /etc/sysconfig/network-scripts/ifcfg-ens33
克隆配置名称
名称分别设置为hadoop102和hadoop103,方便管理和记忆。
vim /etc/hostname
克隆机配置完之后需要reboot重启。三台都重启之后可以试着用Xshell一起连接三台设备。
安装hadoop和JDK
准备安装包
在准备阶段我有提到下载这两个应用的压缩包,现在就需要将压缩包放到虚拟机中。使用的还是开始时提到的Xftp文件传输工具。首先使用Xshell连接hadoop100。然后打开之前创建的software文件夹。进入该文件夹之后,点击上面的小绿图标(如果是不同的Xshell版本所对应的位置也许会不同,也可以用Xftp直接连接)
跳转之后我们只需要将两个压缩包拖进来即可。
安装JDK
首先我们通过命令以确保两个安装包都存在。
将JDK安装到/opt/module/目录下。
tar -zxvf jdk-8u281-linux-x64.tar.gz -C /opt/module/
安装之后,来到该目录可以看到安装的JDK。
添加系统环境变量
进入该目录。
cd /etc/profile.d/ (若无法执行该命令,在前面加sudo)
创建文件
sudo vim my_env.sh
在里面敲入下图的命令,/opt/module/jdk1.8.0_281代表你的JDK安装的目录。可以进到jdk1.8.0_281中用pwd指令来查询。
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_281
export PATH=$PATH:$JAVA_HOME/bin
重新加载环境变量
在添加my_env.sh文件之后我们的java还无法使用,需要把刚才添加的变量加载一下。
source /etc/profile
加载完成之后就可以使用java命令了。
安装hadoop
和JDK安装相同。
tar -zxvf hadoop-3.1.4.tar.gz -C /opt/module/
添加系统环境变量
进入文件。
sudo vim /etc/profile.d/my_env.sh
在里面敲入下图的命令,/opt/module/hadoop-3.1.4代表你的JDK安装的目录。可以进到jdk1.8.0_281中用pwd指令来查询。
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.1.4
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
重新加载环境变量
在添加my_env.sh文件之后我们的hadoop还无法使用,需要把刚才添加的变量加载一下。
source /etc/profile
加载完成之后就可以使用hadoop命令了。
hadoop本地测试
进入到hadoop的目录下,创建一个input目录,在该目录下创建一个word.txt文件。
mkdir input
vim input/word.txt
在该文件里保存一些单词。
回到hadoop目录。输入下面的命令。这里需要注意,input/就是指刚才创建的目录,而没有output目录,所以要在前面加上 ./
这是一个单词计数测试。
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.4.jar wordcount input/ ./output
执行完成之后,就会增加一个output目录。output目录下,_SUCCESS是一个成功标记文件,结果文件保存在part-r-00000中。
打开该文件可以看到计算结果。
完全分布式运行模式(开发重点)
分析
1、准备3台客户机(关闭防火墙、静态IP、主机名称、IP映射)
2、安装JDK
3、配置环境变量
4、安装hadoop
5、配置环境变量
6、配置集群
7、单点启动
8、配置ssh
9、群起并测试集群
编写集群分发脚本
我们已经为hadoop100配置好了JDK和hadoop,但是还没有为另外的两台客户机进行配置。为了配置起来更方便,将编写一个集群分发脚本,也为之后的创造方便。下面的前两步是引导,第3步是正式开始。
安全拷贝命令scp
scp -r $pdir/$fname $user@$host:$pdir/$fname
scp -r $user@$host:$pdir/$fname $pdir/$fname
scp -r $user@$host:$pdir/$fname $user@$host:$pdir/$fname
远程同步工具rsync
rsync -av $pdir/$fname $user@$host:$pdir/$fname
rsync -av $user@$host:$pdir/$fname $pdir/$fname
rsync -av $user@$host:$pdir/$fname $user@$host:$pdir/$fname
编写脚本
在/home/hadoop/bin 目录下创建xsync文件
[hadoop@hadoop100 ~]$ cd /home/hadoop/
[hadoop@hadoop100 ~]$ mkdir bin
[hadoop@hadoop100 ~]$ cd bin
[hadoop@hadoop100 bin]$ vim xsync
在文件里输入一下内容。
#!/bin/bash
#1.判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2.遍历集群所有机器
for host in hadoop102 hadoop103
do
echo ================= $host ==================
#3.遍历所有目录,挨个发送
for file in $@
do
#4.判断文件是否存在
if [ -e $file ]
then
#5.获取父目录
pdir=$(cd -P $(dirname $file); pwd)
#6.获取当前文件的名称
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
保存退出之后改脚本还没有可执行权限。
需要用chmod为其增加可执行权限。
[hadoop@hadoop100 bin]$ chmod 777 xsync
同步脚本使用方法
我们只在hadoop100中安装了JDK和hadoop,现在我们尝试用这个脚本将他同步到hadoop102和hadoop103上。
先来看一下两台客户机的情况。
使用同步命令。
[hadoop@hadoop100 module]$ xsync hadoop-3.1.4/ jdk1.8.0_281/
根据提示输入yes和密码。
同步之后就可以在hadoop102和hadoop103上找到了。
同步环境变量
因为创建环境变量需要root权限,所以前面要加上sudo,而且可执行文件xsync要写明他的路径,因为该文件不是在根目录下,sudo是找不到的。
[hadoop@hadoop100 ~]$ sudo ./bin/xsync /etc/profile.d/my_env.sh
文件同步之后还需要在hadoop102和hadoop103上加载一下。
[hadoop@hadoop102 ~]$ source /etc/profile
[hadoop@hadoop103 ~]$ source /etc/profile
将同步脚本同步到客户机
[hadoop@hadoop100 ~]$ xsync ./bin/xsync
同步完成之后,更改另外两台机器的xsync文件的内容,(主机更改一下)
注解:为什么不直接把三个主机都写上?
我之前就是这么干的,但是我发现同步对于本主机的运行还是相对于其他的主机慢一点,这里也许有其他的解决方法,欢迎探讨。
SSH无密登录配置
配置SSH无密登录的作用:应该注意到在使用同步命令时,经常会提示输入对方的密码。使用配置无密登录来简化此过程。
原理:在A服务器上生成密钥对(ssh-key-gen),将公钥分发给需要去无密登录的B服务器,注意私钥一定要保留。 A服务器ssh用私钥加密访问B服务器,B在接收到之后去所有授权的key中找A的公钥,如果有的话直接用公钥A加密恢复。注意:B拥有A的公钥,表示A能无密访问B。
操作:hadoop100可以无密访问hadoop102/103
在hadoop100的home目录下。
[hadoop@hadoop100 ~]$ cd
[hadoop@hadoop100 ~]$ cd .ssh/
[hadoop@hadoop100 .ssh]$ ssh-keygen -t rsa
执行上述的命令之后,系统会提示,需要三次回车。
查看.ssh中的文件。增加的id_rsa就是其私钥,id_rsa.pub是公钥。
用下面的命令将公钥拷贝到想要无密登录的服务器上。根据提示输入对应的密码。(有个奇葩的设定就是需要把公钥也要给自己拷贝一份)
[hadoop@hadoop100 .ssh]$ ssh-copy-id hadoop100
[hadoop@hadoop100 .ssh]$ ssh-copy-id hadoop102
[hadoop@hadoop100 .ssh]$ ssh-copy-id hadoop103
完成这些操作之后hadoop100可以无密ssh其他服务器,但是其他的服务器还不行,需要将上述的操作也在其他的服务器上操作。这里省略步骤。
说明:以上的ssh配置是针对的用户,也就是只对hadoop用户配置了ssh,而其他用户(比如root)在使用ssh时仍然需要密码,如果有需要的话,可以给每个用户都配置无密登录。
集群配置
3台客户机配置规划
hadoop100 | hadoop102 | hadoop103 | |
HDFS | NameNode、DataNode | DataNode | SecondaryNameNode、DataNode |
YARN | NodeManager | NodeManager、ResourceManager | NodeManager |
核心文件配置
core-site.xml
[hadoop@hadoop100 ~]$ cd $HADOOP_HOME/etc/hadoop
[hadoop@hadoop100 hadoop]$ vim core-site.xml
在<configuration>之间添加下面的代码。
<!-- 指定NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop100:8020</value>
</property>
<!-- 指定hadoop的数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.4/data</value>
</property>
hdfs-site.xml
[hadoop@hadoop100 hadoop]$ vim hdfs-site.xml
在<configuration>之间添加下面的代码。
<!-- nn web端访问地址 -->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop100:9870</value>
</property>
<!-- 2nn web端访问地址 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop103:9868</value>
</property>
yarn-site.xml
[hadoop@hadoop100 hadoop]$ vim yarn-site.xml
在<configuration>之间添加下面的代码。
<!-- 虚拟内存不检查 -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<!-- 指定MR走shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定ResourceManager.hostname -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop102</value>
</property>
<!-- 环境变量继承 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
MapReduce配置文件
[hadoop@hadoop100 hadoop]$ vim yarn-site.xml
在<configuration>之间添加下面的代码。
<!-- 指定MapReduce程序运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
同步配置文件
[hadoop@hadoop100 etc]$ xsync hadoop/
群起集群
配置workers
[hadoop@hadoop100 ~]$ cd /opt/module/hadoop-3.1.4/
[hadoop@hadoop100 hadoop-3.1.4]$ cd etc/hadoop/
[hadoop@hadoop100 hadoop]$ vim workers
删除原有内容,只输入一下三条信息。
同步workers
[hadoop@hadoop102 hadoop]$ xsync workers
启动集群
1、如果集群是第一次启动,需要初始化hdfs。
[hadoop@hadoop100 hadoop-3.1.4]$ hdfs namenode -format
[hadoop@hadoop100 hadoop-3.1.4]$ sbin/start-dfs.sh
2、在准备开始ResourceManager的客户机上启动yarn。
[hadoop@hadoop102 hadoop-3.1.4]$ start-yarn.sh
3、使用jps来查看启动情况。
可以和3台客户机配置规划进行对比,看是否相同。
至此集群启动成功。
集群测试
上传文件到集群
1、在web端查看集群服务器的情况。
输入地址hadoop100:9870。
然后浏览文件系统。
可以看到此时在该服务器系统中是没有文件的。
2、在集群服务器的根目录下创建一个文件夹。
[hadoop@hadoop100 hadoop-3.1.4]$ hadoop fs -mkdir /input
刷新原来的网页,可以看到已创建目录input。接下来再把之前用来测试的word.txt文件传入input中。
[hadoop@hadoop100 hadoop-3.1.4]$ hadoop fs -put $HADOOP_HOME/input/word.txt /input
// -put代表上传 $HADOOP_HOME其实代表就是hadoop的这个程序目录,也就是/opt/module/hadoop-3.1.4/
//上传函数是,前面是要上传的文件,后面是上传到的地址。
点进去就可以看到了。还可以查看里面的内容。
点击Download可以直接下载下来。
历程测试
输入地址hadoop102:8088查看yarn运行情况。
可以看到此时是没有程序在执行的,现在我们来执行一个历程。
[hadoop@hadoop100 hadoop-3.1.4]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.4.jar wordcount /input /output
这里可以看到和本地测试的结果一样。
结束
到此写完了我第一次操作Hadoop。其中不乏有很多问题,所幸都一一解决了。