一、大数据概念
主要解决海量数据的存储和数据分析计算的问题
8bite =1 Byte,1k=1024Byte,
Bite Byte KB MB,GB,TB,PB,EB,ZB,YB,BB,NB,DB
- 大数据特点:
Volume 大量 (部分企业数据量达EB)
Velocity 高速(数据处理效率要高)
Variety 多样。(结构化+非结构化)
value 低价值密度
二、从hadoop框架讨论大数据生态
- Hadoop
hadoop的初衷是采用大量的廉价机器,组成一个集群!完成大数据的存储和计算!
1 hadoop 1.x和2.x区别
1.x和2.x的区别是将资源调度和管理进行分离!由统一的资源调度平台YARN进行大数据计算资源的调度!
提升了Hadoop的通用性!Hadoop搭建的集群中的计算资源,不仅可以运行Hadoop中的MR程序!也可以运行其他计算框架的程序!
在hadoop不久之后,由于MR的低效性,出现了许多更为高效的计算框架!
例如: Tez,Storm,Spark,Flink
完成大数据的计算
①写程序,程序需要复合计算框架的要求!
java---->main----->运行
MapReduce(编程模型)----->Map--Reducer
②运行程序,申请计算资源(cpu+内存,磁盘IO,网络IO)
java----->JVM------>OS----->申请计算资源
1.0: MapReduce(编程模型)---->JobTracker----->JVM----->申请计算资源
2.0: MapReduce(编程模型)---->jar------>运行时,将jar包中的任务,提交给YARN,和YARN进行通信
由YARN中的组件-----JVM------>申请计算资源
2 hadoop的组件
HDFS(框架):负责大数据的存储
YARN(框架): 负责大数据的资源调度
MR(编程模型): 使用Hadoop制定的编程要求,编写程序,完成大数据的计算!
2.1 HDFS:负责大数据的存储
Namenode(1个):
- 负责文件,名称等元数据(属性信息)的存储!
文件名,大小,文件切分了多少块(block),创建和修改时间等! - 职责:接受客户端的请求;接受DN的请求 ;向DN分配任务
- 负责文件,名称等元数据(属性信息)的存储!
DataNode(N个)
- 负责文件中数据的存储!
- 负责接受NM分配的任务;负责数据块(block)的管理(读,写)!
- 可选进程:SecondaryNamenode(N个): 负责辅助NameNode工作!
2.2 MapReduce
MapReduce(编程规范): 程序中有Mapper(简单处理)和Reducer(合并)
遵循MapReduce的编程规范,编写的程序,打包后,称为一个Job(任务)!
Job需要提交到YARN上,向YARN申请计算资源,运行Job中的Task(进程)!
Job会先创建一个进程MRAppMaster(mapreduce 应用管理者),由MRAppMaster向YARN申请资源!
MRAppMaster负责监控Job中各个Task运行情况,进行容错管理!
2.3 Yarn:负责集群中所有计算资源的管理和调度!
ResourceManager(1个): 负责整个集群所有资源的管理!
- 负责接受客户端的提交Job的请求!
- 负责向NM分配任务!
- 负责接受NM上报的信息!
NodeManager(N个): 负责单台计算机所有资源的管理!
- 负责和RM进行通信,上报本机中的可用资源!
- 负责领取RM分配的任务!
- 负责为Job中的每个Task分配计算资源!
Container(容器): 对任务运行环境的抽象
- NodeManager为Job的某个Task分配了2个CPU和2G内存的计算资源!
,避免被其他的task抢占资源! - 将计算资源,封装到一个Container中,在Container中的资源,会被暂时隔离
- 当前Task运行结束后,当前Container中的资源会被释放!允许其他task来使用
- NodeManager为Job的某个Task分配了2个CPU和2G内存的计算资源!
- ApplicationMaster :数据切分,为应用程序申请资源,并分配给内部任务,任务监控与容错
三、Hadoop 的运行环境搭建
1、重要目录
(1)bin目录:存放对Hadoop相关服务(HDFS,YARN)进行操作的脚本
(2)etc目录:Hadoop的配置文件目录,存放Hadoop的配置文件
(3)lib目录:存放Hadoop的本地库(对数据进行压缩解压缩功能)
(4)sbin目录:存放启动或停止Hadoop相关服务的脚本
(5)share目录:存放Hadoop的依赖jar包、文档、和官方案例
2、配置文件
(1)4个默认的配置文件:
位置: HADOOP_HOME/share/xxxx.jar/xxx-default.xml
文件名:core-default.xml: 设置hadoop最核心的参数!
hdfs-default.xml 保存的是hdfs相关的参数!
mapred-default.xml: MR程序在运行时,需要使用的参数!
yarn-default.xml: yarn在启动时,需要的参数!
(2)4个可自定义的配置文件:xxx-site.xml
core-site.xml: 用户自定义的设置hadoop最核心的参数!
hdfs-site.xml 用户自定义的保存的是hdfs相关的参数!
mapred-site.xml: 用户自定义的MR程序在运行时,需要使用的参数!
yarn-site.xml: 用户自定义的yarn在启动时,需要的参数!
(3) tips
可以自定义配置文件的目录: hadoop --config 配置文件的目录
如果没有配置,默认读取 HADOOP_HOME/etc/hadoop 中对应的配置文件!
Hadoop在启动时,先加载4个默认的配置文件,再加载用户自定义的配置文件,如果用户自定义的配置文件中有和4个默认配置文件中门的参数,可以覆盖之前已经加载的值!
hadoop-daemon.sh start namenode脚本在执行时,只会去默认的目录中读取配置文件!
3、hadoop的运行模式:本地模式、伪分布式模式以及完全分布式模式
(1) 本地模式:在本机上使用hdfs,使用的就是本地的文件系统
设置方法:
core-site.xml
中fs.defaultFS=file:///
(默认,不用修改)
(2)伪分布式:NN和DN在一台机器,且只有一个DN节点
设置方法:
- 配置集群
指定HDFS中namenode的地址,
core-site.xml
中fs.defaultFS=hdfs://hadoop101:9000
配置
hdfs-site.xml
指定HDFS副本的数量dfs.replication
启动集群
格式化nameNode ,
bin/hdfs namenode -format
,启动namenode,datanode启动NN: hadoop-daemon.sh start namenode
停止NN: hadoop-daemon.sh stop namenode 启动DN: hadoop-daemon.sh start datanode 停止DN: hadoop-daemon.sh stop datanode 使用: hadoop fs 命令 文件路径
- 查看集群jps
jps是JDK中的命令,不是Linux命令。不安装JDK不能使用jps
Yarn上运行mapreduce程序
完成大数据的计算!
①按照MR的规范编写一个程序 ②将程序打包为jar ③运行jar中的程序
两种运行模式:
取决于参数: mapreduce.framework.name=local(默认)
①本地模式(在本机上运行MR) mapreduce.framework.name=local在本机运行MR!在本机使用多线程的方式,运行多个Task!
②在YARN上运行 mapreduce.framework.name=yarn
将MR提交给YARN,由YARN将Job中的多个task分配到多台机器中,启动container运行task! 需要启动YARN,YARN由RM和NM进程组成!
(3) 完全分布式
准备3台客户机 P0501&wo
四、HDFS(hadoop distributed file system)分布式文件系统
1. hfs 不支持对文件的随机读写,可以追加,但不能修改
原因:文件在HDFS上存储时,以block为基本单位存储的
a. 没有提供对文件的在线寻址功能
b. 文件以块形式存储,修改了一个块中的内容,就会影响当前块之后的所有块,效率低
2. HDFS 不适合存小文件
原因: HDFS存储了大量的小文件,会降低NN的服务能力
NN负责文件元数据(属性,块的映射)的管理,NN在运行时,必须将当前集群中存储的所有文件的元数据全部加载到内存,NN需要大量的内存
4. 同一个文件在同一时刻只能有一个客户端写入
5. 块大小,取决于dfs.blocksize ,2.x 默认为128M,1.x 默认为64M
原因: 基于最佳传输损耗理论(在一次传输中,寻址时间占用总传输时间的1%时,本次传输的损耗最小,为最佳性价比传输)
不论对磁盘的文件进行读还是写,都需要先进行寻址
目前硬件的发展条件,普通磁盘写的速率大概为100M/s,寻址时间一般为10ms
块在传输时,每64k还需要校验一次,因此块大小,必须为2的n次方
6. 块大小需要合适调节
不能太大,a. 在一些分块读取的场景,不够灵活,会带来额外的网络消耗;b.在上传文件时,一旦发生故障,会造成资源的浪费。
不能太小,a. 块太小,同样大小的文件,会占用过多的NN的元数据空间;b. 块太小,在进行读写操作时,会消耗额外的寻址空间
7 副本数的概念指的是最大副本数
默认块大小128M,指的是块的最大大小。每个块最多存128M,如果当前块存储的数据不满128M,存了多少数据,就占用多少磁盘空间,一个块只属于一个文件。
8 shell操作
hadoop fs 既可以对本地文件系统进行操作还可以操作分布式文件系统
hdfs dfs 只能操作分布式文件系统
hadoop fs -help +命令,可查帮助文档
9 HDFS的写数据流程
①服务端启动HDFS中的NN和DN进程
②客户端创建一个分布式文件系统客户端,由客户端向NN发送请求,请求上传文件
③NN处理请求,检查客户端是否有权限上传,路径是否合法等
④检查通过,NN响应客户端可以上传
⑤客户端根据自己设置的块大小,开始上传第一个块,默认0-128M,
NN根据客户端上传文件的副本数(默认为3),根据机架感知策略选取指定数量的DN节点返回
⑥客户端根据返回的DN节点,请求建立传输通道
客户端向最近(网络举例最近)的DN节点发起通道建立请求,由这个DN节点依次向通道中的(距离当前DN距离最近)
下一个节点发送建立通道请求,各个节点发送响应 ,通道建立成功
⑦客户端每读取64K的数据,封装为一个packet(数据包,传输的基本单位),将packet发送到通道的下一个节点
通道中的节点收到packet之后,落盘(检验)存储,将packet发送到通道的下一个节点!
每个节点在收到packet后,向客户端发送ack确认消息!
⑧一个块的数据传输完成之后,通道关闭,DN向NN上报消息,已经收到某个块
⑨第一个块传输完成,第二块开始传输,依次重复⑤-⑧,直到最后一个块传输完成,NN向客户端响应传输完成!
客户端关闭输出流
10 异常写流程
①-⑥见上
⑦客户端每读取64K的数据,封装为一个packet,封装成功的packet,放入到一个队列中,这个队列称为dataQuene(待发送数据包)
在发送时,先将dataQuene中的packet按顺序发送,发送后再放入到ackquene(正在发送的队列)。
每个节点在收到packet后,向客户端发送ack确认消息!
如果一个packet在发送后,已经收到了所有DN返回的ack确认消息,这个packet会在ackquene中删除!
假如一个packet在发送后,在收到DN返回的ack确认消息时超时,传输中止,ackquene中的packet会回滚到
dataQuene。
重新建立通道,剔除坏的DN节点。建立完成之后,继续传输!
只要有一个DN节点收到了数据,DN上报NN已经收完此块,NN就认为当前块已经传输成功!
NN会自动维护副本数!
11 机架感知
2.7.2默认的策略:
第一个副本放在本地机架的一个DN节点
第二个副本放在本地机架的另一个DN节点
本地机架的网络拓扑举例最多为2,速度快!
第三个副本放在其他机架的一个DN节点
为了安全性
tomcat服务器日志
数据库服务卡mysql数据 客户端()
五、MapReduce
六、zookeeper
1、概述:zookeeper= 文件系统+通知机制
开源的分布式的,为分布式应用提供协调服务的apache项目,多用作为集群提供服务的中间件
负责存储和管理大家都关心的数据,eg,hdfs 的url
Zookeeper是java编写的一个开源的分布式的存储中间件!
Zookeeper可以用来存储分布式系统中各个进程都关心的核心数据!
Zookeeper采取观察者模式设计,可以运行客户端在读取数据时,设置一个观察者一旦观察的节点触发了指定的事件,服务端会通知客户端线程,客户端可以执行回调方法,执行对应的操作!
2、特点:
(1)一致性:zookpeer 中的数据按顺序分批入库,并最终一致
(2)原子性:一次数据更新要么成功要么失败
(3)单一视图:client 无论连接到哪个zk节点,数据都是一致的
(4)可靠性:每次对zk的操作状态都会保存到服务器,每个server保存一份相同的数据副本(和hdfs不一样,dhfs 每个datanode 数据不一致)
(5)更新请求顺序进行,来自同一个client的更新请求按其发送顺序依次执行
(6)实时性:在一定范围内,client 能读取到最新数据
3、数据结构
与unix文件系统类似,整体可看作一棵树,每个节点称作一个znode,每个znode可以类似看作一个目录,其他可以创建子目录
zookeeper 集群自身维护了一套数据结构,存储结构是一个树形结构,其上每个节点,成为znode,每个znode默认能存1M的数据,每个znode可以通过其路径唯一标示
4、应用场景:
数据发布与订阅:适用于配置信息多设备共享,会发生动态变化
软负载均衡:负责收集服务信息与状态监控
集群管理:每台机器的运行状态收集
5、使用
启动: bin/zkServer.sh start
bin/zkCli.sh -server host:port
停止: bin/zkServer.sh stop
bin/zkCli.sh -server host:port close|exit
增: create [-s] [-e] path data
-s: 创建一个带序号的znode
-e: 创建一个临时znode,临时的znode被所创建的session拥有,一旦session关闭,临时
节点会被删除
删: delete path
rmr path
改: set path data
查: get path
stat path
ls path
ls2 path
支持四字命令
nc hadoop101 2181 ruok
设置观察者
get path watch: 监听指定节点数据的变化
ls path watch: 监听当前路径子阶段数据的变化,一旦新增或删除了子节点,会触发事件
注意: 观察者在设置后,只有当次有效!
二、ZK集群的注意事项
ZK在设计时,采用了paxos协议设计,这个协议要求,集群半数以上服务实例存储,集群
才可以正常提供服务
ZK集群中,server有Leader 和Followwer两种角色
Leader只有一个,在集群启动时,自动选举产生! 选举Leader时,只有数据和Leader保持同步的Follower有权参与竞选Leader! 在竞选Leader时,serverid大的Server有优势!
集群模式ZK的写流程
①客户端可以连接任意的zkserver实例,向server发送写请求命令 ②如果当前连接的server不是Leader,server会将写命令发送给Leader ③Leader将写操作命令广播到集群的其他节点,所有节点都执行写操作命令 ④一旦集群中半数以上的节点写数据成功,Leader会响应当前Server,让当前Server 响应客户端,写操作完成!