本例用4台主机模拟Hadoop高可用+自动切换NameNode(真实环境中的百台、千台主机也是如此配置)

四台主机的hostname分别是node01、node02、node03和node04.

各主机节点在HA中的角色如下:

hadoop机器下线_hadoop

NN表示NameNode
DN表示DataNode
ZK表示Zookeeper
ZKFC表示Zookeeper Failover Controller
JNN表示JournalNode
本例中,
node01、node02节点启动NameNode
node01、node02节点启动ZKFC
node02、node03、node04节点启动DataNode
node02、node03、node04节点启动zookeeper集群
node01、node02、node03阶段启动JournalNode集群

node01节点为启动脚本节点。
(请务必保证所有集群的机器的系统时间一致!!!)

一、更新系统并安装文件传输

sudo yum update -y
sudo yum install -y lrzsz

二、在各自的主机中, 将node01到node04配置到hosts中, 方便后续的部署操作。

#编辑hosts文件
vim /etc/hosts

#添加hosts
172.18.44.81    node01
172.18.44.82    node02
172.18.44.83    node03
172.18.44.84    node04

#关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
#将SELINUX的值改成disabled
vim /etc/selinux/config
SELINUX=disabled

hadoop机器下线_hadoop机器下线_02

#重启服务器
reboot

三、配置免密登陆
其中,用于启动hadoop集群的节点主机需要配置与其他所有节点的免密登陆;多个NameNode节点之间需要互相免密登陆,NameNode节点自己与自己也要免密登陆。

#如果root下没有.ssh文件夹请自行创建
cd /root/.ssh 
ssh-keygen -t dsa -P '' -f ./id_dsa
cat ./id_dsa.pub > ./authorized_keys 

#将生成的公钥文件id_dsa.pub,发送到需要免密登陆的所有节点主机的/root/.ssh路径上,并将其内容加入到authorized_keys文件中. >:表示覆盖  >>:表示追加
cat ./id_dsa.pub >> ./authorized_keys

四、在所有节点主机上安装JDK(本demo以jdk8-download为例)

#配置环境变量
vim /etc/profile

#在文件末尾添加
export JAVA_HOME=/usr/local/jdk1.8.0_181
export CLASS_PATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH


#保存并刷新文件
source /etc/profile

五、ZooKeeper集群的搭建(node02, node03, node04)

#下载ZooKeeper包并解压
tar -zxf /usr/local/zookeeper-3.4.13.jar

#配置环境变量
vim /etc/profile

#添加环境变量
export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.13
export PATH=$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$PATH

#保存刷新配置
source /etc/profile
#配置ZooKeeper的配置文件
cd /usr/local/zookeeper-3.4.13/conf

#拷贝一份配置文件
cp zoo_sample.cfg zoo.cfg

编辑配置文件
vim zoo.cfg

#修改配置
dataDir=/var/kid/zk

#在文件末尾添加配置
server.1=172.18.44.82:2888:3888
server.2=172.18.44.83:2888:3888
server.3=172.18.44.84:2888:3888

#创建文件夹
mkdir -p /var/kid/zk

#创建myid文件
echo 1 > /var/kid/zk/myid

node01的ZooKeeper配置完成。 在node03和noded04上页做同样的环境变量配置。然后将整个hadoop文件夹拷贝到node03和node04上, 并在其上创建相同的myid文件, 内容分别是2和3

#node03和node04配置环境变量
vim /etc/profile
#node03和node04添加环境变量
export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.13
export PATH=$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$PATH
#node03和node04保存刷新配置
source /etc/profile
#拷贝到node03节点
scp -r ./zookeeper-3.4.12/ node03:`pwd`
#创建文件夹
mkdir -p /var/kid/zk
#创建myid文件
echo 2 > /var/kid/zk/myid


#拷贝到node04节点
scp -r ./zookeeper-3.4.12/ node04:`pwd`
#创建文件夹
mkdir -p /var/kid/zk
#创建myid文件
echo 3 > /var/kid/zk/myid
#分别在node02, node03, node04启动ZooKeeper
zkServer.sh start

#分别在node2,node03, node04查看ZooKeeper运行状态
zkServer.sh status

#出现以下提示表示启动成功
#node02提示:
#ZooKeeper JMX enabled by default
#Using config: /usr/local/zookeeper-3.4.13/bin/../conf/zoo.cfg
#Mode: follower

#node03提示
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.13/bin/../conf/zoo.cfg
Mode: leader

#node04提示
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.13/bin/../conf/zoo.cfg
Mode: follower

六、Hadoop的安装

#在node01创建hadoop文件夹
cd /usr/local
mkdir hadoop
cd hadoop

#解压hadoop
tar -zxvf hadoop-3.1.0.tar.gz

#修改环境变量
vim /etc/profile

#在文件最后添加
export HADOOP_HOME=/usr/local/hadoop/hadoop-3.1.0
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

#刷新配置文件
source /etc/profile

六、修改hadoop配置文件(/usr/local/hadoop/etc/hadoop下)

