在CentOS7下搭建Hadoop集群及踩坑记

1 准备工作

1.1 节点准备

在开始安装系统之前,我们需要先准备5个节点,他们均通过CentOS 7 Minimal方式安装。网络及系统规划如下:

主机名称IP地址操作系统身份
master192.168.137.100CentOS 7NameNode、ResourceManager、NtpServer
secondary192.168.137.101CentOS 7SecondaryNameNode、NodeManager
slave1192.168.137.102CentOS 7DataNode、NodeManager
slave2192.168.137.103CentOS 7DataNode、NodeManager
slave3192.168.137.104CentOS 7DataNode、NodeManager
主机NNDNRMNMHive
masterYYY
secondaryYYY
slave1YY
slave2YY
slave3YY

1.2 系统架构

在开始配置master和slave节点之前,了解Hadoop集群的不同组件十分重要。

1.2.1 Master ——NameNode

主节点上主要包括了分布式文件系统、资源调度。它主要包括两个守护进程:

1、NameNode

主要用来管理分布式文件系统,保存HDFS的元数据信息,比如命名空间信息、块信息等。类似于Linux Ext4文件系统的inode信息,Windows FAT文件系统的文件分配表。

当它运行的时候,这些信息是放在内存中的,只有重启的时候,才会将这些信息持久化到磁盘中。

《在CentOS7下搭建Hadoop集群及踩坑记》 NameNode功能

2、ResourceManager

通过YARN来管理资源,让分布式系统中的任务,可以在各个slave节点上正常执行。

1.2.2 Secondary——NameNode

单从名字上,它好像是Master NameNode的备份,实际上不是,它是用来在系统中提供CheckPoint Node——辅助NameNode正常工作的。

《在CentOS7下搭建Hadoop集群及踩坑记》 Secondary NameNode功能

1.2.3 slave——数据节点

数据节点主要用来保存实际的数据,以及运行各种任务。一般也包括两个守护进程:

1、DataNode

从物理层面负责数据的存储。

2、NodeManager

管理节点上任务的执行。

2. 系统安装

为了方便,建议大家使用Vmware虚拟机安装——可以安装一个系统,装好必要的软件JDK并设置好环境变量之后,再克隆生成其他几个。

2.1 系统准备

CentOS下载: http://mirrors.163.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso

VMware Workstation Pro v14.0下载: https://download3.vmware.com/software/wkst/file/VMware-workstation-full-14.0.0-6661328.exe

 序列号:**FF31K-AHZD1-H8ETZ-8WWEZ-WUUVA**

2.2 系统安装

2.2.1 安装CentOS 7

安装5台CentOS系统,名称分别为master、secondary、slave1、slave2和slave3。

《在CentOS7下搭建Hadoop集群及踩坑记》 5个VMware虚拟机系统安装完毕

2.2.2 创建用户并设置密码

在每台电脑上,分别执行以下指令创建用户,设置密码:

useradd -m hadoop -G hadoop -s /bin/bash
passwd hadoop

2.2.3 配置网络

我们通过手工方式来设置电脑的IP地址。注意:每台电脑的IP地址应该是不一致的。

sudo vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static           # 静态IP地址
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=9b6a5e1f-fd3b-4324-ab4c-7b2be4846ca8
DEVICE=ens33
ONBOOT=yes                  # 开机自动启用
IPADDR="192.168.137.100"    # IP地址(同一网络中,每台应该不一致)
PREFIX="24"
GATEWAY="192.168.137.2"     # 网关
DNS1="61.128.192.68"        # DNS服务器
ZONE=public

2.2.4 配置主机名

编辑每台电脑上的/etc/hostname,依次设置为:

master

master

secondary

secondary

slave1

slave1

slave2

slave2

slave3

slave3

2.2.5 配置主机域名解析

将每台电脑上的/etc/hosts,全部按照以下设置(全都一样):

192.168.137.100 master
192.168.137.101 secondary
192.168.137.102 slave1
192.168.137.103 slave2
192.168.137.104 slave3

2.3 软件安装

2.3.1 Java安装

执行以下指令,安装JDK(Java Development Kit)——Hadoop运行必备。

yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel
yum install wget
yum install ntp

2.3.2 设置Java环境变量

先编辑/etc/profile,在文件最后加入以下内容:

 # Setting Java Home Environment
 export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64
 export PATH=$PATH:$JAVA_HOME/bin

