大数据-搭建 Hadoop 分布式环境

214 阅读7分钟

我正在参加「掘金·启航计划」

介绍一下:

本文主要内容是,在 centos 系统上,安装 jdk 和 hadoop 集群,学习 HDFS 的基本操作,以动手实践为主要内容。

准备工作

一、环境准备

  1. 准备 3 台 Linux 虚拟机,或者同一内网下的服务器

    172.18.234.50  master
    172.18.234.52  slave1
    172.18.234.47  slave2
    
  2. 修改主机名

    通过下述命令查看主机名称

    hostname
    

    修改主机名称为master

    方法一

    hostnamectl set-hostname master
    

    方法二

    修改配置文件修改主机名,将原有内容删除然后输入名称 master 即可

    vi /etc/hostname
    

    断开重新连接,在查看主机名称。同理配置其它两台机器,分别设置主机名为slave1,slave2

  3. 添加域名映射

    修改hosts文件,添加所有主机IP地址和主机名对应关系。

    vi /etc/hosts
    

    输入下述内容(根据自己的IP进行修改)

    格式为:
    主机IP  制表符  主机名
    172.18.234.50  master
    172.18.234.52  slave1
    172.18.234.47  slave2
    

    修改完成后,用cat命令 查看hosts文件内容

    cat /etc/hosts
    

    同理,把修改的内容复制到slave1、slave2的hosts文件

二、实现 SSH 无密码登入

  1. 使用命令生成服务器密钥(输完命令按四次回车,三台机器均需要操作)

    ssh-keygen
    

    输完命令按四次回车,结果如下

    [root@master ~]# ssh-keygen
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa):
    Created directory '/root/.ssh'.
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /root/.ssh/id_rsa.
    Your public key has been saved in /root/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:wj6K0hg7YCuubpow/PcSZDq/t4vdOa8yHjNxwect46k root@master
    The key's randomart image is:
    +---[RSA 2048]----+
    |                 |
    |        .        |
    |         o .     |
    |     +    + .    |
    |    + o.S. + .   |
    |+. o o .o . +    |
    |=*. o ++   o     |
    |B=o. =o==.o      |
    |@=..oo**=E+.     |
    +----[SHA256]-----+
    [root@master ~]#
    
  2. 进入.ssh/目录,查看生成的密钥

    cd /root/.ssh/
    ll
    

    文件夹内容如下

    总用量 12
    -rw-------. 1 root root  393 10月 14 02:57 authorized_keys
    -rw-------. 1 root root 1675 10月 14 03:01 id_rsa
    -rw-r--r--. 1 root root  393 10月 14 03:01 id_rsa.pub
    
  3. 使用 ssh-copy-id 命令拷贝公钥到目标主机:

    所有节点都需进行下列操作(操作时有提示,输入yes)

    执行这条命令后,就可以 ssh 免密登入目标主机

    ssh-copy-id master
    ssh-copy-id slave1
    ssh-copy-id slave2
    
  4. 使用ssh登录目标主机 (发现三台结点间可以任意互通,不再需要输入密码,登录后,输入exit可退回自己的主机)

    示例:进入slave1

    ssh slave1
    
  5. 退出slave1结点,回到master结点

    exit
    

