Centos8配置hadoop全记录

最近开始学hadoop,跟着尚硅谷视频安装hadoop做一个记录。

1、安装Vmware

2、安装Centos8


3、配置ip和主机名称

配置Vmware的ip地址

3.png

配置Windows10的ip地址

4.png

配置Centos8的ip地址

修改ifcfg-ens160文件里面的配置

vim /etc/sysconfig/network-scripts/ifcfg-ens160

将BOOTPROTO=dhcp修改为BOOTPROTO=static

追加

id address

IPADDR=192.168.10.100

gateway

GATEWAY=192.168.10.2

Domain name resolver

DNS1=192.168.10.2

修改主机名称

vim /etc/hostname

这里我们修改为 “hadoop100”

配置主机名称映射

vim /etc/hosts

向hosts文件添加如下内容

  1. 192.168.10.100 hadoop100
  2. 192.168.10.101 hadoop101
  3. 192.168.10.102 hadoop102
  4. 192.168.10.103 hadoop103
  5. 192.168.10.104 hadoop104
  6. 192.168.10.105 hadoop105
  7. 192.168.10.106 hadoop106
  8. 192.168.10.107 hadoop107
  9. 192.168.10.108 hadoop108

然后重启查看ip地址配置成功没有

1.png

再ping一下网站看看有无

4、Xshell远程访问

自配Xshell和Xftp,创建模板虚拟机。

5、安装其他

yum install -y epel-release

关闭防火墙

systemctl stop firewalld

systemctl disable firewalld.service

修改用户权限:修改/etc/sudoers

在hadoop102上安装jdk

在/opt目录下新建目录module和software目录用Xftp将jdk压缩包放在software目录下,然后解压至module目录下

tar -zxvf jdk-8u161-linux-x64.tar.gz -C /opt/module/

配置jdk环境变量

cd /etc/profile.d

2.png

到这个目录下新建一my_env.sh保存环境变量

sudo vim my_env.sh

然后配置变量

  1. #JAVA_HOME
  2. export JAVA_HOME=/opt/module/jdk1.8.0_161
  3. export PATH=$PATH:$JAVA_HOME/bin

配置完成之后再重新加载一下profile文件

source /etc/profile

此时可以使用java命令查看

5.png

在hadoop102上安装hadoop

前面步骤与安装jdk相同

tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/

  1. #HADOOP_HOME
  2. export HADOOP_HOME=/opt/module/hadoop-3.1.3
  3. export PATH=$PATH:$HADOOP_HOME/bin
  4. export PATH=$PATH:$HADOOP_HOME/sbin

source之后可以使用hadoop命令验证一下

6.png

顺带记录一下hadoop的目录结构:

  • bin:存放对Hadoop相关服务(hdfs,yarn,mapred)进行操作的脚本
  • etc:Hadoop的配置文件目录,存放Hadoop的配置文件
  • include:存放类似c语言头文件形式的.h文件
  • lib:存放Hadoop的本地库(对数据进行压缩解压缩功能)
  • libexec
  • sbin:存放启动或停止Hadoop相关服务的脚本
  • share:存放Hadoop的依赖jar包、文档、和官方案例

安装完毕之后可以使用share文件夹里面的官方例子测试一下:wordcount

  1. 新建wcinpt目录:/opt/module/hadoop-3.1.3/wcinput
  2. 建一个word.txt文本,写一些内容进去。
  3. 然后调用share中的官方jar包。指定输出目录

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount wcinput/ wcoutput

  1. 执行完毕后到指定输出目录查看

    7.png


hadoop完全分布式搭建

准备条件

  1. 准备三台客户机(关闭防火墙、配置静态ip及主机名称)
  2. 安装JDK
  3. 配置环境变量
  4. 安装hadoop
  5. 配置环境变量
  6. 配置集群
  7. 单点启动
  8. 配置ssh
  9. 群起并测试集群

因为之前我们已经配置好hadoop102,并且已经有另外两台配置了ip的客户机(只是没有安装JDK和hadoop)为了避免麻烦,我们将hadoop的安装好的环境拷贝给另外两台机机器。

scp命令

