Hadoop概述
Hadoop是什么?
Hadoop是一个由Apache基金会所开发的分布式系统基础架构,主要就是解决数据存储和数据分析计算的问题(通过HDFS,YARN,MapReduce实现)。分布式就是多个服务器做同样的一件事。
广义上来说,hadoop通常指hadoop生态圈。
Hadoop发展历史
在2003至2004年,Google陆续公布了部分GFS和MapReduce思想的细节,Nutch的创始人Doug Cutting受到启发,用了若干年时间实现了DFS和MapReduce机制,使Nutch性能飙升。
2005年,Hadoop作为Lucene子项目Nutch的一部分正式被引入Apache基金会,随后又从Nutch中剥离,成为一套完整独立的软件,起名为Hadoop。据说,Hadoop这个名字来源于创始人Doug Cutting儿子的毛绒玩具大象,因此,Hadoop的Logo形象如图1所示。
目前,Hadoop已经正式成为Apache顶级开源项目,俨然已经成为大数据处理技术的核心地位。下面我们回顾一下近10年来Hadoop的主要发展历程。
· 2008年1月,Hadoop成为Apache顶级项目。
· 2008年6月,Hadoop的第一个SQL框架——Hive成为了Hadoop的子项目。
· 2009年7月 ,MapReduce 和 Hadoop Distributed File System (HDFS) 成为Hadoop项目的独立子项目。
· 2009年7月 ,Avro 和 Chukwa 成为Hadoop新的子项目。
· 2010年5月 ,Avro脱离Hadoop项目,成为Apache顶级项目。
· 2010年5月 ,HBase脱离Hadoop项目,成为Apache顶级项目。
· 2010年9月,Hive脱离Hadoop,成为Apache顶级项目。
· 2010年9月,Pig脱离Hadoop,成为Apache顶级项目。
· 2010年-2011年,扩大的Hadoop社区忙于建立大量的新组件(Crunch,Sqoop,Flume,Oozie等)来扩展Hadoop的使用场景和可用性。
· 2011年1月,ZooKeeper 脱离Hadoop,成为Apache顶级项目。
· 2011年12月,Hadoop1.0.0版本发布,标志着Hadoop已经初具生产规模。
· 2012年5月,Hadoop 2.0.0-alpha版本发布,这是Hadoop-2.x系列中第一个(alpha)版本。与之前的Hadoop-1.x系列相比,Hadoop-2.x版本中加入了YARN,YARN成为了Hadoop的子项目。
· 2012年10月,Impala加入Hadoop生态圈。
· 2013年10月,Hadoop2.0.0版本发布,标志着Hadoop正式进入MapReduce v2.0时代。
· 2014年2月,Spark开始代替MapReduce成为Hadoop的默认执行引擎,并成为Apache顶级项目。
· 2017年12月,继Hadoop3.0.0的四个Alpha版本和一个Beta版本后,第一个可用的Hadoop 3.0.0版本发布。
Hadoop三大发行版本
Hadoop三大发行版本:Apache、Cloudera、Hortonworks。
· Apache版本最原始(最基础)的版本,对于入门学习最好。2006
· Cloudera内部集成了很多大数据框架,对应产品CDH。2008
· Hortonworks文档较好,对应产品HDP。2011。
· Hortonworks现在已经被Cloudera公司收购,推出新的品牌CDP。
hadoop的优势
Hadoop是一个能够让用户轻松构建和使用的分布式计算平台。用户可以轻松地在Hadoop上开发、运行需要处理海量数据的应用程序。它主要有以下几个优点。
(1)高可靠性。Hadoop按位存储和处理数据的能力值得信赖。
(2)高扩展性。Hadoop通过在可用的计算机集簇间分配数据来完成计算任务,这些集簇可以方便地扩展到数以千计的节点中。
(3)高效性。Hadoop能够在节点之间动态地移动数据,以保证各个节点的动态平衡,因此其处理速度非常快。
(4)高容错性。Hadoop能够自动保存数据的多份副本,并且能够自动将失败的任务重新分配。
Hadoop架构变迁(1.0-2.0变迁)
-
Hadoop 1.0
HDFS(分布式文件存储)
MapReduce(资源管理和分布式数据处理) -
Hadoop 2.0
HDFS(分布式文件存储)
MapReduce(分布式数据处理)
YARN(集群资源管理、任务调度)
首先我们来看一下致命性的变化,就是1.0版本到2.0版本的变迁,因为hadoop发展到现在,大概经历了三个大的版本变化,我们仔细对比一下,发现底层都是hdfs,没有什么变化,也就是说,数据怎么存的,没有什么变化。
1.0到2.0最大的变化,就是对MR进行了大的拆分,并且引入了一个新的组件,叫做YARN。大家可以看下图,我们发现,这个mapReduce这个组件太累了,他除了要做集群的资源管理,还要做数据的处理,这一个组件身兼数职,并且这两件事情都非常的重要,那他的性能能好吗?
完全不行啊,所以呢,到2.0版本之后,hadoop做了一个非常大的构架变化,就是把MR做了拆分,MR你只负责处理数据就可以了,资源管理的事情,交给专门的组件来做,这个组件就是YARN,并且YARN这个组件做的非常通用,不仅支持MapReduce,还支持其他的计算框架,什么Spark,Flink等。目前市面上1.0基本上没什么人用了,但是2.8、2.9这些还是有在用。
Hadoop架构变迁(3.0新版本)
Hadoop 3.0架构组件和Hadoop 2.0类似,3.0着重于性能优化。
我们可以看一下,2.0到3.0的版本,构架已经没有大的改变了,一个软件要是天天变构架,那就太搓了,3.0版本侧重的是性能的优化,就比如说支持cup的多重运算、支持多重备份,并且内部的数据支持动态平衡,并且存储效率变高了,采用删码存储等等。以上就是hadoop各个版本之间的一些区别。
-
通用方面
精简内核、类路径隔离、shell脚本重构 -
Hadoop HDFS
EC纠删码、多NameNode支持 -
Hadoop MapReduce
任务本地化优化、内存参数自动推断 -
Hadoop YARN
Timeline Service V2、队列配置
Hadoop架构概述
HDFS概述
HDFS 遵循主/从架构,由单个 NameNode(NN) 和多个 DataNode(DN) 组成:
- NameNode : 负责执行有关
文件系统命名空间
的操作,例如打开,关闭、重命名文件和目录等。它同时还负责集群元数据的存储,记录着文件中各个数据块的位置信息。 - DataNode:负责提供来自文件系统客户端的读写请求,执行块的创建,删除等操作。
YARN概述
Apache YARN (Yet Another Resource Negotiator) 是 hadoop 2.0 引入的集群资源管理系统。用户可以将各种服务框架部署在 YARN 上,由 YARN 进行统一地管理和资源分配。
YARN架构:
MapReduce概述
Hadoop MapReduce 是一个分布式计算框架,用于编写批处理应用程序。编写好的程序可以提交到 Hadoop 集群上用于并行处理大规模的数据集。
MapReduce 作业通过将输入的数据集拆分为独立的块,这些块由 map
以并行的方式处理,框架对 map
的输出进行排序,然后输入到 reduce
中。MapReduce 框架专门用于 <key,value>
键值对处理,它将作业的输入视为一组 <key,value>
对,并生成一组 <key,value>
对作为输出。输出和输出的 key
和 value
都必须实现Writable 接口。
(input) <k1, v1> -> map -> <k2, v2> -> combine -> <k2, v2> -> reduce -> <k3, v3> (output)
MapReduce编程模型简述
Linux环境准备
集群规划注意
- 角色规划的准则 : 根据软件工作特性和服务器硬件资源情况合理分配,比如依赖内存工作的NameNode是不是部署在大内存机器上?
- 角色规划注意事项:资源上有抢夺冲突的,尽量不要部署在一起,工作上需要互相配合的。尽量部署在一起
集群角色规划例子
安装Linux虚拟机3台,内存4G,硬盘50G
资料下载
vm,centos7
链接:https://pan.baidu.com/s/1gP1vLKCWMou1znb71qtA4Q
提取码:yyds
jdk1.8
链接:https://pan.baidu.com/s/1AN2GCDtpVqCDPaeNZQ6THg
提取码:yyds
hadoop
链接:https://pan.baidu.com/s/1F7cPSzfmtZLtRJuLP5D4FA
提取码:yyds
linux配置
防火墙,关闭防火墙开机自启
systemctl stop firewalld
systemctl disable firewalld.service
关闭selinux
1、临时关闭:输入命令setenforce 0,重启系统后还会开启。
2、永久关闭:输入命令vi /etc/selinux/config,将SELINUX=enforcing改为SELINUX=disabled,然后保存退出。
创建bigdata用户,并修改bigdata用户的密码
useradd bigdata
passwd bigdata
配置bigdata用户具有root权限
vim /etc/sudoers
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
bigdata ALL=(ALL) NOPASSWD:ALL
注意:atguigu这一行不要直接放到root行下面,因为所有用户都属于wheel组,你先配置了atguigu具有免密功能,但是程序执行到%wheel行时,该功能又被覆盖回需要密码。所以atguigu要放到%wheel这行下面。
在/opt目录下创建文件夹,并修改所属主和所属组
mkdir /home/bigdata/module
mkdir /home/bigdata/software
chown bigdata:bigdata /home/bigdata/module
chown bigdata:bigdata /home/bigdata/software
- /home/bigdata/software : 用来放安装包
- /home/bigdata/module:用来放解压后的安装包。
卸载虚拟机自带的JDK
rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps
- rpm -qa:查询所安装的所有rpm软件包
- grep -i:忽略大小写
- xargs -n1:表示每次只传递一个参数
- rpm -e –nodeps:强制卸载软件
配置网络例子:
vim /etc/sysconfig/network-scripts/ifcfg-ens33
DEVICE=ens33
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
NAME="ens33"
IPADDR=192.168.10.102
PREFIX=24
GATEWAY=192.168.10.2
DNS1=192.168.10.2
注意:上面的配置更具自己的网络。
修改主机名
vim /etc/hostname
hadoop102
配置Linux克隆机主机名称映射
vim /etc/hosts
例子:
192.168.10.101 hadoop101
192.168.10.102 hadoop102
192.168.10.103 hadoop103
修改windows的主机映射文件
192.168.10.102 hadoop102
192.168.10.103 hadoop103
192.168.10.104 hadoop104
剩下的就是
- 配置集群ssh免密登录
- 配置jdk环境
配置集群ssh免密登录
ssh-keygen (生成秘钥)
ssh-copy-id hadoop102 (把公钥拷贝到对应的机器)
配置JDK环境变量
sudo vim /etc/profile.d/my_env.sh
#JAVA_HOME
export JAVA_HOME=/home/bigdata/module/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin
集群分发脚本(xsync) 脚本使用例子./xsync ../module/hadoop-3.2.3/(分发hadoop到集群其他机器)
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in hadoop102 hadoop103 hadoop104
do
echo ==================== $host ====================
#3. 遍历所有目录,挨个发送
for file in $@
do
#4 判断文件是否存在
if [ -e $file ]
then
#5. 获取父目录
pdir=$(cd -P $(dirname $file); pwd)
#6. 获取当前文件的名称
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
总结:
- 关闭防火墙,关闭selinux避免集群之间通信干扰
- 创建非root用户,相对的保证了集群操作的安全性
- 创建集群的工作环境
- 卸载本机自带的jdk,安装jdk1.8
- 配置集群的hosts(hadoop访问的时候需要域名)
- 配置ssh方便集群之间文件的分发还有其他的免密操作
- 最终结果(bigdata用户xsync可以直接分发文件到集群,java环境配置好)
Hadoop完全分布式集群安装
Hadoop重要目录
(1)bin目录:存放对Hadoop相关服务(hdfs,yarn,mapred)进行操作的脚本
(2)etc目录:Hadoop的配置文件目录,存放Hadoop的配置文件
(3)lib目录:存放Hadoop的本地库(对数据进行压缩解压缩功能)
(4)sbin目录:存放启动或停止Hadoop相关服务的脚本
(5)share目录:存放Hadoop的依赖jar包、文档、和官方案例
集群规划
hadoop2 | datanode,nodemanager,namenode |
hadoop3 | datanode,nodemanager,resourcemanager |
hadoop4 | datanode,nodemanager,secondnamenode,historyserver |
修改配置
修改etc里面的workers文件(里面第datanode,nodemanage所在的机器)
hadoop102
hadoop103
hadoop104
core-site.xml
<configuration>
<property>
<!--指定 namenode 的 hdfs 协议文件系统的通信地址-->
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:8020</value>
</property>
<property>
<!--指定 hadoop 集群存储临时文件的目录-->
<name>hadoop.tmp.dir</name>
<value>/home/bigdata/module/hadoop-3.2.3/data</value>
</property>
<!-- 配置HDFS网页登录使用的静态用户为bigdata -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>bigdata</value>
</property>
<property>
<name>fs.trash.interval</name>
<value>1</value>
</property>
<property>
<name>fs.trash.checkpoint.interval</name>
<value>1</value>
</property>
<!-- 配置该bigdata(superUser)允许通过代理访问的主机节点 -->
<property>
<name>hadoop.proxyuser.bigdata.hosts</name>
<value>*</value>
</property>
<!-- 配置该bigdata(superUser)允许通过代理用户所属组 -->
<property>
<name>hadoop.proxyuser.bigdata.groups</name>
<value>*</value>
</property>
<!-- 配置该bigdata(superUser)允许通过代理的用户-->
<property>
<name>hadoop.proxyuser.bigdata.users</name>
<value>*</value>
</property>
</configuration>
hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop102:9870</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:9868</value>
</property>
<property>
<name>dfs.hosts.exclude</name>
<value>/home/bigdata/module/hadoop-3.2.3/etc/blacklist</value>
</property>
</configuration>
创建blacklist黑名单
touch /home/bigdata/module/hadoop-3.2.3/etc/blacklist
yarn-site.xml
<configuration>
<property>
<!--配置 NodeManager 上运行的附属服务。需要配置成 mapreduce_shuffle 后才可以在 Yarn 上运行 MapReduce 程序。-->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<!--resourcemanager 的主机名-->
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</value>
</property>
<!-- 开启日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop104:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<!--是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true -->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<!--是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
</configuration>
mapred-site.xml
<configuration>
<property>
<!--指定 mapreduce 作业运行在 yarn 上-->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/home/bigdata/module/hadoop-3.2.3</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/home/bigdata/module/hadoop-3.2.3</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/home/bigdata/module/hadoop-3.2.3</value>
</property>
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop104:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop104:19888</value>
</property>
</configuration>
修改好上面的配置文件以后配置环境变量
sudo vim /etc/profile.d/my_env.sh
#HADOOP_HOME
export HADOOP_HOME=/home/bigdata/module/hadoop-3.2.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
source /etc/profile.d/my_env.sh
分发hadoop到其他机器,在namenode机器hadoop102执行
hdfs namenode -format
然后启动集群
集群启动脚本(hadoop.sh)
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi
case $1 in
"start")
echo " =================== 启动 hadoop集群 ==================="
echo " --------------- 启动 hdfs ---------------"
ssh hadoop102 "/home/bigdata/module/hadoop-3.2.3/sbin/start-dfs.sh"
echo " --------------- 启动 yarn ---------------"
ssh hadoop103 "/home/bigdata/module/hadoop-3.2.3/sbin/start-yarn.sh"
echo " --------------- 启动 historyserver ---------------"
ssh hadoop104 "/home/bigdata/module/hadoop-3.2.3/bin/mapred --daemon start historyserver"
;;
"stop")
echo " =================== 关闭 hadoop集群 ==================="
echo " --------------- 关闭 historyserver ---------------"
ssh hadoop104 "/home/bigdata/module/hadoop-3.2.3/bin/mapred --daemon stop historyserver"
echo " --------------- 关闭 yarn ---------------"
ssh hadoop103 "/home/bigdata/module/hadoop-3.2.3/sbin/stop-yarn.sh"
echo " --------------- 关闭 hdfs ---------------"
ssh hadoop102 "/home/bigdata/module/hadoop-3.2.3/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
启动./hadoop.sh start
分别访问hadoop102:9870,hadoop103:8088看到上面的页面说明启动成功
测试集群
官方WordCount
mkdir wcinput
cd wcinput
vim word.txt
hadoop yarn
hadoop mapreduce
然后将创建的文件上传到hdfs
hadoop dfs -put wcinput/ /
进入hadoop目录执行
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.3.jar wordcount /wcinput /wcoutput
看到上面的结果说明hadoop集群搭建成功! 现在开始我们下一阶段的学习,第一阶段完结 。