然后执行:

source /etc/profile
java -version

如果看到以下信息,则说明JDK安装成功:

《在CentOS7下搭建Hadoop集群及踩坑记》 Java安装成功

2.4网络设置

2.4.1 关闭防火墙

systemctl disable firewalld
systemctl stop firewalld

2.4.2 关闭SELinux

SELinux是用来加强Linux安全的一种机制,不过在使用hadoop的时候,最好在每台电脑上都关闭它:

1、临时关闭

命令行执行:

setenforce 0

2、永久关闭

编辑/etc/selinux/config文件,将:

SELINUX=enforcing

修改为:

SELINUX=disable

重启计算机之后,即永久生效。

2.4.3 设置免密登录

Hadoop集群的启动,是master来自动控制其他计算机的。为了达到这个目标,我们首先要在master上可以不用输入密码通过ssh登录secondary、slave1、slave2和slave3计算机。

1、设置密钥

在master电脑上,执行以下指令生成密钥(ssh-keygen的生成步骤比较多,可以直接按回车):

ssh-keygen -t rsa

2、分发密钥

接下来分发密钥到每台电脑上(包括本机的Master):

ssh-copy-id master
ssh-copy-id secondary
ssh-copy-id slave1
ssh-copy-id slave2
ssh-copy-id slave3

3、测试免密登录

在master电脑上,执行:

ssh master
ssh secondary
ssh slave1
ssh slave2
ssh slave3

如果可以全部不用输入密码访问,则大功告成。

3 安装Hadoop

绝大多数朋友采用的Hadoop安装方式,都是通过手工方式安装的,本文也是如此。

3.0 准备hadoop安装目录

在每台电脑上,执行以下指令准备hadoop安装目录:

sudo mkdir -p /opt/hadoop
sudo chown -R hadoop /opt/hadoop

3.1 下载hadoop

hadoop目前的最新版本,是3.0.1。所有的版本,都可以在 这里下载。

这个压缩包里面,已经包括了Hadoop HDFS、Yarn、Map Reduce等各种组件,我们不需要单独下载。

cd /home/hadoop
wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-3.0.1/hadoop-3.0.1.tar.gz
sudo mkdir -p /opt/hadoop
sudo chown -R hadoop /opt/hadoop

3.2 解压缩

tar zxvf hadoop-3.0.1.tar.gz

这样一来,在/home/hadoop/下会出现一个hadoop-3.0.1子目录,Hadoop的所有组件都在这个目录中——它就是Hadoop系统的家目录,将它拷贝到/opt/hadoop下。