Linux scp 命令用于 Linux 之间复制文件和目录。scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。

  1. #语法
  2. scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
  3. [-l limit] [-o ssh_option] [-P port] [-S program]
  4. [[user@]host1:]file1 [...] [[user@]host2:]file2
  • -1: 强制scp命令使用协议ssh1
  • -2: 强制scp命令使用协议ssh2
  • -4: 强制scp命令只使用IPv4寻址
  • -6: 强制scp命令只使用IPv6寻址
  • -B: 使用批处理模式(传输过程中不询问传输口令或短语)
  • -C: 允许压缩。(将-C标志传递给ssh,从而打开压缩功能)
  • -p:保留原文件的修改时间,访问时间和访问权限。
  • -q: 不显示传输进度条。
  • -r: 递归复制整个目录。
  • -v:详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。
  • -c cipher: 以cipher将数据传输进行加密,这个选项将直接传递给ssh。
  • -F ssh_config: 指定一个替代的ssh配置文件,此参数直接传递给ssh。
  • -i identity_file: 从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。
  • -l limit: 限定用户所能使用的带宽,以Kbit/s为单位。
  • -o ssh_option: 如果习惯于使用ssh_config(5)中的参数传递方式,
  • -P port:注意是大写的P, port是指定数据传输用到的端口号
  • -S program: 指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项。

我们在这里使用 -r 指定相同的目录在102主机复制jkd至103

scp -r jdk1.8.0_161/ wko@hadoop103:/opt/module/

同样也可以在hadoop103访问hadoop102,拉取hadoop

scp -r wko@hadoop102:/opt/module/hadoop-3.1.3 ./

也可以在主机103上将102的文件向104传输

