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 节点规划
namenode | datanode | resourcemanager | nodemanager | journalnode | zookeeper | |
---|---|---|---|---|---|---|
10.131.20.16 | Y | Y | Y | Y | Y | Y |
10.131.20.18 | Y | Y | Y | Y | Y | Y |
10.131.20.19 | Y | Y | Y | Y | Y | Y |
说明: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