介绍几种hadoop部署方式:单节点、集群、高可用集群

113 阅读3分钟

1 hadoop下载

hadoop官网下载即可

$ sudo su - work
$ tar -xzf hadoop-3.3.6.tar.gz
$ ln -s hadoop-3.3.6 hadoop
$ cd hadoop

准备hadoop数据存储目录

$ mkdir data
$ cd data
$ tree
.
├── hdfs
│   ├── datanode
│   └── namenode
├── tmp
└── yarn
    └── nodemanager

2 单节点安装

作为一个规模可以非常庞大的分布式系统,hadoop的安装涉及hdfs、mapreduce、yarn等组件,每个组件又包括多个进程,配置和启动部署比较麻烦。如果只是体验和测试一下hadoop的基本功能,可以在单台机器上部署整个hadoop系统,配置和部署启动将会简化很多。

2.1 hadoop配置

2.1.1 hadoop全局配置

hadoop全局配置是hdfs、mapreduce、yarn的公共配置

2.1.1.1 hadoop全局环境变量配置

我们可以在hadoop-env.sh文件中配置hadoop的全局环境变量,最小配置只需要配置JAVA_HOME即可。

$ vim ./etc/hadoop/hadoop-env.sh

export JAVA_HOME=/home/work/jdk1.8.0_152

2.1.1.2 hadoop全局配置

hadoop全局配置存储在core-site.xml文件中

$ vim ./etc/hadoop/core-site.xml

<configuration>
    <!-- hdfs文件系统namenode通信地址,hdfs文件的元数据信息都通过该地址获取 -->
    <property>
         <name>fs.defaultFS</name>
         <value>hdfs://10.131.20.16:9000</value>
    </property>
    <!-- hadoop数据存储位置 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/work/hadoop/data/tmp</value>
    </property>
</configuration>

2.1.2 hdfs文件系统配置

$ vim ./etc/hadoop/hdfs-site.xml

<configuration>
    <!-- namenode元数据存储目录 -->
    <property>
        <name>dfs.name.dir</name>
        <value>/home/work/hadoop/data/hdfs/namenode</value>
    </property>
    <!-- hdfs文件内容数据存储目录 -->
    <property>
        <name>dfs.data.dir</name>
        <value>/home/work/hadoop/data/hdfs/datanode</value>
    </property>
    <property>
        <name>dfs.http.address</name>
        <value>0.0.0.0:50070</value>
    </property>
    <property>
        <name>dfs.secondary.http.address</name>
        <value>0.0.0.0:50090</value>
    </property>
    <property>
        <name>dfs.datanode.http.address</name>
        <value>0.0.0.0:50075</value>
    </property>
    <!-- hdfs文件副本数量 -->
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>dfs.permission</name>
        <value>false</value>
    </property>
</configuration>

2.1.3 mapreduce配置

新应用的分布式计算平台已经不怎么用mapreduce了,使用flink、spark的会更多些。mapreduce的最简配置如下:

$ vim ./etc/hadoop/mapred-site.xml

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

2.1.4 yarn配置

$ vim ./etc/hadoop/yarn-site.xml

<configuration>
    <!-- resourcemanager配置 -->
    <property>
        <name>yarn.resourcemanager.address</name>
        <value>${yarn.resourcemanager.hostname}:8032</value>
    </property>
    <property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>${yarn.resourcemanager.hostname}:8030</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>${yarn.resourcemanager.hostname}:8088</value>
    </property>
    <property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>${yarn.resourcemanager.hostname}:8031</value>
    </property>
    <property>
        <name>yarn.resourcemanager.admin.address</name>
        <value>${yarn.resourcemanager.hostname}:8033</value>
    </property>
    
    <!-- nodemanager配置 -->
    <property>
        <name>yarn.nodemanager.local-dirs</name>
        <value>/home/work/hadoop/data/yarn/nodemanager</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>

</configuration>

2.2 运行hadoop

2.2.1 运行hdfs

2.2.1.1 初始化namenode目录

第一次启动hdfs时,需要先初始化namenode目录

$ bin/hdfs namenode -format

namenode初始化后数据目录内容

$ tree
.
├── hdfs
│   ├── datanode
│   └── namenode
│       └── current
│           ├── fsimage_0000000000000000000
│           ├── fsimage_0000000000000000000.md5
│           ├── seen_txid
│           └── VERSION
├── tmp
└── yarn
    └── nodemanager

