今天看啥  ›  专栏  ›  千舞画弥纱丶

VirtualBox 虚拟机下的 Hadoop 分布式集群搭建

千舞画弥纱丶  · 掘金  ·  · 2017-12-12 02:23

前言

运行环境 : VirtualBox 虚拟机
系统配置 : 三台 Ubuntu 14.04.5 (用于配置一台 NameNode,俩台 DataNode)
前置条件 : 将 JDK 和 Hadoop 安装文件复制到 /tools 下面
切换 root 用户
开机前请确认三台机器的 网络配置 如下图

修改三台机器的主机名

apt-get install vim # 首先安装vim
vim /etc/hostname 
# 第一台机器为 namenode节点 改为 hadoop20
# 第二台第三台机器为 datanode 节点 
# 第二台改名为 hadoop21 , 第三台改名为 hadoop2


设置三台机器的静态 ip 地址

# 配置 hadoop20
ifconfig eth0 192.168.1.110

# 配置 hadoop21
ifconfig eth0 192.168.1.111

# 配置 hadoop22
ifconfig eth0 192.168.1.112
  • ip地址修改完毕后,配置集群节点映射 (三台机器都要配置,且内容一致)
    vim /etc/hosts
    
    # 在 /etc/hosts 文件里面加入如下内容
    192.168.1.110 hadoop20
    192.168.1.111 hadoop21
    192.168.1.112 hadoop22
    
    # 这里要注意,打开这个配置文件后将 127.0.1.1 hadoop20 此行删除 (其余两台也要删除)
    

其余两台配置如图

三台机器修改完成之后输入 reboot 命令进行重启,重启后进入终端观察三台机器的机器名是否改变
若发现未改变,请检查 /etc/hostname 文件内容


发现三台机器名已经改变,输入 ping 命令测试是否 ping 通

如果发现无法 ping 通,使再次用 ifconfig eth0 [新的局域网 ip 地址] 命令从新设置一下三台机器的 ip 地址
从新设置后测试还是无法 ping 通,请再次重启设置新的 ip 网段,设置新的网段后请修改 /etc/hosts 文件下面的节点映射,保持 ip 地址和 机器名 一致

# ping 命令如下
# hadoop20 机器输入如下两行命令
ping hadoop21 -c 2
ping hadoop22 -c 2

# hadoop21 机器输入如下两行命令
ping hadoop20 -c 2
ping hadoop22 -c 2

# hadoop22 机器输入如下两行命令
ping hadoop20 -c 2
ping hadoop21 -c 2

  • 若可以 ping 通会显示每次 ping 通的 time , 如图
  • 如出现如下提示,则代表没有 ping

配置 JDK

三台机器上都要配置 JDK 环境

  • 解压改名

    cd /tools # 进入 tools 目录
    tar -zxvf jdk-8u144-linux-x64.tar.gz -C /usr/local # 解压 JDK 到 /usr/local 目录下
    cd /usr/local
    ls
    mv jdk1.8.0_144 jdk
    
  • 添加 JDK 环境变量

    vim /etc/profile +30 [gedit /etc/profile]
    
    # 在文档最后添加
    export JAVA_HOME=/usr/local/jdk
    export PATH=$PATH:$JAVA_HOME/bin:
    export CLASS_PATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    
    :wq! # 退出
    
    source /etc/profile # 立即生效环境变量
    # 接下来测试是否配置成功
    java
    javac
    