scp -r wko@hadoop102:/opt/module/* wko@hadoop104:/opt/module/

分发文件脚本

为了方便之后进行的配置,写一个文件分发的脚本。要让脚本在任何路径都能使用。我们把脚本放在声明了全局环境变量的路径在:/home/wko/bin目录下。

8.png

vim xsync

chmod +x xsync 修改权限

  1. #!/bin/bash
  2. #1. 判断参数个数
  3. if [ $# -lt 1 ]
  4. then
  5. echo Not Enough Arguement!
  6. exit;
  7. fi
  8. #2. 遍历集群所有机器
  9. for host in hadoop102 hadoop103 hadoop104
  10. do
  11. echo ==================== $host ====================
  12. #3. 遍历所有目录,挨个发送
  13. for file in $@
  14. do
  15. #4. 判断文件是否存在
  16. if [ -e $file ]
  17. then
  18. #5. 获取父目录
  19. pdir=$(cd -P $(dirname $file); pwd)
  20. #6. 获取当前文件的名称
  21. fname=$(basename $file)
  22. ssh $host "mkdir -p $pdir"
  23. rsync -av $pdir/$fname $host:$pdir
  24. else
  25. echo $file does not exists!
  26. fi
  27. done
  28. done

编写完成后可以测试一下用xsync发放当前的bin目录

xsync bin./

第一次链接需要输入密码,环境变量也可以这样发送。

xsync /etc/profile.d/my_env.sh

ssh无密码登录配置

配置ssh

基本语法:ssh + ip地址

退出:exit

ssh的免密登录原理:

9.png

首先要配置ssh要先生成公钥和私钥

ssh-keygen -t rsa —生成id_rsa和id_rsa.pub对应私钥和公钥

用过ssh登录的主机目录下会有.ssh文件

10.png

然后将公钥拷贝到其他要配置免密登录的主机上

ssh-copy-id hadoop102

ssh-copy-id hadoop103

ssh-copy-id hadoop104

这里还需要用hadoop102的root账号、hadoop103用户和hadoop104用户进行同样的配置。

上图是配置好的.ssh文件各个文件的含义。

known_hosts 记录ssh访问过计算机的公钥(public key)
id_rsa 生成的私钥
d_rsa.pub 生成的公钥
authorized_keys 存放授权过的无密登录服务器公钥

集群配置

集群的规划

NameNode、SecondaryNode、和ResourceManage很消耗内存、不要配置到同一台机器上。

hadoop102 hadoop103 hadoop104
HDFS NameNode、DataNode DataNode SecondaryNode、DataNode
Yarn NodeManager ResourceManager、NodeManager NodeManager

配置文件

Hadoop的配置文件有两种:默认配置文件和自定义配置文件。

默认配置文件:core-default.xml、hdfs-default.xml、yarn-default.xml、mapred-default.xml,它存放在Hadoop的jar包中的位置:/hadoop-common-3.1.3.jar/*

自定义配置文件:core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml它们存放在:hadoop-3.1.3/etc/hadoop,它可以根据项目需求更改配置。

core-site.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
  3. <!-- Put site-specific property overrides in this file. -->
  4. <configuration>
  5. <!-- 指定 NameNode 的地址 -->
  6. <property>
  7. <name>fs.defaultFS</name>
  8. <value>hdfs://hadoop102:8020</value>
  9. </property>
  10. <!-- 指定 hadoop 数据的存储目录 -->
  11. <property>
  12. <name>hadoop.tmp.dir</name>
  13. <value>/opt/module/hadoop-3.1.3/data</value>
  14. </property>
  15. </configuration>

hdfs-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->
<configuration>
    <!-- nn web 端访问地址-->
    <property>
         <name>dfs.namenode.http-address</name>
         <value>hadoop102:9870</value>
    </property>
    <!-- 2nn web 端访问地址-->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop104:9868</value>
    </property>
</configuration>

yarn-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <!-- 指定 MR 走 shuffle -->
    <property>
          <name>yarn.nodemanager.aux-services</name>
          <value>mapreduce_shuffle</value>
    </property>
    <!-- 指定 ResourceManager 的地址-->
<property>                              <name>yarn.resourcemanager.hostname</name>
<value>hadoop103</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>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>22528</value>
<discription>每个节点可用内存,单位MB</discription>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1500</value>
<discription>单个任务可申请最少内存,默认1024MB</discription>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>16384</value>
<discription>单个任务可申请最大内存,默认8192MB</discription>
</property>
<!-- 开启日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property> 
<name>yarn.log.server.url</name>         <value>http://hadoop102:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为 7 天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
</configuration>

mapred-site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>

    <!-- 指定 MapReduce 程序运行在 Yarn 上 -->
     <property>
          <name>mapreduce.framework.name</name>
           <value>yarn</value>
       </property>
       <property>
          <name>yarn.app.mapreduce.am.env</name>
          <value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.1.3</value>
           </property>
           <property>
          <name>mapreduce.map.env</name>
         <value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.1.3</value>
           </property>
           <property>
                 <name>mapreduce.reduce.env</name>
                 <value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.1.3</value>
               </property>
            <property>
                <name>mapreduce.map.memory.mb</name>
                <value>1500</value>
                <description>每个Map任务的物理内存限制</description>
            </property>
             <property>
                 <name>mapreduce.reduce.memory.mb</name>
                 <value>3000</value>
                 <description>每个Reduce任务的物理内存限制</description>
             </property>
              <property>
                  <name>mapreduce.map.java.opts</name>
                  <value>-Xmx1200m</value>
              </property>
               <property>
                   <name>mapreduce.reduce.java.opts</name>
                   <value>-Xmx2600m</value>
               </property>
               <property>
                   <name>mapreduce.framework.name</name>
                   <value>yarn</value>
               </property>
               <!-- 历史服务器端地址 -->
               <property>
                    <name>mapreduce.jobhistory.address</name>
                     <value>hadoop102:10020</value>
                 </property>
                 <!-- 历史服务器 web 端地址 -->
                 <property>
                      <name>mapreduce.jobhistory.webapp.address</name>
                       <value>hadoop102:19888</value>
                   </property>
</configuration>

workers

hadoop102
hadoop103
hadoop104

这里配置workers不允许有多余的空格

以上就是基本的配置文件信息了。

启动集群

第一次启动集群需要进行格式化(这里我们在hadoop102进行格式化)

hdfs namenode -format

启动HDFS

sbin/start-dfs.sh

在配置了ResourceManager的节点启动Yarn

sbin/start-yarn.sh

之前配置了Web端的查看端口

查看HDFS的NN:http://hadoop102:9870

查看Yarn的RM:http://hadoop103:8088

这其中的配置都是我经过各种报错加上去的:

下面的是没有设置检查虚拟内存的属性为false,会一直报错虚拟内存溢出

11.png

报错exitcode143:mapreduce运行中发现有任务被kill掉,多半是因为内存分配不足造成,需要修改,reduce和map的物理内存限制。

这里出现了内核软死锁,具体原因不知…
解决方案:重新格式化NameNode节点后重新配置(注意要把每个hadoop安装目录下的data和logs目录删去再进行格式化)
12.png

在配置完成后可以跑一下hadoop自带的一些例子:

下图就是最终成功配置完成并且跑了测试例子wordcount成功,留图纪念。
13.png