2.2.1.2 启动hdfs

$ ./sbin/start-dfs.sh 
Starting namenodes on []
Starting datanodes
Starting secondary namenodes []

hdfs启动后,在节点上启动了三个进程,如下所示

$ jps
1426 NameNode
1718 DataNode
2088 SecondaryNameNode

hdfs启动后,namenode和datanode目录下新增了一些文件

$ tree
.
├── hdfs
│   ├── datanode
│   │   ├── current
│   │   │   ├── BP-2109133263-10.131.20.16-1694619859193
│   │   │   │   ├── current
│   │   │   │   │   ├── finalized
│   │   │   │   │   ├── rbw
│   │   │   │   │   └── VERSION
│   │   │   │   ├── scanner.cursor
│   │   │   │   └── tmp
│   │   │   └── VERSION
│   │   └── in_use.lock
│   └── namenode
│       ├── current
│       │   ├── edits_inprogress_0000000000000000001
│       │   ├── fsimage_0000000000000000000
│       │   ├── fsimage_0000000000000000000.md5
│       │   ├── seen_txid
│       │   └── VERSION
│       └── in_use.lock
├── tmp
│   └── dfs
│       └── namesecondary
│           └── in_use.lock
└── yarn
    └── nodemanager

2.2.1.3 停止hdfs

如果要停止hdfs,执行stop-dfs.sh文件即可

$ ./sbin/stop-dfs.sh 
Stopping namenodes on []
Stopping datanodes
Stopping secondary namenodes []

2.2.2 运行yarn

2.2.2.1 启动yarn

执行以下脚本就可以启动yarn了

$ ./sbin/start-yarn.sh 
Starting resourcemanager
Starting nodemanagers

yarn启动后,节点上新增了ResourceManager和NodeManager两个进程

$ jps
1426 NameNode
1718 DataNode
2088 SecondaryNameNode
13024 ResourceManager
13335 NodeManager

yarn启动后,yarn目录下也新增了一些文件

$ tree
.
├── hdfs
│   ├── datanode
│   │   ├── current
│   │   │   ├── BP-2109133263-10.131.20.16-1694619859193
│   │   │   │   ├── current
│   │   │   │   │   ├── finalized
│   │   │   │   │   ├── rbw
│   │   │   │   │   └── VERSION
│   │   │   │   ├── scanner.cursor
│   │   │   │   └── tmp
│   │   │   └── VERSION
│   │   └── in_use.lock
│   └── namenode
│       ├── current
│       │   ├── edits_0000000000000000001-0000000000000000002
│       │   ├── edits_inprogress_0000000000000000003
│       │   ├── fsimage_0000000000000000000
│       │   ├── fsimage_0000000000000000000.md5
│       │   ├── seen_txid
│       │   └── VERSION
│       └── in_use.lock
├── tmp
│   └── dfs
│       └── namesecondary
│           ├── current
│           │   ├── edits_0000000000000000001-0000000000000000002
│           │   ├── fsimage_0000000000000000000
│           │   ├── fsimage_0000000000000000000.md5
│           │   ├── fsimage_0000000000000000002
│           │   ├── fsimage_0000000000000000002.md5
│           │   └── VERSION
│           └── in_use.lock
└── yarn
    └── nodemanager
        ├── filecache
        ├── nmPrivate
        └── usercache

2.2.2.2 停止yarn

$ ./sbin/stop-yarn.sh

2.2.3 查看yarn的dashboard

根据yarn的配置,我们可以通过地址http://10.131.20.16:8088/访问yarn的dashboard

3 集群安装

3.1 配置ssh免密码登录

因为hadoop在namenode节点上执行start-dfs.sh脚本启动hdfs集群时,需要ssh远程登录datanode节点,然后远程启动datanode进程。同样,在resourcemanager节点上执行start-yarn.sh脚本启动yarn集群时,也需要ssh远程登录NodeManager节点,启动NodeManager进程。所以namenode节点和resourcemanager节点需要能够成功ssh登录到datanode和nodemanager节点。

要实现免密登录,将namenode和resourcemanager的ssh key copy到dataode和nodemanager节点的authorized_keys文件中即可

