简介
Hadoop是一个开源的分布式存储和计算框架,最初由Apache软件基金会开发。它的发展背景可以追溯到Google的MapReduce和Google File System(GFS)的论文,这两篇论文启发了Hadoop的设计。Hadoop的主要应用场景包括大数据存储、处理和分析,特别是在需要处理海量数据的互联网和企业环境中。它被广泛用于日志分析、数据挖掘、机器学习、图像处理等领域。 Hadoop的生态系统还包括许多相关项目,如Hive、HBase、Spark等,为大数据处理提供了丰富的工具和技术。
虽然当前提出hadoop的缺点以及弊端,但是当前hadoop的全功能性还是能解决大型项目的大多数问题。学习hadoop变较为必要。
安装以及环境配置
hostname:ipaddr | 应用 | 属性 |
vm02:10.0.0.102 | hadoop+jdk+zookeeper | 主节点(DataNode+主NameNode+ResourceManager) |
vm03:10.0.0.103 | hadoop+jdk+zookeeper | 从节点(Datanode+备用Namenode+备ResourceManager) |
vm04:10.0.0.104 | hadoop+jdk+zookeeper | 从节点(Datanode) |
下载JDK、zookeeper以往文章中已经做了解释本文不再累述
hadoop进入官网选择最新版本下载。
wget https://archive.apache.org/dist/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
解压压缩包
[hadoop@vm03 ~]$ tar -zxf hadoop-3.3.6.tar.gz
[hadoop@vm03 ~]$ ln -s hadoop-3.3.6 hadoop
[hadoop@vm03 ~]$ rm -rf hadoop-3.3.6.tar.gz
设置软连接,方便后期hadoop升级,做替换
hadoop-env.sh配置
hadoop-env.sh文件主要配置与Hadoop环境相关的变量,文件放置在hadoop/etc/hadoop/目录下,主要配置jdk的目录。
[hadoop@vm03 hadoop]$ echo $JAVA_HOME
/jdk/jdk1.8.0_144/
[hadoop@vm03 hadoop]$ vim hadoop-env.sh
core-site.xml配置
<!-- core-site.xml -->
<configuration>
<!-- 指定Hadoop文件系统的默认块大小 -->
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
</property>
<!-- 指定Hadoop文件系统的默认副本数量 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 指定hadoop数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/data</value>
</property>
<!-- 指定NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 配置zookeeper管理hdfs -->
<property>
<name>ha.zookeeper.quorum</name>
<value>vm02:2181,vm03:2181,vm04:2181</value>
</property>
</configuration>
hdfs-site.xml配置
hdfs-site.xml文件主要配置和HDFS相关的属性, 同样位于hadoop/etc/hadoop路径下<!--hdfs-site.xml配置-->
<configuration>
<!-- NameNode数据存储目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.tmp.dir}/name</value>
</property>
<!-- DataNode数据存储目录 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop.tmp.dir}/data</value>
</property>
<!-- JournalNode数据存储目录 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>${hadoop.tmp.dir}/jn</value>
</property>
<!-- 完全分布式集群名称 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 集群中NameNode节点都有哪些 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- NameNode的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>vm02:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>vm03:8020</value>
</property>
<!-- NameNode的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>vm02:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>vm03:9870</value>
</property>
<!-- 指定NameNode元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://vm02:8485;vm03:8485/mycluster</value>
</property>
<!-- 访问代理类:client用于确定哪个NameNode为Active -->
<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>
<!-- 使用隔离机制时需要ssh秘钥登录-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
mapred-site.xml配置
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
yarn-site.xml配置
<configuration>
<!-- ResourceManager连接的最大等待时间(毫秒) -->
<property>
<name>yarn.resourcemanager.connect.max-wait.ms</name>
<value>2000</value> <!-- 设置ResourceManager连接的最大等待时间为2000毫秒 -->
</property>
<!-- 启用ResourceManager的高可用性 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value> <!-- 启用ResourceManager的高可用性 -->
</property>
<!-- 启动故障自动恢复 -->
<property>
<name>yarn.resourcemanager.ha.automatic-failover.enable</name>
<value>true</value> <!-- 启动故障自动恢复 -->
</property>
<!-- 启用内嵌式的故障自动恢复 -->
<property>
<name>yarn.resourcemanager.ha.automatic-failover.embedded</name>
<value>true</value> <!-- 启用内嵌式的故障自动恢复 -->
</property>
<!-- 设置ResourceManager所属的集群ID -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn-rm-cluster</value> <!-- 设置ResourceManager所属的集群ID为 yarn-rm-cluster -->
</property>
<!-- 设置ResourceManager的ID列表 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value> <!-- 设置ResourceManager的ID列表为 rm1,rm2 -->
</property>
<!-- 设置ResourceManager节点rm1的主机名 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>vm02</value> <!-- 设置ResourceManager节点rm1的主机名为 vm02 -->
</property>
<!-- 设置ResourceManager节点rm2的主机名 -->
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>vm03</value> <!-- 设置ResourceManager节点rm2的主机名为 vm03 -->
</property>
<!-- 启用ResourceManager的状态恢复 -->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value> <!-- 启用ResourceManager的状态恢复 -->
</property>
<!-- 设置存储ResourceManager状态信息的ZooKeeper地址 -->
<property>
<name>yarn.resourcemanager.zk.state-store.address</name>
<value>vm02:2181,vm03:2181,vm04:2181</value> <!-- 设置存储ResourceManager状态信息的ZooKeeper地址为 vm02:2181,vm03:2181,vm04:2181 -->
</property>
<!-- 设置ResourceManager节点rm1的地址 -->
<property>
<name>yarn.resourcemanager.address.rm1</name>
<value>vm02:8032</value> <!-- 设置ResourceManager节点rm1的地址为 vm02:8032 -->
</property>
<!-- 设置ResourceManager节点rm1的调度器地址 -->
<property>
<name>yarn.resourcemanager.scheduler.address.rm1</name>
<value>vm02:8034</value> <!-- 设置ResourceManager节点rm1的调度器地址为 vm02:8034 -->
</property>
<!-- 设置ResourceManager节点rm1的Web应用地址 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>vm02:8088</value> <!-- 设置ResourceManager节点rm1的Web应用地址为 vm02:8088 -->
</property>
<!-- 设置ResourceManager节点rm2的地址 -->
<property>
<name>yarn.resourcemanager.address.rm2</name>
<value>vm03:8032</value> <!-- 设置ResourceManager节点rm2的地址为 vm03:8032 -->
</property>
<!-- 设置ResourceManager节点rm2的调度器地址 -->
<property>
<name>yarn.resourcemanager.scheduler.address.rm2</name>
<value>vm03:8034</value> <!-- 设置ResourceManager节点rm2的调度器地址为 vm03:8034 -->
</property>
<!-- 设置ResourceManager节点rm2的Web应用地址 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>vm03:8088</value> <!-- 设置ResourceManager节点rm2的Web应用地址为 vm03:8088 -->
</property>
<!-- 设置ZooKeeper的地址,用于协调ResourceManager的高可用性和故障自动恢复 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>vm02:2181,vm03:2181,vm04:2181</value> <!-- 设置ZooKeeper的地址,用于协调ResourceManager的高可用性和故障自动恢复为 vm02:2181,vm03:2181,vm04:2181 -->
</property>
<!-- 启用日志聚合 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value> <!-- 启用日志聚合 -->
</property>
<!-- 设置Hadoop使用的ZooKeeper地址 -->
<property>
<name>hadoop.zk.address</name>
<value>vm02:2181,vm02:2181,vm02:2181</value> <!-- 设置Hadoop使用的ZooKeeper地址为 vm02:2181,vm02:2181,vm02:2181 -->
</property>
<!-- 设置NodeManager的辅助服务 -->
<property>
<name>yarn.nodemanager.aux-sevices</name>
<value>mapreduce_shuffle</value> <!-- 设置NodeManager的辅助服务为 mapreduce_shuffle -->
</property>
<!-- 设置MapReduce Shuffle服务的类 -->
<property>
<name>yarn.nodemanager.aux-sevices.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandle</value> <!-- 设置MapReduce Shuffle服务的类为 org.apache.hadoop.mapred.ShuffleHandle -->
</property>
</configuration>
workers文件配置
workers文件的名称是在hadoop-env.sh 文件中指定的。在 hadoop-env.sh 文件中,可以找到一个环境变量 HADOOP_WORKERS,它指定了workers 文件的路径。通常情况下,HADOOP_WORKERS 的默认值是 ${HADOOP_CONF_DIR}/workers ,其中 ${HADOOP_CONF_DIR} 是指向 Hadoop 配置文件目录的环境变量。
注意:旧版本这里使用的是slaves
[hadoop@vm02 ~]$ cd hadoop/etc/hadoop/
[hadoop@vm02 hadoop]$ vim workers
vm02
vm03
vm04
此文件配置集群中的所有hostname。
注:所有节点配置内容保持一致
试运行
启动Zookeeper集群
所有节点都需启动
[hadoop@vm03 ~]$ zkServer.sh restart
ZooKeeper JMX enabled by default
Using config: /home/hadoop/zookeeper/bin/../conf/zoo.cfg
ZooKeeper JMX enabled by default
Using config: /home/hadoop/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
ZooKeeper JMX enabled by default
Using config: /home/hadoop/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[hadoop@vm03 ~]$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/hadoop/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
启动JournalNode集群
在Hadoop中,JournalNode集群用于存储NameNode的编辑日志。它们帮助确保在NameNode发生故障时不会丢失数据,并支持NameNode的高可用性和故障转移。 JournalNode集群是Hadoop分布式文件系统(HDFS)的关键组件,用于维护持久化的NameNode编辑日志,以便在发生故障时进行恢复。
在集群所有节点分别启动JournalNode服务
hadoop/sbin/hadoop-daemon.sh start journalnode
[hadoop@vm03 ~]$ hadoop/sbin/hadoop-daemon.sh start journalnode
WARNING: Use of this script to start HDFS daemons is deprecated.
WARNING: Attempting to execute replacement "hdfs --daemon start" instead.
WARNING: /home/hadoop/hadoop-3.3.6/logs does not exist. Creating.
[hadoop@vm03 ~]$ jps
7936 JournalNode
7780 QuorumPeerMain
7975 Jps
格式化主节点NameNode
## 在vm02节点(NameNode主节点)上,使用以下命令对 NameNode进行格式化
hadoop/bin/hdfs namenode -format
hadoop/bin/hdfs zkfc -formatZK
hadoop/bin/hdfs namenode
##在备用节点vm03进行同步主节点的元数据
hadoop/bin/hadoop namenode -bootstrapStandby
##所有节点关闭zookeeper集群
zkServer.sh stop
##所有节点关闭 journalnode集群
hadoop/sbin/hadoop-daemon.sh stop journalnode
##所有节点启动zookeeper集群
zkServer.sh start
#主节点vm02启动集群
hadoop/sbin/start-all.sh
格式化ZooKeeper中与故障转移控制器(Failover Controller)相关的数据。这个命令通常在设置故障转移控制器时使用,以确保ZooKeeper中的相关数据处于正确的状态。
hadoop/bin/hdfs zkfc -formatZK
所有节点启动zookeeper集群
vm02启动HDFS集群
验证
通过jps查看namenode进程所在节点,通过web进行访问
[hadoop@vm03 ~]$ jps
1666 QuorumPeerMain
2727 DFSZKFailoverController
2315 DataNode
1820 JournalNode
2125 NameNode
3294 Jps
[hadoop@vm03 ~]$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:f1:d6:3e brd ff:ff:ff:ff:ff:ff
inet 10.0.0.103/24 brd 10.0.0.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fef1:d63e/64 scope link
valid_lft forever preferred_lft forever
打开网页输入以下namenode的ip地址
http://10.0.0.103:9870
http://10.0.0.102:9870
此时namenode节点都是可以通过web节点上线的,vm03作为备用节点。