云服务器搭建hadoop环境心得

本文参考博主-寒冰晓撤-的博文,在此基础上搭建hadoop环境,在她的基础上做了一些补充

0、背景

网上的教程一般是在自己的电脑上安装一台虚拟机,然后载入CentOS环境,为满足集群化 的效果,于是克隆出三台虚拟机如果你的电脑内存不够大,可以考虑租一台云服务器,在云服务器上安装docker,然后再拉取CentOS环境,将此环境镜像,再克隆出两个容器,同样也能达到三台虚拟机的效果。
本文将详细介绍整个配置过程以及分析配置过程中会将遇到的问题。

1、云服务器CentOS环境下使用yum命令会报错

报错:Repository epel is listed more than once in the configuration
原因:CentOS 8操作系统版本结束了生命周期(EOL),Linux社区已不再维护该操作系统版本。建议您切换到Anolis或Alinux。
如果您的业务过渡期仍需要使用CentOS 8系统中的一些安装包,请根据下文切换CentOS 8的源。
方案:

[root@56f295723fa1 yum.repos.d]# sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
[root@56f295723fa1 yum.repos.d]# yum update -y

2、安装及卸载docker

docker:用于开发、交互和运行应用程序交互的平台。
首先查看云服务器上有无安装Docker环境,你可以将之前的docker卸载

cat /etc/os-release:查看系统内核版本(确认在 3.10 以上)
   uname -r:查看服务器版本
 ② 查看docker当前的状态 systemctl status docker 若在运行则 systemctl stop docker
 ③ 查看yum安装的docker包 yum list install | grep docker
   查看docker相关的rpm文件rpm -qa | grep docker
   卸载依赖 yum remove docker-ce docker-ce-cli containerd.io
   删除资源(其中 /var/lib/docker 是 docker 的默认工作路径)rm -rf /var/lib/docker
   检查是否卸载完全yum remove docker \
                        docker-client \
                        docker-client-latest \
                        docker-common \
                        docker-latest \
                        docker-latest-logrotate \
                        docker-logrotate \
                        docker-engine
                若全部出现No match for argument:xxx则表示清除干净
 ④更行yum源文件 yum -y update ;安装epel源 yum install -y epel-release;清除yum缓存 yum clean all 列出所有可安装的包yum list
 ⑤安装并且运行dockers yum install docker-io -y   
             systemctl start docker
 ⑥检查安装结果docker info
  启动:systemctl start docker  停止:systemctl stop docker  重启:systemctl restart docker
  验证是否启动成功:docker version
  有显示内容,就表示已经启动成功了

3、创建第一个容器