配置 SSH 免密码登录

  • 安装 ssh

    apt-get install openssh-server # 如果出错请安装 openssh-client
    
    # 安装完毕以后 启动 ssh 服务
    /etc/init.d/ssh start
    ps -e | grep sshd # 查看 ssh 进程
    
  • 在 Ubuntu 中不允许 root 登录,这里修改为允许 root 账户登录

    vim /etc/ssh/sshd_config +28
    
    # 随后找到 PermitRootLogin 
    # 将 PermitRootLogin 内容修改为 yes 即可
    :wq! 保存退出
    
  • 生成 hadoop20 的公钥,在 hadoop20 节点终端运行

    ssh localhost # 使用此命令登录一次 (会输入一次 yes, 三次 root 密码),用于生成 ~/.ssh 目录
    
    cd ~/.ssh
    
    ssh-keygen -t rsa  # 执行此命令后一直按回车即可,生成的密钥保存为 .ssh/id_rsa
    # 执行成功后会在 ~/.ssh 下生成 id_rsa 私钥文件 和 id_rsa.pub 公钥文件。
    
  • 在 hadoop20 节点配置无密码 ssh 本机,这一步还是在 hadoop20 节点上运行

    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys # 加入授权
    
    # 完成此命令后,运行 ssh 验证一下
    ssh hadoop20
    
    如果出现 ssh: connect to host hadoop21 port 22: No route to host 错误
    请检查 /etc/hosts 文件,将所有的 127 ip段的注释放开,因为前面已经 127.0.1.1 删除,所有不会出现这个错误
    
  • 设定用户权限

    因为笔者的 hadoop20, hadoop21, hadoop22 主机的用户名都是 hadoop2. 所以要给它添加权限让其具有访问其他文件的权力,以便后续使用

    sudo gedit /etc/sudoers
    # 打开 sudoers 文件后,在 root权限那行 后面添加:hadoop2 ALL=(ALL:ALL) ALL
    

  • hadoop20 本机验证 ssh 无问题后将公钥传输到 hadoop21 节点和 hadoop22 节点上

    scp ~/.ssh/id_rsa.pub hadoop2@hadoop21:/home/hadoop2/ 
    
    # 因有时会出现 root 用户权限不够,这里采用 hadoop2 用户
    # scp 有时会要求输入 hadoop21 机器上 hadoop2 用户的密码,输入完成后会提示传输完毕。
    # 接下来切换到 hadoop21 本机上
    
    • 将 hadoop21 的目录切换到 root 用户的根目录下

      cd ~ 
      mkdir ~/.ssh  # 如果不存在该文件夹需先创建,若已存在则忽略本行命令
      
      cp /home/hadoop2/id_rsa.pub ~/.ssh/auhorized_keys # 将 hadoop20 主机的公钥拷贝当前目录下
      
    • 接着在 hadoop21 节点上将 hadoop20 的 ssh 公匙保存到相应位置

      cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
      
    • 切换回 hadoop20 主机,使用如下命令登录

      ssh hadoop21 # 执行结果如下图
      

hadoop22 主机配置和 hadoop21 一致

安装 Hadoop

hadoop 环境只需要在 hadoop20 节点上配置即可,配置完成后通过 SCP 命名分发到每个 DataNode 节点上

  • 解压改名

    cd /usr/local
    tar -zxvf /tools/hadoop-2.7.1.tar.gz -C .  # . 代表当前目录
    ls
    mv hadoop-2.7.1 hadoop # 改名
    cd /hadoop 
    ls # 查看是否有 /bin /sbin 目录
    
  • 添加 Hadoop 环境变量

    vim /etc/profile [gedit /etc/profile]
    
    # 在 JAVA_HOME 后面增加一行 Hadoop 的配置
    export HADOOP_HOME=/usr/local/hadoop
    
    # 接下来修改 PATH 属性
    export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:
        
    :wq! # 保存退出
    source /etc/profile # 让配置立即生效
    hadoop # 查看Hadoop
    hadoop version # 查看 hadoop 的安装版本
    
  • 配置 JDK 依赖

    cd /usr/local/hadoop/etc/hadoop
    ll # 列出详细信息
    
    # 此时要找到一个为“hadoop-env.sh”的文件 (一般在第 8 行)
    vim hadoop-ebv.sh +25
    
    # 将第25 行的   改为如下内容
    export JAVA_HOME=/usr/local/jdk
    :wq # 保存退出
    

到了这里请使用虚拟机备份一下

配置 Hadoop 相关文件

首先要记录下本机 ( hadoop20 节点 ) 的 java 安装目录 /usr/local/jdk
操作之前一定要关闭每台机器的防火墙 sudo ufw disable

编辑 hadoop-env.sh

由于 Hadoop 是基于 Java 编写的,所以需要在 hadoop-env.sh 里设置 JDK 路径。
首先进入 /usr/local/hadoop/etc/hadoop 目录
打开 hadoop-env.sh 文件
找到 JAVA_HOME 变量,将其修改为
export JAVA_HOME=/usr/local/jdk