vim /usr/local/hadoop/etc/hadoop/hadoop-env.sh

#修改文件中的JAVA_HOME为:
export JAVA_HOME=/usr/local/jdk1.8.0_181
#修改hdfs-site.xml
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>

    <property>
        <name>dfs.nameservices</name>
        <value>mycluster</value>
    </property>

    <property>
        <name>dfs.ha.namenodes.mycluster</name>
        <value>nn1,nn2</value>
    </property>

    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn1</name>
        <value>node01:8020</value>
    </property>

    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn2</name>
        <value>node02:8020</value>
    </property>

    <property>
        <name>dfs.namenode.http-address.mycluster.nn1</name>
        <value>node01:50070</value>
    </property>

    <property>
        <name>dfs.namenode.http-address.mycluster.nn2</name>
        <value>node02:50070</value>
    </property>

    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
    </property>

    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/var/kid/hadoop/ha/jn</value>
    </property>

    <property>
        <name>dfs.client.failover.proxy.provider.mycluster</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>

    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>sshfence</value>
    </property>

    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/root/.ssh/id_dsa</value>
    </property>

    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>

</configuration>
#修改core-site.xml
<configuration>

    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://mycluster</value>
    </property>

    <property>
        <name>hadoop.tmp.dir</name>
        <value>/var/kid/hadoop/ha</value>
    </property>

    <property>
        <name>ha.zookeeper.quorum</name>
        <value>node02:2181,node03:2181,node04:2181</value>
    </property>

</configuration>
#修改DataNode节点, Hadoop 2.X中是修改Slaves文件, Hadoop 3.x中则是修改workers文件
node02
node03
node04

将node01节点配置好的Hadoop文件夹整个拷贝到其他所有节点上
scp -r /usr/local/Hadoop node02:/usr/local/Hadoop
scp -r /usr/local/Hadoop node03:/usr/local/Hadoop
scp -r /usr/local/Hadoop node04:/usr/local/Hadoop

#在其中一台NameNode上格式化ZooKeeper
hdfs zkfc -formatZK
#手动启动所有journalNode节点的journalNode功能(Node01, Node02, Node03)
#Hadoop 2.X启动方式 
hadoop-daemon.sh start journalnode

#Hadoop 3.X启动方式
hdfs --daemon start journalnode
#在其中一台NameNode上格式化NameNode
hdfs namenode -format 

#启动这台NameNode,以便于其他所有的NameNode同步
#Hadoop 2.X启动方式
hadoop-daemon.sh start namenode
#Hadoop 3.x启动方式
hdfs --daemon start namenode
#其他NameNode同步(ha模式, 本例和企业中大部分使用此模式)
hdfs namenode -bootstrapStandby

#其他NameNode同步(非ha模式,本例中不启用此模式)
hdfs namenode -initializeSharedEdits
#启动Hadoop
start-dfs.sh

通过浏览器浏览:http://node01:50070或http://node02:50070可以查看hadoop状态页面

七、YARN的安装配置

hadoop机器下线_hadoop机器下线_03

YARN主从模式, 高可用。 跟上面配置一样, YARN中的ResourceManager(承载调度)安装在node03和node04中, 而NodeManager随DataNode一起启动(承载计算)

#在mapred-site.xml中进行配置, 开启yarn
vim mapred-site.xml
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>
#在yarn-site.xml中进行配置
vim yarn-site.xml
<configuration>

    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>

    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>

    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>cluster1</value>
    </property>

    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>

    <property>
         <name>yarn.resourcemanager.hostname.rm1</name>
         <value>node03</value>
    </property>

    <property>
         <name>yarn.resourcemanager.hostname.rm2</name>
         <value>node04</value>
    </property>

    <property>
         <name>yarn.resourcemanager.zk-address</name>
         <value>node02:2181,node03:2181,node04:2181</value>
    </property>

</configuration>
#将上述两个配置文件分发到其他所有节点主机中
scp mapred-site.xml yarn-site.xml node02:`pwd`
scp mapred-site.xml yarn-site.xml node03:`pwd`
scp mapred-site.xml yarn-site.xml node04:`pwd`
#启动YARN
start-yarn.sh

#如果node03和node04节点上的resourcemanager没有启动,则手动启动
yarn-daemon.sh start resourcemanager

Eclipse开发Hadoop
一、 设置环境变量

设置HADOOP_HOME环境变量, 值为本地Hadoop的文件夹路径
设置HADOOP_USER_NAME环境变量, 值为root
重启计算机

二、创建MAVEN工程

#在POM文件中引入jar包
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.kid</groupId>
    <artifactId>example</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>example</name>
    <url>http://maven.apache.org</url>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>jdk.tools</groupId>
            <artifactId>jdk.tools</artifactId>
            <version>1.8</version>
            <scope>system</scope>
            <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-hadoop-boot</artifactId>
            <version>2.5.0.RELEASE</version>
        </dependency>


        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </dependency>

    </dependencies>