# 生成ssh key
$ ssh-keygen -t rsa

# copy到远程机器
$ ssh-copy-id -i ~/.ssh/id_rsa.pub work@10.131.20.16
$ ssh-copy-id -i ~/.ssh/id_rsa.pub work@10.131.20.18
$ ssh-copy-id -i ~/.ssh/id_rsa.pub work@10.131.20.19

3.2 集群hadoop配置

因为需要在多个节点上运行hadoop,需要告诉hadoop是哪些节点。hadoop根据下面worker文件的内容确定需要在哪些节点上启动datanode和nodemanager进程

$ vim ./etc/hadoop/workers

10.131.20.16
10.131.20.18
10.131.20.19

然后,因为我们规划在10.131.20.18节点上运行secondarynamenode,所以需要在hdfs-site.xml文件中修改dfs.secondary.http.address配置项内容如下所示:

    <property>
        <name>dfs.secondary.http.address</name>
        <value>10.131.20.18:50090</value>
    </property>

集群其他的配置内容与单节点运行时的配置一样,配置修改完后,将hadoop安装包内容分发到集群其他所有的节点,让所有节点相应的环境变量、目录结构、配置等均保持一致

3.3 启动集群

3.3.1 启动hdfs集群

要启动hdfs集群,在namenode节点(10.131.20.16)上执行以下脚本即可

$ ./sbin/start-dfs.sh 
Starting namenodes on []
Starting datanodes
10.131.20.18: WARNING: /home/work/hadoop/hadoop-3.3.6/logs does not exist. Creating.
10.131.20.19: WARNING: /home/work/hadoop/hadoop-3.3.6/logs does not exist. Creating.
Starting secondary namenodes []

查看节点10.131.20.16上启动的进程

3125 NameNode
3503 DataNode

查看节点10.131.20.18上启动的进程

$ jps
13224 SecondaryNameNode
12989 DataNode

查看节点10.131.20.19上启动的进程

$ jps
8978 DataNode

3.3.2 启动yarn集群

要启动yarn集群,在resourcemanager节点(10.131.20.16)上执行以下脚本即可

$ ./sbin/start-yarn.sh 
Starting resourcemanager
Starting nodemanagers

查看节点10.131.20.16上启动的进程

3125 NameNode
3503 DataNode
24412 ResourceManager
24774 NodeManager

查看节点10.131.20.18上启动的进程

$ jps
13224 SecondaryNameNode
12989 DataNode
24774 NodeManager

查看节点10.131.20.19上启动的进程

$ jps
8978 DataNode
24774 NodeManager

4 高可用部署

上面的hadoop集群,namenode和resourcemanager都是单点部署的,存在单点故障。hadoop通过引入zookeeper和journalnode实现集群的高可用

4.1 节点规划

namenodedatanoderesourcemanagernodemanagerjournalnodezookeeper
10.131.20.16YYYYYY
10.131.20.18YYYYYY
10.131.20.19YYYYYY
说明:hadoop高可用情况下,不再需要secondarynamenode节点

4.2 hadoop配置

在core-site.xml、hdfs-site.xml、yarn-site.xml配置文件增加高可用相关的配置,其余的配置与普通hadoop集群一致

4.2.1 创建journalnode数据目录

因为新增了journalnode节点角色,在journalnode节点上创建相应的数据存储目录

$ cd hadoop
$ cd data/hdfs
$ mkdir journalnode

4.2.1 core-site.xml配置

$ vim ./etc/hadoop/core-site.xml

<configuration>
    <!-- hdfs namenode通信地址不配置具体节点的地址,而是取一个名字,如hdfscluster -->
    <property>
         <name>fs.defaultFS</name>
         <value>hdfs://hdfscluster</value>
    </property>
    <!-- hadoop数据存储位置 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/work/hadoop/data/tmp</value>
    </property>

    <!-- 指定zookeeper的地址 -->
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>10.131.20.16:2181,10.131.20.18:2181,10.131.20.19:2181</value>
    </property>
    
</configuration>

4.2.2 hdfs-site.xml配置

$ vim ./etc/hadoop/hdfs-site.xml