三、命令同步脚步

  1. 创建脚本存储目录

    mkdir /root/bin/
    
  2. 创建命令同步脚本文件

    cd /root/bin/
    vi xcall
    
  3. 输入以下代码

     #!/bin/bash
     if(($#==0))
     then
             echo "请输入参数"
             exit;
     fi
             echo "----------------master-----------------"
             ssh     master $@
     for((i=1;i<3;i++))
     do
             echo "----------------slave$i-----------------"
             ssh slave$i $@
     done
             echo "命令已执行完毕"
    
  4. 赋予脚本权限

    chmod 777 xcall
    
  5. 在配置文件,末尾追加下列代码

    echo 'source /etc/profile' >> /root/.bashrc
    

以上操作必须在三台机器都要执行。

  1. 测试脚本是否可以使用

    cd /root/ 
    xcall ls /root/bin/
    

四、文件同步脚本

  1. 进入创建的/root/bin 目录

    cd /root/bin
    
  2. 创建文件同步脚本文件

    vi xsync
    
  3. 输入下列代码

     #!/bin/bash
     if(($#!=1))
     then
             echo "只能输入一个参数"
             exit;
     fi
     dirpath=$(cd -P `dirname $1`;pwd)
     filename=$(basename $1)
             echo "-----------------master--------------"
     rsync -rvlt $dirpath/$filename root@master:$dirpath
     for((i=1;i<3;i++))
     do
            echo "-----------------slave$i----------------"
     rsync -rvlt $dirpath/$filename root@slave$i:$dirpath
     done
             echo "命令执行完毕"
    
  4. 赋予脚本权限

    chmod 777 xsync
    
  5. 使用文件同步脚本将文件同步脚本分发到另外两台机器

    xsync xsync
    

可以到其他节点的 /root/bin 目录下查看文件是否分发成功。

注意:执行同步文件命令之前,在相同目录下先创建文件夹 (或者加上文件夹绝对路径在同步)

五、 Linux scp命令

Linux scp 命令用于 Linux 之间复制文件和目录。

scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。

scp 是加密的,rcp 是不加密的,scp 是 rcp 的加强版。

  1. 简易写法:

    scp [可选参数] file_source file_target 
    
  2. 从本地复制到远程

    复制目录命令格式:

    scp -r local_folder remote_username@remote_ip:remote_folder 
    
  3. 从远程复制到本地

    从远程复制到本地,只要将从本地复制到远程的命令的后2个参数调换顺序即可,如下实例

    scp root@maste:/home/root/others/music /home/space/music/1.mp3 
    

注意说明

  1. 如果远程服务器防火墙有为scp命令设置了指定的端口,我们需要使用 -P 参数来设置命令的端口号,命令格式如下:

    scp 命令使用端口号 4588

    scp -P 4588 remote@master:/usr/local/sin.sh /home/administrator
    
  2. 使用scp命令要确保使用的用户具有可读取远程服务器相应文件的权限,否则scp命令是无法起作用的

实例操作:

  1. 将 1.txt 文件,复制到远程服务器,home / slave1 目录下

    scp -r 1.txt slave1:/home/slave1
    
  2. 将 master 目录,复制到远程服务器,home / slave1 目录下

    scp -r master/ slave1:/home/slave1
    

其中 -r 意思是,递归复制整个目录。-P port ,注意是大写的P, port是指定数据传输用到的端口号。

六、目录和镜像站

  1. 创建两个目录,用来存放软件和安装包的目录

    mkdir -p /usr/local/software && mkdir -p /usr/local/install_pack
    
  2. 北京外国语大学开源软件镜像站

    https://mirrors.bfsu.edu.cn/
    

安装 JDK

一、下载和配置 JDK

  1. 进入安装包目录 install_pack

    cd /usr/local/install_pack
    
  2. 执行以下命令,下载JDK1.8安装包。

    wget https://download.java.net/openjdk/jdk8u41/ri/openjdk-8u41-b04-linux-x64-14_jan_2020.tar.gz
    
  3. 执行以下命令,解压下载的JDK1.8安装包。

    tar -zxvf openjdk-8u41-b04-linux-x64-14_jan_2020.tar.gz -C /usr/local/software/
    
  4. 执行以下命令,进入软件包目录,并重命名JDK包。

    cd /usr/local/software && mv java-se-8u41-ri java8
    
  5. 执行以下命令,配置Java环境变量。

    echo 'export JAVA_HOME=/usr/local/software/java8' >> /etc/profile
    echo 'export PATH=$PATH:$JAVA_HOME/bin' >> /etc/profile
    source /etc/profile
    
  6. 执行以下命令,查看Java是否成功安装。

    java -version
    

    如果返回以下信息,则表示安装成功。

    openjdk version "1.8.0_41"
    OpenJDK Runtime Environment (build 1.8.0_41-b04)
    OpenJDK 64-Bit Server VM (build 25.40-b25, mixed mode)
    

二、复制到其它服务器上

  1. 使用脚本同步,拷贝整个软件包目录 software 包含 java 解压包至其它服务器,slave1,slave2

    xsync /usr/local/software/
    
  2. 拷贝配置环境变量文件,至其它服务器,slave1,slave2

    xsync /etc/profile
    
  3. Ssh 进入 slave1,slave2 服务器,重新加载配置文件,并查看 java 是否配置成功

    source /etc/profile
    
  4. 执行命令同步脚步,查看进程

    xcall jps
    

    结果如下

    ----------------master-----------------
    2135 Jps
    ----------------slave1-----------------
    1976 Jps
    ----------------slave2-----------------
    1948 Jps
    命令已执行完毕
    

安装 Hadoop

一、安装 hadoop

  1. 进入安装包目录 install_pack

    cd /usr/local/install_pack
    
  2. 执行以下命令,下载 Hadoop 安装包。

    wget --no-check-certificate https://mirrors.bfsu.edu.cn/apache/hadoop/common/hadoop-3.2.3/hadoop-3.2.3.tar.gz
    
  3. 执行以下命令,解压 Hadoop 安装包至 /usr/local/software/。

    tar -zxvf hadoop-3.2.3.tar.gz  -C /usr/local/software/
    
  4. 执行以下命令,进入软件包目录,并重命名 hadoop 包。

    cd /usr/local/software && mv hadoop-3.2.3 hadoop
    
  5. 执行以下命令,配置 Hadoop 环境变量。

    echo 'export HADOOP_HOME=/usr/local/software/hadoop/' >> /etc/profile
    echo 'export PATH=$PATH:$HADOOP_HOME/bin' >> /etc/profile
    echo 'export PATH=$PATH:$HADOOP_HOME/sbin' >> /etc/profile
    source /etc/profile    
    
  6. 执行以下命令,修改配置文件 yarn-env.sh 和 hadoop-env.sh 和 mapred-env.sh ,设置JDK安装目录

    echo "export JAVA_HOME=/usr/local/software/java8" >> /usr/local/software/hadoop/etc/hadoop/yarn-env.sh
    echo "export JAVA_HOME=/usr/local/software/java8" >> /usr/local/software/hadoop/etc/hadoop/hadoop-env.sh
    echo "export JAVA_HOME=/usr/local/software/java8" >> /usr/local/software/hadoop/etc/hadoop/mapred-env.sh
    
  7. 执行以下命令,测试 Hadoop 是否安装成功。

    hadoop version
    

    如果返回以下信息,则表示安装成功。

    Hadoop 3.2.3
    Source code repository https://github.com/apache/hadoop -r abe5358143720085498613d399be3bbf01e0f131
    Compiled by ubuntu on 2022-03-20T01:18Z
    Compiled with protoc 2.5.0
    From source with checksum 39bb14faec14b3aa25388a6d7c345fe8
    This command was run using /usr/software/hadoop-3.2.3/share/hadoop/common/hadoop-common-3.2.3.jar
    

二、配置 Hadoop 指定 HDFS 主节点:

  1. 修改 Hadoop 配置文件 core-site.xml。

    a. 执行以下命令开始进入编辑页面。

    vi /usr/local/software/hadoop/etc/hadoop/core-site.xml
    

    b. 输入i进入编辑模式。

    c. 在<configuration></configuration>节点内插入如下内容。

    <!-- 指定 hadoop 临时目录 -->
    <property>
    	<name>hadoop.tmp.dir</name>
    	<value>/usr/local/software/hadoop/cloud</value>
      <description>location to store temporary files</description>
    </property>
    <property>
    	<name>fs.defaultFS</name>
    	<value>hdfs://master:8020</value>
    </property>
    

    d. 按Esc键退出编辑模式,输入:wq保存退出。

三、指定 HDFS 从节点,

  1. 修改 Hadoop 配置文件 hdfs-site.xml。

    a. 执行以下命令开始进入编辑页面。

    vi /usr/local/software/hadoop/etc/hadoop/workers
    

    b. 输入i进入编辑模式。

    将下列代码追加到文件末尾,同时删除 localhost

    master 
    slave1 
    slave2
    

四、配置 yarn-site.xml

  1. 添加在 configuration 标签之间

    vi /usr/local/software/hadoop/etc/hadoop/yarn-site.xml
    

    添加下列代码

    <!-- Reducer获取数据的方式 -->
    <property>
    	<name>yarn.nodemanager.aux-services</name>
    	<value>mapreduce_shuffle</value>
    </property>
    <!-- 指定YARN的ResourceManager的地址 -->
    <property>
    	<name>yarn.resourcemanager.hostname</name>
    	<value>master</value>
    </property>
    

五、配置 mapred-site.xml

  1. 添加在 configuration 标签之间

    vi /usr/local/software/hadoop/etc/hadoop/mapred-site.xml
    

    添加下列代码

    <!-- 指定 MR 运行在 Yarn 上 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>yarn.app.mapreduce.am.env</name>
        <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    </property>
    <property>
        <name>mapreduce.map.env</name>
        <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    </property>
    <property>
    <name>mapreduce.reduce.env</name>
    <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    </property>
    

六、配置文件 hdfs-site.xml。

  1. 执行以下命令开始进入编辑页面。

    vi /usr/local/software/hadoop/etc/hadoop/hdfs-site.xml
    
  2. <configuration></configuration>节点内插入如下内容。

    <!-- 指定 Hadoop 辅助名称节点主机配置 -->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>slave2:50090</value>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>3</value>
        <description>设置副本数</description>
    </property>
    <!--配置 namenode 的 web 界面-->
    <property>
        <name>dfs.namenode.http-address</name>
        <value>master:50070</value>
    </property>
    
  3. 按Esc键退出编辑模式,输入:wq保存退出。

七、复制到集群

  1. 拷贝整个 hadoop 解压包至其它服务器,slave1,slave2

    xsync /usr/local/software/hadoop/
    

集群环境格式化及启动

一、在master服务器上,格式化主节点

  1. 执行以下命令,初始化namenode 。

    hadoop namenode -format
    
  2. 在 start-dfs.sh,stop-dfs.sh 两个文件顶部添加以下参数(从第2行开始写)

    vi /usr/local/software/hadoop/sbin/start-dfs.sh
    vi /usr/local/software/hadoop/sbin/stop-dfs.sh
    

    添加下列内容

    HDFS_DATANODE_USER=root
    HADOOP_SECURE_DN_USER=hdfs
    HDFS_NAMENODE_USER=root
    HDFS_SECONDARYNAMENODE_USER=root
    
  3. start-yarn.sh,stop-yarn.sh 顶部也需添加以下内容

    vi /usr/local/software/hadoop/sbin/start-yarn.sh 
    vi /usr/local/software/hadoop/sbin/stop-yarn.sh
    

    添加下列内容

    YARN_RESOURCEMANAGER_USER=root
    HADOOP_SECURE_DN_USER=yarn
    YARN_NODEMANAGER_USER=root
    
  4. 分发修改后文件(不能直接分发/usr/local/software/hadoop 这个目录如果分发 了这个目录只能重做集群)

    xsync /usr/local/software/hadoop/sbin/
    
  5. 依次执行以下命令,启动Hadoop。

    start-dfs.sh
    start-yarn.sh
    
  6. 启动成功后,执行以下命令,查看已成功启动的进程。

    xcall jps
    

    进程如下

    18240 SecondaryNameNode
    18001 DataNode
    18532 ResourceManager
    17860 NameNode
    18678 NodeManager
    19004 Jps
    
  7. 退出集群

    stop-all.sh
    
  8. 同步环境变量配置文件

    xsync /etc/profile
    xcall source  /etc/profile
    

HDFS 基本操作

  1. 查看 HDFS 文件

    递归列出 HDFS 根目录下多层文件夹的内容

    hadoop fs -ls -R /
    
  2. 在 HDFS 文件中创建目录/user/hadoop

    hadoop fs -mkdir -p /user/hadoop
    
  3. 删除 HDFS 文件中删除 data 文件夹

    hadoop fs -rm -r /data
    
  4. 上传本地 text.txt 文件到 HDFS 文件的/user/hadoop 目录中

    hadoop fs -put /usr/local/hadoop/data/text.txt /user/hadoop
    
  5. 查看 HDFS 文件中 text.txt 的文件内容

    hadoop fs -cat /user/hadoop/text.txt
    
  6. 下 面 演 示 把 HDFS 文 件 上 的 text.txt 文件下载到本地 download 文件系统中

    hadoop fs -get /user/hadoop/text.txt /usr/local/hadoop/data/download/
    
  7. 文件权限,把 HDFS 文件上的 text.txt 文件賦予所有权限

    hadoop fs -chmod 777 /user/hadoop/text.txt
    
  8. 查看文件的权限

    hadoop fs -ls /user/hadoop/
    

报错总结

  1. 报错内容

    Exception in thread "main" java.net.ConnectException: Call From master/172.18.232.60 to master:8020 failed on connection exception: java.net.ConnectException: 拒绝连接;
    

    解决办法:

    域名配置问题,localhost 不能用

    vi /usr/local/software/hadoop/etc/hadoop/core-site.xml
    
    # 配置下面内容
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://master:8020</value>
    </property>
    
  2. hadoop 集群环境多次格式化

    启动 DataNode 节点报错

    解决办法

    找到 hadoop/etc/hadoop/core-site.xml 文件中如下配置, rm -rf cloud/ 删除 value 中的文件夹,重新格式化。

    <property> 
        <name>hadoop.tmp.dir</name>
        <value>/usr/local/software/hadoop/cloud</value> 
    </property>
    

    集群进行格式化

    hdfs namenode -format