cd /usr/local/hadoop/etc/hadoop
vim hadoop-env.sh +25
# 修改完成后 :wq 保存退出

配置 slaves

vim slaves

保存所有的 slave 节点 (hadoop21、hadoop22),此文件首行的 localhost 一定要删除

配置 core-site.xml

core-site.xml 配置集群的全局参数,主要定义了系统级别的参数,如 :HDFS URL、Hadoop 的临时目录等信息。

vim core-site.xml

<!-- 在 <configuration> </configuration> 标签里面添加如下 内容-->
      <property>
      <!-- 指定 HDFS 的 nameService,与(hdfs-site.xml)对应 -->
                <name>fs.defaultFS</name>
                <value>hdfs://hadoop20:9000</value>
       </property>
       <property>
       <!-- 指定 hadoop 运行时产生文件的存储路径 -->
               <name>hadoop.tmp.dir</name>
               <value>file:/usr/local/hadoop/hadoop_tmp</value>
               <description>Abase for other temporary directories.</description>
       </property>

配置 hdfs-site.xml

vim hdfs-site.xml

<!-- 在 <configuration> </configuration> 标签里面添加如下 内容-->
       <property>
                <name>dfs.namenode.secondary.http-address</name>
                <value>hadoop20:50090</value>
        </property>
        <property>
         <!-- 文件的副本数,默认为 3;由于笔者只有两台 DataNode  所以这里设置为 2 -->
                <name>dfs.replication</name>
                <value>2</value>
        </property>
        <property>
        <!-- NameNode 数据目录 -->
                <name>dfs.namenode.name.dir</name>
                <value>file:/usr/local/hadoop/hadoop_tmp/dfs/name</value>
        </property>
        <property>
        <!-- DataNode 数据目录 -->
                <name>dfs.datanode.data.dir</name>
                <value>file:/usr/local/hadoop/hadoop_tmp/dfs/data</value>
        </property>

创建 name 和 data 目录

cd /usr/local/hadoop
mkdir -p hadoop_tmp/dfs/name # -p 代表递归创建目录
cd hadoop_tmp/dfs/
mkdir data

cd /usr/local/hadoop/etc/hadoop # 返回上一次的工作目录

配置 yarn-site.xml

vim yarn-site.xml

<!-- 在 <configuration> </configuration> 标签里面添加如下 内容-->
        <property>
        <!-- 指定 YARN 的 ResourceManager 的地址,NameNode 节点中的一个 -->
                <name>yarn.resourcemanager.hostname</name>
                <value>hadoop20</value>
        </property>
        <property>
        <!-- reducer 取数据的方式是 mapreduce_shuffle -->
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
        <property>
                <name>yarn.resourcemanager.address</name>
                <value>hadoop20:8032</value>
        </property>
        <property>
                <name>yarn.resourcemanager.scheduler.address</name>
                <value>hadoop20:8030</value>
        </property>
        <property>
                <name>yarn.resourcemanager.resource-tracker.address</name>
                <value>hadoop20:8031</value>
        </property>
        <property>
                <name>yarn.resourcemanager.admin.address</name>
                <value>hadoop20:8033</value>
        </property>
        <property>
                <name>yarn.resourcemanager.webapp.address</name>
                <value>hadoop20:8088</value>
        </property>

配置 mapred-site.xml

默认文件名为 mapred-site.xml.template
配置这个文件前,需要将这个文件重命名

mv mapred-site.xml.template mapred-site.xml
vim mapred-site.xml

<!-- 在 <configuration> </configuration> 标签里面添加如下 内容-->
  <property>
  <!-- 通知框架 MR 使用 YARN -->
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
  </property>
  <property>
          <name>mapreduce.jobhistory.address</name>
          <value>hadoop20:10020</value>
  </property>
  <property>
          <name>mapreduce.jobhistory.address</name>
          <value>hadoop20:19888</value>
  </property>