<configuration>
    <!-- namenode元数据存储目录 -->
    <property>
        <name>dfs.name.dir</name>
        <value>/home/work/hadoop/data/hdfs/namenode</value>
    </property>
    <!-- hdfs文件内容数据存储目录 -->
    <property>
        <name>dfs.data.dir</name>
        <value>/home/work/hadoop/data/hdfs/datanode</value>
    </property>
    <property>
        <name>dfs.datanode.http.address</name>
        <value>0.0.0.0:50075</value>
    </property>
    <!-- hdfs文件副本数量 -->
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>dfs.permission</name>
        <value>false</value>
    </property>
    

    <!--指定hdfs的nameservice为hdfscluster,需要和core-site.xml中的保持一致 -->
    <property>
        <name>dfs.nameservices</name>
        <value>hdfscluster</value>
    </property>

    <!-- 配置hdfscluster包含的NameNode,分别取名为nn1,nn2 -->
    <property>
        <name>dfs.ha.namenodes.hdfscluster</name>
        <value>nn1,nn2</value>
    </property>

    <!-- nn1的RPC通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.hdfscluster.nn1</name>
        <value>10.131.20.16:9000</value>
    </property>

    <!-- nn1的http通信地址 -->
    <property>
        <name>dfs.namenode.http-address.hdfscluster.nn1</name>
        <value>10.131.20.16:50070</value>
    </property>

    <!-- nn2的RPC通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.hdfscluster.nn2</name>
        <value>10.131.20.18:9000</value>
    </property>
    
    <!-- nn2的http通信地址 -->
    <property>
        <name>dfs.namenode.http-address.hdfscluster.nn2</name>
        <value>10.131.20.18:50070</value>
    </property>

    <!-- 指定NameNode的日志在JournalNode上的存放位置 -->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://bigdata12:8485;bigdata13:8485/hdfscluster</value>
    </property>
    
    <!-- 指定JournalNode在本地磁盘存放数据的位置 -->
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/home/work/hadoop/data/hdfs/journalnode</value>
    </property>
    
    <!-- 开启NameNode失败自动切换 -->
    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>
    
    <!-- 配置失败自动切换实现方式 -->
    <property>
        <name>dfs.client.failover.proxy.provider.ns1</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    
    <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>
        sshfence
        shell(/bin/true)
        </value>
    </property>
        
    <!-- 使用sshfence隔离机制时需要ssh免登陆 -->
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/home/work/.ssh/id_rsa</value>
    </property>
            
    <!-- 配置sshfence隔离机制超时时间 -->
    <property>
        <name>dfs.ha.fencing.ssh.connect-timeout</name>
        <value>30000</value>
    </property>
    
</configuration>

4.2.3 yarn-site.xml配置

$ vim ./etc/hadoop/yarn-site.xml

<configuration>
    <!-- resourcemanager配置 -->
    <property>
        <name>yarn.resourcemanager.address</name>
        <value>${yarn.resourcemanager.hostname}:8032</value>
    </property>
    <property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>${yarn.resourcemanager.hostname}:8030</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>${yarn.resourcemanager.hostname}:8088</value>
    </property>
    <property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>${yarn.resourcemanager.hostname}:8031</value>
    </property>
    <property>
        <name>yarn.resourcemanager.admin.address</name>
        <value>${yarn.resourcemanager.hostname}:8033</value>
    </property>
    
    <!-- nodemanager配置 -->
    <property>
        <name>yarn.nodemanager.local-dirs</name>
        <value>/home/work/hadoop/data/yarn/nodemanager</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>

    <!-- 开启RM高可靠 -->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>
        
    <!-- 指定RM的cluster id -->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>yrc</value>
    </property>
        
    <!-- 指定RM的名字 -->
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>
        
    <!-- 分别指定RM的地址 -->
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>10.131.20.16</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>10.131.20.18</value>
    </property>
        
    <!-- 指定zk集群地址 -->
    <property>
    <name>yarn.resourcemanager.zk-address</name>
    <value>10.131.20.16:2181,10.131.20.18:2181,10.131.20.19:2181</value>
    </property>

</configuration>

4.3 hadoop启动

在所有的namenode和journalnode节点上执行以下命令进行格式化

$ bin/hdfs namenode -format
$ bin/hdfs zkfc -formatZK

启动journalnode

$ ./sbin/hadoop-daemons.sh start journalnode

启动hdfs和yarn集群

$ ./sbin/start-dfs.sh
$ ./sbin/start-yarn.sh