大数据–实分布部署Hadoop
系统及环境
网络环境:处于局域网下的部分机器(>=4)
系统版本:win10较新版本,支持子系统
子系统版本:ubuntu18.04
其他软件:Xshell6,Xftp6
实验要求:在多台机器上安装hadoop,配置完成后,可以在完成官方demo的wordcount功能,实现其他功能
下载安装wsl(ubuntu)
- 系统要求:win10较新版本
- 修改电脑名(用以在ubuntu中分辨是哪台电脑,这一步推荐在后面其他节点修改配置里做):右击此电脑-属性-更改设置-计算机描述(ustc+序号)-更改-计算机名(ustc+序号)-稍后重启
- 关闭防火墙:控制面板-网络和Internet-网络和共享中心-wd防火墙(左下角)-启用或关闭wd防火墙-稍后重启
- 开启wsl功能:打开控制面板-程序-启用或关闭windows功能-勾选适用于Linux的Windows子系统-重启电脑
- 打开Microsoft Store,搜索ubuntu,选择18.04下载
- 先创建ustc用户,密码也为ustc(只是为了好记)
- 创建hadoop用户
1 2 3 4 5
| $sudo useradd -m hadoop -s /bin/bash # 创建hadoop用户,并使用/bin/shell作为shell $sudo passwd hadoop #为hadoop用户设置密码 $sudo adduser hadoop sudo #为hadoop用户增加管理员权限 $su - hadoop #切换当前用户为hadoop $sudo apt-get update #更新hadoop用户的apt,方便后面安装ssh
|
安装ssh并设置免密码登录
- 安装ssh,生成公钥和私钥
1 2 3 4 5 6 7
| $ sudo apt-get install openssh-server #安装SSH server $ cd /home/hadoop # 进入hadoop下 $ ssh-keygen -t rsa #一直回车,会在用户文件夹下生成.ssh文件夹,文件夹下生成三个文件,不要添加sudo,否在会报错 $ sudo /etc/init.d/ssh start #启动ssh服务 若启动报错,则将没有的文件对应生成一下 $ sudo ssh-keygen -t rsa -f /etc/xxx $ ps -e |grep ssh #查看ssh进程,显示有ssh服务则为成功
|
- 生成密钥和公钥并将公钥复制给其他机器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| 免密登录过程简介:本机生成公钥id_rsa.pub(上一步已经做好),将生成的公钥上传到目标机器上的授权文件authorized_keys,本机即可免密登录目标机
创建授权文件:将id_rsa.pub的内容给authorized_keys,若没有auth文件则会自动生成一个 $ cd /home/hadoop/.ssh #进入用户文件夹下面的.ssh文件夹 $ cat id_rsa.pub>>authorized_keys
给.ssh文件夹和authorized_keys授权,权限如下 $cd /home/hadoop/.ssh #已经在这一步请不用操作 $sudo chmod 600 authorized_keys $cd ..#回到上一层目录 $sudo chmod 700 .ssh $cd ..#回到上一层目录 $sudo chmod 700 hadoop #将.ssh上级目录授权为700
修改配置 $sudo vim /etc/ssh/sshd_config Port xxx (可以修改成其他统一端口号) PermitRootLogin yes 将下面配置更改为yes PasswordAuthentication yes(不修改会报权限问题) $ sudo /etc/init.d/ssh restart #重启ssh服务
将客户端的公钥~/.ssh/id_rsa.pub通过ssh-copy-id -i拷贝到服务器(只需要将master节点的公钥复制给其他datanode节点,其他的可以不用复制) $ ssh-copy-id -i ~/.ssh/id_rsa.pub user@xxx.xxx.xxx.xxx -p xxxx user代表Linux用户,xxx.xxx.xxx.xxx代表远程主机地址,下面为例子: $ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.xxx -p xxxx 需要输入目标机器用户的密码,如hadoop用户的密码hadoop
如果公钥拷贝没有报错,使用命令即可免密码登录另一台机器 $ ssh -p 6666 hadoop@192.168.1.xxx #-p后面代表的是端口号 就是上一步修改的配置里面的Port
以上免密为本机登录其他机器的操作,并不需要每台机器都需要进行拷贝操作,只需要一台作为主机分发到其他机器即可
|
安装Java并配置环境变量
- 安装xshell和xftp,安装直接一路确认即可
- 尝试使用xshell连接自己的机子,以下命令都可以在xshell里运行,当然原来的界面也是可以的(连接步骤略)
- 安装java,并配置环境
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| $ sudo mkdir /usr/local/java#在/usr/local下创建java文件夹
将jdk-8xxxx-linux-x64复制到c盘下,右击属性给文件授予全部权限,以便方便上传到wsl里面 $ cd /mnt/c #进入win的c盘 $ cp jdk-8xxxx-linux-x64.tar.gz /usr/local/java
进入java文件夹,并进行解压 $cd java/ $tar -zxvf jdk-8xxxx-linux-x64.tar.gz#解压 java文件下面会出现jdk1.8xxxx文件夹
如果遇到权限问题或者进不去java文件夹,请将/usr/local的文件夹授予权限 $ sudo chmod 777 /usr/local/java
配置环境变量 $ sudo vim /etc/profile export JAVA_HOME=/usr/local/java/jdk1.8xxxx export PATH=${PATH}:${JAVA_HOME}/bin 注意:“=”两边不要有空格
使环境变量生效 $ source /etc/profile 注意:请不要加sudo,source是bash的内建命令,那样会报找不到命令的错误
验证java环境是否配置完成 $ java -version
如果正常命令下来还是找不到,请参考: 告诉Ubuntu Java JDK的位置 $ sudo update-alternatives --install "/usr/bin/java" "java" "/usr/local/java/jdk1.8.0_231/bin/java" 1 $ sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/local/java/jdk1.8.0_231/bin/javac" 1 $ sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/local/java/jdk1.8.0_231/bin/javaws" 1 相应的将其设为默认方式: $ sudo update-alternatives --set java /usr/local/java/jdk1.8.0_231/bin/java $ sudo update-alternatives --set javac /usr/local/java/jdk1.8.0_231/bin/javac $ sudo update-alternatives --set javaws /usr/local/java/jdk1.8.0_231/bin/javaws 参考文章:https://blog.csdn.net/weixin_42001089/article/details/81865101
|
其他节点配置(重要)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| 将所有的主机的host都配置一下,添加每台机器的ip和对应名称,如 这里由于wsl和win系统用的同一个hosts,所以我们需要修改win10下面的hosts
我们打开此电脑-C盘-window-system32-divers-etc-hosts
将所有配置项全部注释,在前面加上# 添加以下若干项,这里以我们配置的四台机器为例 192.168.1.100 ustc01 192.168.1.158 ustc02 192.168.1.58 ustc03 192.168.1.75 ustc04 (重要)将其他ip配置关闭,前面全部添加#,只保留上面四个配置,要不然在之后hadoop的监控页面看不到datanode节点信息。 如果因为没有权限进行保存,可以先拷贝到桌面进行修改,修改完复制回去覆盖
重启win电脑 记得开电脑后,开启一下ssh服务,命令见最后面的演示段落
如果Java是单独每个人配置的,以下步骤可以不做 分发hadoop到其他节点 $scp -P 6666 /home/hadoop/hadoop-2.7.7.tar.gz ustc02:/home/hadoop #-P为大写,后接端口号。 $scp -P 6666 /home/hadoop/hadoop-2.7.7.tar.gz ustc03:/home/hadoop #-P为大写。 $scp -P 6666 /home/hadoop/hadoop-2.7.7.tar.gz ustc04:/home/hadoop #-P为大写。
解压与配置和前面的java是一样的,参考前面,写了的话请忽略
|
主节点安装hadoop并分发到其他节点
(本配置只需要主要的namenode进行配置即可,其他datanode之后进行分发即可)
类似java的上传,将hadoop压缩包放到c盘下进行授权,并上传,本次上传路径为/home/hadoop(命令省略,请参考java配置)
配置hadoop的四个xml文件和一个子节点标识文件(所有节点这几个信息请保持一致)
修改core-site.xml
1 2 3 4 5 6
| <configuration> <property> <name>fs.default.name</name> <value>hdfs://ustc01:9000</value> </property> </configuration>
|
修改hdfs-site.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <configuration> <property> <name>dfs.replication</name> <value>3</value> <description>副本个数,配置默认是3,应小于datanode机器数量</description> </property> <property> <name>dfs.namenode.dir</name> <value>file:/home/hadoop/hadoop-2.7.7/tmp/dfs/name</value> <description>namenode上数据块的物理存储位置</description> </property> <property> <name>dfs.datanode.dir</name> <value>file:/home/hadoop/hadoop-2.7.7/tmp/dfs/data</value> <description>datanode上数据块的物理存储位置</description> </property>
<property> <name>dfs.name.data.registration.ip-hostname-check</name> <value>false</value> </property> </configuration>
|
修改mapred-site.xml,本文件没有,需要运行以下命令
1
| mv mapred-site.xml.template mapred-site.xml #重命名
|
1 2 3 4 5 6 7 8 9 10 11
| #这里是配置信息 <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <!--<property> <name>mapred.job.tracker</name> <value>hdfs://ustc01:9001</value> </property>--> </configuration>
|
修改yarn-site.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <configuration> <!-- Site specific YARN configuration properties --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.resourcemanager.hostname</name> <value>ustc01</value> <description>resourcemanager位置</description> </property> <property> <name>yarn.nodemanager.vmem-pmem-ratio</name> <value>1000</value> <description>虚拟内存是物理内存的多少倍,这里请根据自己机器配置,默认是2.1,我这里改成1000是因为,运行wordcount时虚拟内存需要1.2TB,但是物理内存只有2G,所以我直接写了1000,这里很重要就是这个导致我们一致测试出错,这里就是原因所在,</description> </property> </configuration>
比如卡在job,或者卡在map0%,reduce 0%,请把vmem-check-enabled的false关掉,或者不要多配,这里没看懂的,请忽略,遇到类似问题再看这个
|
修改slaves文件
这里存放datanode节点名,主机节点名称不要添加,如
1 2 3 4 5
| ustc02 ustc03 ustc04
请输入你需要连接的所有datanode节点名
|
分发到其他节点,并配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| 将配置好的文件夹,压缩打包 $ cd /home/hadoop $ rm hadoop-2.7.7.tat.gz #删除原来上传的压缩包 $ tar -zcf hadoop-2.7.7.tar.gz hadoop-2.7.7/
$ scp -P 6666 hadoop-2.7.7.tar.gz ustc02:/home/hadoop #分发hadoop,-P为大写。 这里解压也是类似java解压配置配置
配置环境变量 $ sudo vim /etc/profile #在刚刚配置的java环境下添加配置成如下格式 export JAVA_HOME=/usr/local/java/jdk1.8.0_231 export HADOOP_HOME=/home/hadoop/hadoop-2.7.7 exportPATH=${PATH}:${JAVA_HOME}/bin:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin: 使环境变量生效 $ source /etc/profile 注意:请不要加sudo,source是bash的内建命令,那样会报找不到命令的错误
验证hadoop环境是否配置完成 $ hadoop 如果没有报错就是成功配置了环境
由于之前我们修改了默认的22端口为6666,这里修改Hadoop的相关端口号 在hadoop-2.7.7/etc/hadoop目录修改 hadoop-env.sh 文件添加如下语句。 在最后面添加,方便寻找 $sudo vim /home/hadoop/hadoop-2.7.7/etc/hadoop/hadoop-env.sh export HADOOP_SSH_OPTS="-p 6666" 将JAVA_HOME等号后面用/usr/local/java/jdk1.8.0_231替换掉 JAVA_HOME=/usr/local/java/jdk1.8.0_231
|
- 开启与关闭以及验证
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| $ hadoop namenode -format #格式化主节点,本条命令请不要乱输入,请部署完所有节点之后进行输入
#开启与关闭,只需要在namenode节点上输入,不要都输入了 $ start-all.sh #开启全部服务 $ stop-all.sh #关闭全部服务 $ start-dfs.sh #开启hdfs $ start-dfs.sh #关闭hdfs
验证是否已经启动,在每个节点输入 $ jps 如果在namenode节点上显示了namenode,在datenode上显示了datanode就表示启动正常
打开win系统的浏览器,输入http://ustc01:50070,如果显示namenode与datanode节点信息正确即成功 这个网址也是心跳监管系统,展示时需要打开
|
代码(@TODO 冉哥豪哥 done)
文档(@TODO锋哥辉哥雷哥林哥ing)
剩余部署(@TODO洋哥ing)
2019-11-20
开机演示需要进行的操作:
打开wsl
运行ssh(可以设置自启动,这里懒得设置)
1 2
| 演示时需要每台机子运行这条命令,开启ssh命令 $sudo service ssh --full-restart
|
一开机,hosts就变回去了,这个还没解决(待修复)
1 2 3 4 5
| $sudo vim /etc/hosts 192.168.1.100 ustc01 192.168.1.158 ustc02 192.168.1.58 ustc03 192.168.1.75 ustc04
|