```bash
 1)	首先拉取 centos
 docker pull centos

  2)创建一个 centos
    在这里添加端口映射,hadoop001 要用到的端口是: 98708020,主机端口自定义
    需要读写数据的 9866 端口,这里的主机映射端口只能设置为 9866,不能自定义
    docker run --privileged=true --name=hadoop001 -p xxx:9870 -p xxx:8020 -p 9866:9866 -dit centos /sbin/init
    注:这里有三个-p,添加三个端口映射。
    -dit 表示交互式且后台运行,少了 -it 容器会自动停止
    --privileged=true 和 /sbin/init 表示特权启动,后面可能需要实用到 service 命令,需要由这个权限才可以
  3)为该容器配置JDK和hadoop环境
   将JDK和hadoop从主机复制到该容器中
   docker cp <jdk路径> <容器id>:<容器路径>     (jdk选用java version "1.8.0_212"的版本,hadoop选用Hadoop 3.1.3的版本)
   docker cp <hadoop路径> <容器id>:<容器路径>   (容器id即这串数字:27bc00bf4854;容器路径:在容器里面选定一个位置,建议选定路径/opt/module)
   在 /etc/profile.d/ 下建议重新创建文件 my_env.sh,也可以直接在mydex.sh文件上修改,若重新创建my_env.sh,其路径与mydex.sh文件中配置路径保持一致
   vim my_env.sh文件内容如下:
   # Java
   export JAVA_HOME=<jdk在容器的路径>
   export PATH=$PATH:$JAVA_HOME/bin
   # Hadoop
   export HADOOP_HOME=<hadoop在容器的路径>
   export PATH=$PATH:$HADOOP_HOME/bin
   export PATH=$PATH:$HADOOP_HOME/sbin
   第一个是JDK的路径,第二个是hadoop的绝对路径,若路径不对,则在后面启动集群HDFS时,会出现找不到HADOOP_HOME,频繁报错
  最后进入上一级目录/etc目录下执行source profile
  4)安装JDK和hadoop
   检查环境中是否存在老版本的JDK:输入JAVA命令或者which java(得到JDK安装的绝对路径)
   删除jdk:rm -rf jdk安装的路径
   安装JDK: tar -zxvf  文件名 解压路径(/opt/module/)
   安装hadoop: tar -zxvf 文件名 解压路径(/opt/module/)
   返回3)核对JDK和hadoop在容器中的路径,确保正确


4、配置容许外界通过SSH连接容器

我们配置集群需要通过ssh连接产生联系,但是ssh默认情况下需要人为来配置

1)首先需要设置密码(输入以下命令,回车设置密码即可)
	passwd root
	大概率会提示没有该命令,就得下载它,然后再设置就好了
	yum install passwd
2)	然后下载 ssh,以下三步(安装了服务端和客户端)
	yum install openssh
	yum install openssh-server
	yum install openssh-clients
3)	然后检查配置文件,查看以下两个配置是否一样(默认不需要更改)
	vim /etc/ssh/sshd_config
	 // PermitRootLogin yes
	 // PasswordAuthentication yes
   该文件中应该没有以上注释的两行,默认情况下是不需要更改的
	这两个配置允许外网通过 ssh 连接该服务器(容器)
 4)	如果发现不是这样,就修改它,同时需要重启 ssh 是指生效
	service sshd restart
  通过上面的一顿操作,此时可以在主机上访问到该容器内部
  首先在容器内,使用 ifconfig 查看 IP 地址
	ifconfig
	没有这个命令的话,就下载他[doge]
	yum install net-tools
在服务器本机中,通过 ssh 访问该 IP 地址尝试连接
	ssh <IP>
	然后要求输入密码,就是上面我们已经设置了的密码
  进入到容器内部还可以通过docker命令实现:docker exec -it 243c32535da7(容器ID) /bin/bash

5、由该容器克隆出多个容器

想要克隆出多个容器,就得先将其打包成镜像,然后拉取镜像,就可创建出新的容器

1)	创建镜像
	docker commit -a='Maple' -m='Hadoop cluster example through docker by Maple' <容器ID> <hadoop-docker(名字):v1(版本)>
2)	由该进项克隆多个容器模拟集群(这里以三台服务器的集群为例)
      hadoop002 要用到的端口是: 8088,主机端口自定义
	    docker run --privileged=true --name=hadoop002 -p xxx:8088 -dit hadoop-docker(名字):v1(版本) /sbin/init

      hadoop003 要用到的端口是: 9868,主机端口自定义
	    docker run --privileged=true --name=hadoop003 -p xxx:9868 -dit hadoop-docker(名字):v1(版本) /sbin/init

      在这些容器生成好后,为它们配置一个 IP 地址映射
      往后就不用去记住每一个容器的 IP 地址了

      但同时由于 docker 网桥模式的特性,当容器重启时,会按顺序为该容器分配一个 IP,使得该 IP 地址不是固定的会变化,这对我们已经做的映射非常不友好,所以接下来的第一步,是为每个容器固定一个 IP 地址(这里需要借助 pipework)

      1)安装 pipewoek(下载并复制可执行文件到 bin 目录)
	     git clone https://github.com/jpetazzo/pipework
	     cp ~/pipework/pipework /usr/local/bin/

       2)安装 bridge-utils
	       yum -y install bridge-utils
         注:bridge-utils可能没有这个源,此时需要我们手动下载安装
         #源码下载bridge-utils-1.6,将其上传到服务器
         #源码解压tar -zxvf bridge-utils-1.6.tar.xz
         #安装autoconfig工具:yum install autoconfig
         #使用autoconfig生成配置文件 autoconfig
         #配置,生成makefile文件 ./configure
         #编译与安装 make;make install
         #bridge-utils安装完毕,测试安装情况 brctl show


        3)创建网络(这里 IP 地址自定义)
	        brctl addbr br0
	         ip link set dev br0 up
	          ip addr add 172.17.0.1 dev br0

        4)为各个容器设置固定的 IP
	           pipework br0 <容器名> IP/掩码,如:
	           pipework br0 hadoop001 172.17.0.2/24
	           pipework br0 hadoop002 172.17.0.3/24
	           pipework br0 hadoop003 172.17.0.4/24

        5)测试这几个 IP 是否可用
	       ping 172.17.0.2

        6)中途如果不小心操作错了(比如说我--),想删除网络或IP,可执行如下
	          删除网络:	ip link set dev br0 down
				        brctl delbr
	          删除 IP:	ip link set dev <名称> down
				   其中<名称>来自于 ifconfig 查找到的 veth1plxxx

          这样就成功地为每一个容器固定好 IP 地址了,接下来就可以在容器内配置映射了
          在每一台容器中,修改 hosts 文件
	      vim /etc/hosts
		  比如说我的,就在文件中增加:
		  172.17.0.2 hadoop001
		  172.17.0.3 hadoop002
		  172.17.0.4 hadoop003

    	 配置完毕后,我们就可以直接通过名字轻松连接各个容器了,如:
	     ssh hadoop003

6、为各个容器配置免密登录

容器之间虽然能正常互相连接了,但如果每次都需要输入密码,那是及其不方便的
再而,到后面启动集群的时候,如果没有免密登录,既有可能会失败

所以我们可以为各个集群中的容器配置免密登录,实现各个容器之间的顺畅连接
首先我们来了解一下免密登录的原理(以 hadoop001 和 hadoop002 为例)

—— 分为公钥和私钥,私钥保密,公钥可以给别人
然后如果将 hadoop001 的公钥拷贝给 hadoop002
—— 通过命令拷贝,该公钥会保存在 hadoop002 中的 Authorized_keys 中
往后 hadoop001 想要连接 hadoop002,就可以直接通过公钥连接,无需密码

所以我们可以知道,免密登录的实现,就是将目标服务器的公钥拷贝到对方的服务器上,这样对方即可免密登录该目标服务器,而如果两台服务器要互相免密登录,当然就要互相拷贝到对方的公钥

1)	首先在 hadoop001 中,生成公钥和私钥(一路回车到底就行了,不需要输入内容)
    ssh-keygen -t rsa
     其中 id_rsa 为私钥,id_rsa.pub 为公钥

2)	将 hadoop001 的公钥拷贝到 hadoop002
   ssh-copy-id hadoop002
 注意:公钥也要拷贝到本地主机上,即hadoop001主机进行ssh-copy-id haddoop001

7、开始编写集群操作

在hadoop安装目录下,即/opt/module/hadoop路径/etc/hadoop/路径下:修改core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml四个文件
将编写好的四个配置文件,同步到其他两台服务器上(hadoop002,hadoop003)

 scp core-site.xml hdfs-site.xml yarn-site.xml mapred-site.xml root@hadoop002:/opt/module/hadoop-3.1.3/etc/hadoop

配置works文件
在当前目录下vim works 删除localhost,添加

hadoop001
hadoop002
hadoop003

注意:文末不能有空格
将该文件同步到其他两个容器

8、启动集群

第一次启动时,需要进行初始化(往后就不用了,再初始化会清空数据)
hdfs namenode -format
若此时hdfs报错,则要检查/etc/profile.d/my_env.sh&mydex.sh文件配置的路径
若出现警告,则检查JDK的版本

启动DFS,首先在hadoop001容器中(配置过namenode)
进入~/hadoop/sbin目录下,执行./start-dfs.sh,然后执行jps

启动yarn,在hadoop002中操作(配置过ResourceManager)
进入~/hadoop/sbin目录下,执行./start-yarn.sh,在执行jps检查
在hadoop003中,执行jps检查
云服务器搭建hadoop环境心得_第1张图片
云服务器搭建hadoop环境心得_第2张图片
云服务器搭建hadoop环境心得_第3张图片

到此,集群启动成功


#远程连接服务器并访问端口:
首先在阿里云服务器上打开端口;要在这个面板上添加端口号,在shell环境中关闭防火墙

[root@****** ~]# netstat -ntlp |grep 9870
tcp        0      0 0.0.0.0:9870            0.0.0.0:*               LISTEN      3504096/docker-prox 
tcp6       0      0 :::9870                 :::*                    LISTEN      3504102/docker-prox

在这里插入图片描述
然后在自己电脑上输入ip+端口号即可进进入到下面界面
云服务器搭建hadoop环境心得_第4张图片

具体技术可以参考这篇博客

https://blog.csdn.net/Ice__Clean/article/details/120577867

你可能感兴趣的:(hadoop)