mv hadoop-3.0.1/* /opt/hadoop/

3.3 配置HDFS运行环境

同样,编辑/etc/profile。在文件的最后,加入以下内容:

 # Hadoop Environment Variables
 export HADOOP_HOME=/opt/hadoop/
 export HADOOP_INSTALL=$HADOOP_HOME
 export HADOOP_MAPRED_HOME=$HADOOP_HOME
 export HADOOP_COMMON_HOME=$HADOOP_HOME
 export HADOOP_HDFS_HOME=$HADOOP_HOME
 export YARN_HOME=$HADOOP_HOME
 export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
 export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_HOME/lib/native"
 export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
 export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib:$JRE_HOME/  lib:$HADOOP_HOME/share/hadoop/common/*:$HADOOP_HOME/share/hadoop/common/lib/*:$HADOOP_HOME/share/hadoop/mapreduce/*

3.4 配置Hadoop

hadoop的配置文件,都位于$HADOOP_HOME/etc/hadoop目录下。

3.4.1 hadoop-env.sh

用vi编辑hadoop-env.sh文件。

vi /opt/modules/hadoop/etc/hadoop/hadoop-env.sh

配置JAVA_HOME变量:

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64

3.4.1 core-site.xml

用vi编辑core-site.xml文件。

vi $HADOOP_HOME/etc/hadoop/core-site.xml

具体配置信息如下:

<?xml version="1.0" encoding="UTF-8"?>
 <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
 <configuration>
     <!-- 指定HDFS老大(namenode)的通信地址 -->
     <property>
         <name>fs.defaultFS</name>
         <value>hdfs://master:9000</value>
     </property>

     <!-- 指定hadoop运行时产生文件的存储路径 -->
     <property>
         <name>hadoop.tmp.dir</name>
         <value>file:/home/hadoop/data/hadoop</value>
     </property>
 </configuration>

3.4.2 hdfs-site.xml

vi $HADOOP_HOME/etc/hadoop/hdfs-site.xml

具体配置信息如下:

<!-- /opt/hadoop/etc/hadoop/hdfs-site.xml --> 
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
        <!-- 设置namenode的http通讯地址 -->
        <property>
                <name>dfs.namenode.secondary.http-address</name>
                <value>master:50090</value>
        </property>
        <!-- 设置hdfs副本数量 -->
        <property>
                <name>dfs.replication</name>
                <value>2</value>
        </property>
         <!-- 设置namenode存放的路径 -->
        <property>
                <name>dfs.namenode.name.dir</name>
                <value>file:/home/hadoop/data/hadoop/dfs/name</value>
        </property>
         <!-- 设置datanode存放的路径 -->
        <property>
                <name>dfs.datanode.data.dir</name>
                <value>file:/home/hadoop/data/hadoop/dfs/data</value>
        </property>
        <!-- 设置Secondary NameNode的地址 -->
        <property>
             <name>dfs.secondary.http.address</name>
             <value>secondary:50090</value>
         </property>
</configuration>

3.4.3 配置slaves

在/opt/hadoop/etc/hadoop/slaves(hadoop 2.x及以前的版本,文件名为slaves, 3.x之后为workers,hostname或者IP地址,一行一个:

vi $HADOOP_HOME/etc/hadoop/slaves
slave1
slave2
slave3

3.4.4 分发

1、创建需要分发配置文件的机器列表 /opt/hadoop/machines,包括如下内容:

secondary
slave1
slave2
slave3

2、分发hadoop

for  x  in  `cat /opt/hadoop/machines` ; \
    do  echo  $x ; \
        scp  -r /opt/hadoop/  $x:/opt/hadoop/ ; \
    done;

3.4.5 运行HDFS

1、格式化hdfs文件系统

在master上,执行:

hdfs  namenode  -format

格式化文件系统。

2、启动hdfs服务

在hadoop-master上,执行:

start-dfs.sh

你会看到启动了一个NameNode,一个Secondary NameNode和3个DataNode。

《在CentOS7下搭建Hadoop集群及踩坑记》 HDFS文件系统启动中

3.4.4 测试启动成功

在hadoop-master和各台计算机上,分别执行执行:

jps

你会看到程序的运行结果。

1、Hadoop-master

主要包括NameNode进程。

《在CentOS7下搭建Hadoop集群及踩坑记》 Master

2、Hadoop-Secondary

主要包括Secondary NameNode进程。

《在CentOS7下搭建Hadoop集群及踩坑记》 secondary

3、Hadoop-slave1、Hadoop-slave2和Hadoop-slave3

主要包括DataNode进程。

《在CentOS7下搭建Hadoop集群及踩坑记》 slave

3.5 配置YARN和Map Reduce

3.5.1 配置mapreduce

编辑mapred-site.xml 文件:

vi $HADOOP_HOME/etc/hadoop/mapred-site.xml
<?xml version="1.0" encoding="UTF-8"?>
 <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
 <configuration>
         <!-- 通知框架MR使用YARN -->
         <property>
                 <name>mapreduce.framework.name</name>
                 <value>yarn</value>
         </property>
         <property>
                 <name>mapreduce.jobhistory.address</name>
                 <value>master:10020</value>
         </property>
         <property>
                 <name>mapreduce.jobhistory.webapp.address</name>
                 <value>master:19888</value>
         </property>
 </configuration>

3.5.2 配置YARN

编辑yarn-site.xml文件:

vi $HADOOP_HOME/etc/hadoop/yarn-site.xml
<?xml version="1.0"?>
 <configuration>
  <!-- 设置 resourcemanager 在哪个节点-->
 <!-- Site specific YARN configuration properties -->
         <property>
          <name>yarn.resourcemanager.hostname</name>
                 <value>master</value>
         </property>
          <!-- reducer取数据的方式是mapreduce_shuffle -->
         <property>
                 <name>yarn.nodemanager.aux-services</name>
                 <value>mapreduce_shuffle</value>
         </property>

 </configuration>

3.5.3 启动YARN

执行以下指令启动yarn:

start-yarn.sh

《在CentOS7下搭建Hadoop集群及踩坑记》 Yarn启动中

这将会启动ResourceManager和NodeManager。

其中,ResourceManager在NodeName上运行,NodeManager在Slave上运行。

《在CentOS7下搭建Hadoop集群及踩坑记》 NodeManager在slave上运行

4 安装ntp时间服务

hadoop服务,要求各个节点的时间严格同步,所以我们需要在master上创建一个ntp时间服务,其他节点跟它同步。

4.1 安装ntp服务

执行以下指令安装:

sudo yum install ntp

4.2 配置时间同步

我们使用,hadoop、hbase等服务时,要求各个节点的时间严格同步。这就需要用到时间同步服务器,不过我们常见的Internet时间同步服务器不太靠谱,所以我们需要搭建一个ntp时间服务——最好让其他节点与它同步。

4.2.1 最简单的方法

直接与Aliyun时钟服务器同步:

传送门: ntp时间同步配置

5 安装hive

5.1 安装hive

5.1.1 准备工作

​ 在master上下载、解压缩

wget wget http://mirrors.hust.edu.cn/apache/hive/hive-3.1.0/apache-hive-3.1.0-bin.tar.gz
tar zxvf apache-hive-3.1.0-bin.tar.gz

5.1.2 转移到Hive目录

在每台电脑上,创建hive目录:

sudo mkdir -p /opt/hive

在master电脑上,转移文件到Hive目录

sudo mv apache-hive-3.1.0-bin/* /opt/hive/

5.1.4 设置hive目录访问权限

chown -R hadoop:hadoop /opt/hive

5.1.4 分发Hive目录到所有节点

for  x  in  `cat /opt/hadoop/machines` ; \
    do  echo  $x ; \
        scp  /opt/hive/  $x:/opt/hive/ ; \
    done;

5.1.5 设置Hive环境变量

sudo vi /etc/profile
 export HIVE_HOME=/opt/hive
 export PATH=$PATH:$HIVE_HOME/bin

《在CentOS7下搭建Hadoop集群及踩坑记》 配置hive环境变量

5.2 配置hive目录及访问权限

在hadoop-master上,执行以下指令:

hadoop fs -mkdir /tmp
hadoop fs -mkdir /user
hadoop fs -mkdir /user/hive
hadoop fs -mkdir /user/hive/warehouse
hdfs dfs -chmod g+w /tmp
hdfs dfs -chmod g+w /user/hive/warehouse

《在CentOS7下搭建Hadoop集群及踩坑记》 创建Hive数据目录

5.3 配置hive

默认配置下的Hive,使用的是Derby元数据库,它只能从本地连接,并且只支持一个用户。所以我们就直接改为MySQL数据库作为元数据库。

5.3.1安装MySQL

sudo yum install mariadb-server mariadb
sudo systemctl start mariadb
sudo systemctl enable mariadb

5.3.2 配置MySQL允许远程访问

MySQL默认配置下,不允许远程访问。我们要修改为允许远程访问。在Master主机上,执行以下指令登录MySQL:

mysql -u root

然后新建root可以从远程访问的账号,并授权:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
FLUSH PRIVILEGES;

5.3.1 设置环境变量

5.3.2 配置hive-env.sh

cd /opt/hive/conf
cp hive-env.sh.template hive-env.sh
vi hive-env.sh

主要配置一个参数:指定HADOOP_HOME目录。如果本机已经安装了Hadoop,并且设置了HADOOP_HOME环境变量,则不需要配置。

《在CentOS7下搭建Hadoop集群及踩坑记》 指定hadoop家目录

5.3.2 设置hive-site.xml

修改hive配置文件

cd hive-2.3.3/conf 
cp hive-default.xml.template hive-site.xml
vi hive-site.xml
   <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
      <name>system:java.io.tmpdir</name>
      <value>/opt/hive/iotmp</value>
    </property>
    <property>
      <name>system:user.name</name>
      <value>${user.name}</value>
  </property>
  <!-- 数据库地址设置 -->
   <property>
     <name>javax.jdo.option.ConnectionURL</name>
     <value>jdbc:mysql://master:3306/metastore?createDatabaseIfNotExist=true</value>
   </property>
   <property>
     <name>javax.jdo.option.ConnectionDriverName</name>
     <value>com.mysql.jdbc.Driver</value>
   </property>
  
   <!-- MySQL账号和密码设置 -->
   <property>
     <name>javax.jdo.option.ConnectionUserName</name>
     <value>root</value>
   </property>
   <property>
     <name>javax.jdo.option.ConnectionPassword</name>
     <value>All4Icode</value>
   </property>
</configuration>

5.3.6 准备MySQL驱动

sudo yum install unzip
wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.47.zip
unzip mysql-connector-java-5.1.47.zip
cp mysql-connector-java-5.1.47/mysql-connector-java-5.1.47.jar /opt/hive/lib

5.3.7 初始化MySQL元数据库

schematool -initSchema -dbType mysql

看下初始化的数据库信息:

schematool -dbType mysql -info

《在CentOS7下搭建Hadoop集群及踩坑记》 初始化数据库

5.4 启动

[hadoop@master ~]$ hive

hive> show databases;
OK
default
Time taken: 1.139 seconds, Fetched: 1 row(s)
hive> create table test(id int, name string);
OK
Time taken: 0.742 seconds
hive> show tables;
OK
test
Time taken: 0.082 seconds, Fetched: 1 row(s)
hive>

5.5 简单使用

5.5.1 看下hive在hdfs中创建的目录

hadoop fs -ls -R /user/hive

《在CentOS7下搭建Hadoop集群及踩坑记》 目录创建成功

5.5.2 看下hive在MySQL中创建的表

mysql> use metastore;
mysql> select * from TBLS;

《在CentOS7下搭建Hadoop集群及踩坑记》 MySQL中也有对应的数据库和表

6 安装HBase

6.0 HBase架构图

《在CentOS7下搭建Hadoop集群及踩坑记》 HBase架构图

6.1 准备工作

1、下载

wget http://mirrors.shu.edu.cn/apache/hbase/2.0.2/hbase-2.0.2-bin.tar.gz

2、解压缩

tar zxvf hbase-2.0.2-bin.tar.gz

3、设置目录

在Master电脑上:

sudo mkdir /opt/hbase
sudo chown -R hadoop:hadoop /opt/hbase
mv hbase-2.0.2/* /opt/hbase/

secondary、slave1、slave2、slave3电脑上:

sudo mkdir /opt/hbase
sudo chown -R hadoop:hadoop /opt/hbase

4、设置HBase环境变量
我们计划在master电脑启用HBase master、几台slave电脑上启用RegionServer。

在master电脑上,编辑/etc/profile文件,加入相关的环境变量:

sudo vi /etc/profile

在文件的最后加入以下信息:

export HBASE_HOME=/opt/hbase
export PATH=$PATH:$HBASE_HOME/bin

分发到每台电脑上,执行以下指令使设置生效:

sudo scp /etc/profile root@slave1:/etc/profile
sudo scp /etc/profile root@slave2:/etc/profile
sudo scp /etc/profile root@slave3:/etc/profile

master、slave1、slave2、slave3电脑上分别执行以下指令:

source /etc/profile

6.2 配置

HBase的配置文件,都位于$HBASE_HOME下的conf目录中:

1、hbase-env.sh
主要用来设置JAVA_HOME环境变量,我们是集中在/etc/profile中进行设置——这里可以不用设置。

# 根据自己的实际JAVA_HOME目录配置
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64

# 默认使用自带的Zookeeper,配置为false则使用我们部署的
export HBASE_MANAGES_ZK=false

2、 hbase-site.xml

     <property>
         <name>hbase.tmp.dir</name>
         <value>home/hadoop/data/hbase/tmp</value>
     </property>

      # HBase的hdfs根目录
     <property>
         <name>hbase.rootdir</name>
         <value>hdfs://master:9000/hbase</value>
     </property>

    #采用zookeeper分部署部署
     <property>
         <name>hbase.cluster.distributed</name>
         <value>true</value>
     </property>
    
    # zookeeper节点
     <property>
         <name>hbase.zookeeper.quorum</name>
         <value>slave1,slave2,slave3</value>
     </property>

3、 regionservers
编辑regionservers:

vi $HBASE_HOME/conf/regionservers

保证内容如下:

 slave1
 slave2
 slave3

6.3 分发文件

scp -r /opt/hbase/* slave1:/opt/hbase
scp -r /opt/hbase/* slave2:/opt/hbase
scp -r /opt/hbase/* slave3:/opt/hbase

6.3 启动HBase

执行start-hbase.sh。

start-hbase.sh

至此,包括hadoop、yarn、hive和HBase不适用HA的服务器集群搭建完毕。

    原文作者:Jackeroo
    原文地址: https://www.jianshu.com/p/7f7f1dba3909
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