Hadoop 官网地址 https://hadoop.apache.org/
Hadoop GitHub地址 https://github.com/apache/hadoop
Hadoop 文档地址 https://hadoop.apache.org/docs/stable/
Apache Hadoop是一个由 Apache 基金会所开发的分布式存储和计算的基础框架,使用简单的编程模型跨计算机集群分布式处理海量数据,也即是主要解决海量数据的存储和海量数据的分析计算问题。
Apache Hadoop可从单个服务器扩展到数千台机器,每台机器都提供本地计算和存储,实现存储和计算高可用性;而从广义上来说, Hadoop 通常是指一个更广泛的概念 —— Hadoop 生态圈。
Hadoop 发行版除了Apache的开源版本之外,还有华为发行版、Intel发行版、Cloudera发行版(CDH)、Hortonworks发行版(HDP)、MapR等,所有这些发行版均是基于Apache Hadoop衍生出来的。
Hadoop Distributed File System ,简称 HDFS ,是一个分布式文件系统;HDFS是一个主/从架构,HDFS集群由一个单一的NameNode组成,NameNode是一个主服务器,负责管理文件系统命名空间和规范客户端对文件的访问。此外,还有许多datanode,通常集群中的每个节点都有一个,它们管理连接到它们运行的节点上的存储。HDFS公开了一个文件系统命名空间,允许用户数据存储在文件中。在内部,一个文件被分割成一个或多个块,这些块存储在一组datanode中。NameNode执行文件系统命名空间操作,比如打开、关闭和重命名。简单的说就是NameNode就相当于一个目录一个索引,负责标记每一个DataNode的存放位置;而DataNode才是真正存放数据的。
YARN的基本思想是将资源管理和作业调度/监视的功能拆分为独立的守护进程。包含一个全局的ResourceManager (RM)和每个应用的ApplicationMaster (AM),应用程序要么是单个作业要么是多个作业的DAG。
本次使用Hadoop最新版本3.3.4部署3个节点的Hadoop分布式集群。
安装JDK8(本篇的服务器安装目录在/home/commons/jdk8)或者JDK11,目前新版本是支持JDK11
关闭主机防火墙
修改3个节点hosts表(/etc/hosts),配置三台服务器的IP对应的节点名称为hadoop1、hadoop2、hadoop3
配置SSH免密码通信,在三台上都执行如下操作,配置完成可以通过ssh命令任意一台无需输入密码则配置免密成功
安装Zookeeper集群(三台集群zk1、zk2、zk3,详细可查阅前面讲解Zookeeper文章)
# 在hadoop2上下载最新版的hadoop-3.3.4
cd /home/commons
# 其他两台可以使用scp命令拷贝hadoop-3.3.4.tar.gz如scp ./hadoop-3.3.4.tar.gz hadoop1:/home/commons/和scp ./hadoop-3.3.4.tar.gz hadoop3:/home/commons/
wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.4/hadoop-3.3.4.tar.gz
# 解压文件
tar xvf hadoop-3.3.4.tar.gz
# 重命名
mv hadoop-3.3.4 hadoop
mkdir -p /home/commons/hadoop
cd /home/commons/hadoop
mkdir hdfs tmp
cd hdfs
mkdir name data journal
vim ~/.bashrc
export HADOOP_HOME=/home/commons/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_COMMON_HOME=/home/commons/hadoop
export HADOOP_HDFS_HOME=/home/commons/hadoop
export HADOOP_MAPRED_HOME=/home/commons/hadoop
export HADOOP_CONF_DIR=/home/commons/hadoop/etc/hadoop
export HDFS_DATANODE_USER=root
export HDFS_NAMENODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export HDFS_JOURNALNODE_USER=root
export HDFS_ZKFC_USER=root
export YARN_HOME=/home/commons/hadoop
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
更新环境变量
source ~/.bashrc
cd /home/commons/hadoop/etc/hadoop
编辑 vim hadoop-env.sh ,添加以下内容
export JAVA_HOME=/home/commons/jdk8
export HADOOP_OS_TYPE=${HADOOP_OS_TYPE:-$(uname -s)}
编辑 vim yarn-env.sh
export JAVA_HOME=/home/commons/jdk8
编辑vim core-site.xml
fs.defaultFS
hdfs://myns/
hadoop.tmp.dir
/home/commons/hadoop/tmp
io.file.buffer.size
131072
ha.zookeeper.quorum
zk1:2181,zk2:2181,zk3:2181
ha.zookeeper.session-timeout.ms
1000
编辑vim hdfs-site.xml
<configuration>
<property>
<name>dfs.replicationname>
<value>3value>
property>
<property>
<name>dfs.namenode.name.dirname>
<value>file:///home/commons/hadoop/hdfs/namevalue>
property>
<property>
<name>dfs.datanode.data.dirname>
<value>file:///home/commons/hadoop/hdfs/datavalue>
property>
<property>
<name>dfs.webhdfs.enabledname>
<value>truevalue>
property>
<property>
<name>dfs.nameservicesname>
<value>mynsvalue>
property>
<property>
<name>dfs.ha.namenodes.mynsname>
<value>nn1,nn2value>
property>
<property>
<name>dfs.namenode.rpc-address.myns.nn1name>
<value>hadoop1:9000value>
property>
<property>
<name>dfs.namenode.rpc-address.myns.nn2name>
<value>hadoop2:9000value>
property>
<property>
<name>dfs.namenode.http-address.myns.nn1name>
<value>hadoop1:50070value>
property>
<property>
<name>dfs.namenode.http-address.myns.nn2name>
<value>hadoop2:50070value>
property>
<property>
<name>dfs.namenode.shared.edits.dirname>
<value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/mynsvalue>
<description>
JournalNode的配置
格式是qjournal://host1:port1;host2:port2;host3:port3/journalID
默认端口号是8485,journalID建议使用nameservice的名称
description>
property>
<property>
<name>dfs.journalnode.edits.dirname>
<value>/home/commons/hadoop/hdfs/journalvalue>
property>
<property>
<name>dfs.ha.automatic-failover.enabledname>
<value>truevalue>
<description>HDFS的故障自动转移服务description>
property>
<property>
<name>dfs.client.failover.proxy.provider.mynsname>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvidervalue>
<description>客户端(client)通过该类获取active NameNodedescription>
property>
<property>
<name>ha.failover-controller.cli-check.rpc-timeout.msname>
<value>60000value>
property>
<property>
<name>dfs.ha.fencing.methodsname>
<value>
sshfence
shell(/bin/true)
value>
<description>隔离机制(fencing),防止主备切换时同时存在2个master的情况description>
property>
<property>
<name>dfs.ha.fencing.ssh.private-key-filesname>
<value>~/.ssh/id_rsavalue>
<description>隔离机制(fencing)使用的远程控制密钥description>
property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeoutname>
<value>30000value>
property>
configuration>
编辑vim mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.namename>
<value>yarnvalue>
property>
<property>
<name>mapreduce.jobtracker.http.addressname>
<value>hadoop2:50030value>
property>
<property>
<name>mapreduce.jobhistory.addressname>
<value>hadoop2:10020value>
property>
<property>
<name>mapreduce.jobhistory.webapp.addressname>
<value>hadoop2:19888value>
property>
<property>
<name>mapred.job.trackername>
<value>http://hadoop2:9001value>
property>
configuration>
编辑vim yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.ha.enabledname>
<value>truevalue>
property>
<property>
<name>yarn.resourcemanager.cluster-idname>
<value>myynvalue>
property>
<property>
<name>yarn.resourcemanager.ha.rm-idsname>
<value>rm1,rm2value>
property>
<property>
<name>yarn.resourcemanager.hostname.rm1name>
<value>hadoop1value>
property>
<property>
<name>yarn.resourcemanager.hostname.rm2name>
<value>hadoop2value>
property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1name>
<value>hadoop1:8088value>
property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2name>
<value>hadoop2:8088value>
property>
<property>
<name>yarn.resourcemanager.zk-addressname>
<value>zk1:2181,zk2:2181,zk3:2181value>
property>
<property>
<name>yarn.resourcemanager.recovery.enabledname>
<value>truevalue>
<description>
ResourceManger会将应用的状态信息保存到yarn.resourcemanager.store.class配置的存储介质中,
重启后会加载这些信息,并且NodeManger会将还在运行的container信息同步到ResourceManager。
description>
property>
<property>
<name>yarn.resourcemanager.store.classname>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStorevalue>
property>
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
property>
<property>
<name>yarn.log-aggregation-enablename>
<value>truevalue>
property>
<property>
<name>yarn.log-aggregation.retain-secondsname>
<value>86400value>
property>
<property>
<name>yarn.application.classpathname>
<value>
/home/commons/hadoop/etc/hadoop,
/home/commons/hadoop/share/hadoop/common/*,
/home/commons/hadoop/share/hadoop/common/lib/*,
/home/commons/hadoop/share/hadoop/hdfs/*,
/home/commons/hadoop/share/hadoop/hdfs/lib/*,
/home/commons/hadoop/share/hadoop/yarn/*,
/home/commons/hadoop/share/hadoop/yarn/lib/*,
/home/commons/hadoop/share/hadoop/mapreduce/*
value>
property>
configuration>
由于目前几台服务器配置较低,所以yarn调度默认配置不满足,死活起动不了job,提交后一直ACCEPTED。修改配置文件vim capacity-scheduler.xml
默认0.1修改的大些,我直接改到0.5,这一步不是必要,有资源问题可以修改
<property>
<name>yarn.scheduler.capacity.maximum-am-resource-percentname>
<value>0.5value>
<description>
Maximum percent of resources in the cluster which can be used to run
application masters i.e. controls number of concurrent running
applications.
description>
property>
配置vim workers
hadoop1
hadoop2
hadoop3
同步配置文件,拷贝到其它两台上
cd /home/commons/hadoop/etc/hadoop
scp * hadoop2:/home/commons/hadoop/etc/hadoop
scp * hadoop3:/home/commons/hadoop/etc/hadoop
启动JournalNode
# 在hadoop1上启动
hdfs --workers --daemon start journalnode
格式化NameNode
hadoop namenode -format
格式化后同步namenode的信息文件给hadoop2。因为有2个NameNode节点,hadoop1和hadoop2
scp -r /home/commons/hadoop/hdfs/name/current/ hadoop2:/home/commons/hadoop/hdfs/name/
格式化zkfc
zkfc = ZKFailoverController = ZooKeeper Failover Controller,zkfc用于监控NameNode状态信息,并进行自动切换。
启动HDFS和Yarn
# 下面这两步是最经常出现报错的,因此第一次先一步步单独启动
start-dfs.sh
start-yarn.sh
# 第1次部署时需要用上面的操作,后面启动可以直接用全部启动脚本
start-all.sh
hadoop1上查看进程
hadoop2上查看进程
访问hadoop1 NameNode节点的HDFS的页面http://hadoop1:50070/
访问hadoop1 NameNode节点的HDFS的页面http://hadoop2:50070/
访问yarn的ResourceManager的管理页面http://hadoop2:8088/ ,访问http://hadoop1:8088/会跳转到hadoop2上
# HDFS中创建文件
hadoop fs -mkdir /mytest
hadoop fs -ls /
查看页面浏览文件系统也可以看下创建的目录
# 上传一个文件和创建输出目录
hadoop fs -put word.txt /mytest
hadoop fs -ls /mytest
# 执行wordcount计算
cd /home/commons/hadoop
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar wordcount /mytest /output
查看yarn的ResourceManager的管理页面http://hadoop2:8088/ ,可以看到提交任务已经跑完
查看HDFS的页面http://hadoop2:50070/ ,查看到output目录有输出part-r-00000的文件,文件的内容为正确单词频次统计结果。
**本人博客网站 **IT小神 www.itxiaoshen.com