</project>
将Hadoop中的core-site.xml和hdfs-site.xml拷贝到项目中的resources文件夹下.
如果配置文件中使用了别名,一定要在hdfs-site.xml中加入如下配置,否则无法连接
<property>
    <name>dfs.client.use.datanode.hostname</name>
    <value>true</value>
</property>
并在resources文件夹下建立log4j.properties文件, 内容如下:
log4j.rootLogger=WARN, stdout
# log4j.rootLogger=WARN, stdout, logfile

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= %d %p [%c] - %m%n

log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern= %d %p [%c] - %m%n
#在App.java中代码如下:
package com.kid.example;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class App implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    @Override
    public void run(String... args) throws Exception {

        Configuration config = new Configuration(true);
        FileSystem fs = FileSystem.get(config);

        Path dirs = new Path("/data");
        if (fs.exists(dirs)) {
            fs.delete(dirs, true);
        }

        fs.create(dirs);
        fs.close();

        System.out.println("OK");
    }
}

HIVE安装
node01:数据库
node02:metastoreserver
node03:client

一、在node01节点上安装mysql数据库(参考文章
二、安装hive的1.2.1版本,将apache-hive-1.2.1-bin.tar.gz上传到node02节点,并上传与mysql版本对应的连接驱动mysql-connector-java-8.0.11到node02节点上。
三、在node02上安装hive

tar -zxf apache-hive-1.2.1-bin.tar.gz

将驱动jar包拷贝到hive的lib文件夹中

mv mysql-connector-java-8.0.11.jar apache-hive-1.2.1-bin/lib/

设置环境变量

export HIVE_HOME=/usr/local/apache-hive-1.2.1-bin

添加path

...:$HIVE_HOME/bin:...

进入hive的conf文件夹下,编辑相关配置文件

mv hive-default.xml.template hive-site.xml
vim hive-site.xml
<configuration>
    <property>
        <name>hive.metastore.warehouse.dir</name>
        <value>/user/hive/warehouse</value>
    </property>

    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://node01:3306/hive?createDatabaseIfNotExist=true</value>
    </property>

    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.cj.jdbc.Driver</value>
    </property>

    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>数据库账号(root)</value>
    </property>

    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>数据库密码(123)</value>
    </property>

</configuration>

四、在node03上安装hive, 作为我们的客户端
将node02上的hive文件夹拷贝到node03上

scp -r apache-hive-1.2.1-bin/ node03:`pwd`

进入到conf文件夹中编辑相关配置文件

vim hive-site.xml
<configuration>

    <property>
        <name>hive.metastore.warehouse.dir</name>
        <value>/user/hive/warehouse</value>
    </property>

    <property>
        <name>hive.metastore.uris</name>
        <value>thrift://node02:9083</value>
    </property>

</configuration>

替换掉node03下的jLine jar包

cp /usr/local/apache-hive-1.2.1-bin/lib/jline-2.12.jar /usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/

五、在node02启动hive metastore

hive --service metastore
#后台启动
hive --service metastore &

六、在node03启动hive客户端进行访问

hive

HBASE的安装
node01: HMaster
node02: HRegionServer
node03: HRegionServer
node04: HMaster(backup)
安装的hbase-0.98.12.1-hadoop2-bin.tar版本
一、解压hbase-0.98.12.1-hadoop2-bin.tar

tar -zxf hbase-0.98.12.1-hadoop2-bin.tar.gz

二、在node01~node04上修改环境变量

vim /etc/profile

export HBASE_HOME=/usr/local/hbase-0.98.12.1-hadoop2
export PATH = ...:$HBASE_HOME/bin:...

三、修改配置文件

vim /usr/local/hbase-0.98.12.1-hadoop2/conf/hbase-env.sh
#修改JAVA_HOME
export JAVA_HOME=export JAVA_HOME=/usr/local/jdk1.8.0_181

修改最后几行
export HBASE_MANAGES_ZK=false
vim /usr/local/hbase-0.98.12.1-hadoop2/conf/hbase-site.xml

<configuration>

        <property>
                <name>hbase.rootdir</name>
                <value>hdfs://mycluster/hbase</value>
        </property>

        <property>
                <name>hbase.cluster.distributed</name>
                <value>true</value>
        </property>

        <property>
                <name>hbase.zookeeper.quorum</name>
                <value>node02, node03, node04</value>
        </property>

</configuration>
vim /usr/local/hbase-0.98.12.1-hadoop2/conf/regionservers

node02
node03
vim backup-masters

node04

拷贝hdfs-site.xml到hbase的conf文件夹下

cp /usr/local/hadoop-2.6.5/etc/hadoop/hdfs-site.xml /usr/local/hbase-0.98.12.1-hadoop2/conf/

四、将hbase文件夹拷贝到node02, node03和node04上

scp -r hbase-0.98.12.1-hadoop2/ node02:`pwd`
scp -r hbase-0.98.12.1-hadoop2/ node03:`pwd`
scp -r hbase-0.98.12.1-hadoop2/ node04:`pwd`

四、在node01上启动hbase

start-hbase.sh