将 Hadoop 分发

  • 在 hadoop20 机器配置完成以后, 将 /usr/local/hadoop 文件夹复制到各个节点上

    # 在 hadoop20 节点上执行 : 
    tar -zcf ~/hadoop.master.tar.gz /usr/local/hadoop # 可以先压缩再复制给其他节点
    scp ~/hadoop.master.tar.gz hadoop2@hadoop21:/home/hadoop2/ # 复制到 hadoop21 节点上
    scp ~/hadoop.master.tar.gz hadoop2@hadoop22:/home/hadoop2/ # 复制到 hadoop22 节点上
    
    # 如果未压缩请使用下面的命令 : 
    scp -r /usr/local/hadoop hadoop2@hadoop21:/home/hadoop2/ # 复制到 hadoop21 节点上
    scp -r /usr/local/hadoop hadoop2@hadoop22:/home/hadoop2/ # 复制到 hadoop22 节点上
    
  • 复制完成以后切换到 hadoop21 节点执行 :

    # 采用压缩复制的 请执行 : 
    tar -zxvf /home/hadoop2/hadoop.master.tar.gz -C /usr/local
    
    # 未采用压缩直接复制的 请执行 :
    cp -r /home/hadoop2/hadoop /usr/local
    
注意 : hadoop22 节点上执行的操作和 hadoop21 相同

运行 Hadoop 集群

格式化文件系统

首次启动需要先在 hadoop20 节点执行 namenode 的格式化:

source /etc/profile # 运行之前请在所有节点上生效一下环境变量
rm -r /usr/local/hadoop/logs/* # 清空日志文件

cd /usr/local/hadoop/bin
hdfs namenode -format # 格式化文件系统

特别注意 : 首次运行需要执行初始化,之后尽量不要再次执行此命令;如果出现错误必须重新格式化,请删除 /usr/local/hadoop 目录下面的 hadoop_tmp 文件夹

启动集群

  • 当格式化通过之后,就可以启动 hadoop 了,启动必须在 hadoop20 节点上运行
    start-dfs.sh
    

  • 通过 web 界面查看是否配置成功

    • 在 hadoop20 节点打开浏览器后在网址栏输入 hadoop20:50070
  • 启动 strat-yarn.sh

    start-yarn.sh
    
    • 执行此命令后会在三台机器上增加一个进程
  • 通过 hdfs dfsadmin -report 命令,查看集群是否正常启动

  • 可选启动命令 mr-jobhistory-daemon.sh start historyserver

    这个脚本的服务是实现 web 查看作业的历史运行情况
    有些情况下,作业运行完了,在 web 端就无法查看运行情况
    可以通过开启这个的守护进程来达到查看历史任务

关闭集群

# 关闭集群的操作必须在 hadoop20 执行
stop-yarn.sh
stop-dfs.sh            # 单独启动 HDFS 集群
start-mapred.sh    # 单独启动 Map/Reduce 
start-all.sh             # 同时启动HDFS和Map/Reduce
mr-jobhistory-daemon.sh stop historyserver

# 从主节点 master 关闭 hadoop,主节点会关闭所有从节点的 hadood
stop-all.sh

HDFS 常用操作

hadoop fs -ls 
# 列出HDFS下的文件

hadoop fs -mkdir /input
# 在 HDFS / 目录下创建 input 文件夹

hadoop fs -ls /input 
# 列出 HDFS 下某个文档中的文件

hadoop fs -put test1.txt /input/test 
# 上传文件到指定 HDFS /input 目录下并重新命名,只有所有的 DataNode 都接收完数据才算成功

hadoop fs -get /in getin 
# 从 HDFS 获取文件并且重新命名为 getin,同 put 一样可操作文件也可操作目录

hadoop fs -rmr /output
# 从 HDFS 上删除指定文件

hadoop fs -cat /input/* 
# 查看 HDFS 上 input 目录的内容

hdfs dfsadmin -report 
# 查看 HDFS 的基本统计信息

hdfs dfsadmin -safemode enter # 进入安全模式
hdfs dfsadmin -safemode leave # 退出安全模式

负载均衡

start-balancer.sh
# 可以使 DataNode 节点上选择策略 重新平衡 DataNode 上的数据块的分布

参考博客 :
关于mr-jobhistory-daemon.sh的一些了解
Hadoop分布式集群安装
Hadoop集群配置(最全面总结)
Hadoop2.7.2之集群搭建(高可用)
Hadoop集群安装配置教程_Hadoop2.6.0_Ubuntu/CentOS




原文地址:访问原文地址
快照地址: 访问文章快照