主要解决海量数据的存储和数据分析计算的问题java
8bite =1 Byte,1k=1024Byte,node
Bite Byte KB MB,GB,TB,PB,EB,ZB,YB,BB,NB,DBmysql
Volume 大量 (部分企业数据量达EB)sql
Velocity 高速(数据处理效率要高)shell
Variety 多样。(结构化+非结构化)数据库
value 低价值密度apache
1.x和2.x的区别是将资源调度和管理进行分离!由统一的资源调度平台YARN进行大数据计算资源的调度!
提高了Hadoop的通用性!Hadoop搭建的集群中的计算资源,不只能够运行Hadoop中的MR程序!也能够运行其余计算框架的程序!编程
在hadoop不久以后,因为MR的低效性,出现了许多更为高效的计算框架!
例如: Tez,Storm,Spark,Flinktomcat
完成大数据的计算
①写程序,程序须要复合计算框架的要求!安全
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------>申请计算资源
HDFS(框架):负责大数据的存储
YARN(框架): 负责大数据的资源调度
MR(编程模型): 使用Hadoop制定的编程要求,编写程序,完成大数据的计算!
Namenode(1个):
DataNode(N个)
MapReduce(编程规范): 程序中有Mapper(简单处理)和Reducer(合并)
遵循MapReduce的编程规范,编写的程序,打包后,称为一个Job(任务)!
Job须要提交到YARN上,向YARN申请计算资源,运行Job中的Task(进程)!
Job会先建立一个进程MRAppMaster(mapreduce 应用管理者),由MRAppMaster向YARN申请资源!
MRAppMaster负责监控Job中各个Task运行状况,进行容错管理!
ResourceManager(1个): 负责整个集群全部资源的管理!
NodeManager(N个): 负责单台计算机全部资源的管理!
Container(容器): 对任务运行环境的抽象
(1)bin目录:存放对Hadoop相关服务(HDFS,YARN)进行操做的脚本
(2)etc目录:Hadoop的配置文件目录,存放Hadoop的配置文件
(3)lib目录:存放Hadoop的本地库(对数据进行压缩解压缩功能)
(4)sbin目录:存放启动或中止Hadoop相关服务的脚本
(5)share目录:存放Hadoop的依赖jar包、文档、和官方案例
(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脚本在执行时,只会去默认的目录中读取配置文件!
(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是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上存储时,以block为基本单位存储的
a. 没有提供对文件的在线寻址功能
b. 文件以块形式存储,修改了一个块中的内容,就会影响当前块以后的全部块,效率低
缘由: HDFS存储了大量的小文件,会下降NN的服务能力
NN负责文件元数据(属性,块的映射)的管理,NN在运行时,必须将当前集群中存储的全部文件的元数据所有加载到内存,NN须要大量的内存
缘由: 基于最佳传输损耗理论(在一次传输中,寻址时间占用总传输时间的1%时,本次传输的损耗最小,为最佳性价比传输)
不论对磁盘的文件进行读仍是写,都须要先进行寻址
目前硬件的发展条件,普通磁盘写的速率大概为100M/s,寻址时间通常为10ms
块在传输时,每64k还须要校验一次,所以块大小,必须为2的n次方
不能太大,a. 在一些分块读取的场景,不够灵活,会带来额外的网络消耗;b.在上传文件时,一旦发生故障,会形成资源的浪费。
不能过小,a. 块过小,一样大小的文件,会占用过多的NN的元数据空间;b. 块过小,在进行读写操做时,会消耗额外的寻址空间
默认块大小128M,指的是块的最大大小。每一个块最多存128M,若是当前块存储的数据不满128M,存了多少数据,就占用多少磁盘空间,一个块只属于一个文件。
hadoop fs 既能够对本地文件系统进行操做还能够操做分布式文件系统
hdfs dfs 只能操做分布式文件系统
hadoop fs -help +命令,可查帮助文档
①服务端启动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向客户端响应传输完成!
客户端关闭输出流
①-⑥见上
⑦客户端每读取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会自动维护副本数!
2.7.2默认的策略:
第一个副本放在本地机架的一个DN节点
第二个副本放在本地机架的另外一个DN节点
本地机架的网络拓扑举例最多为2,速度快!
第三个副本放在其余机架的一个DN节点
为了安全性
tomcat服务器日志
数据库服务卡mysql数据 客户端()
开源的分布式的,为分布式应用提供协调服务的apache项目,多用做为集群提供服务的中间件
负责存储和管理你们都关心的数据,eg,hdfs 的url
Zookeeper是java编写的一个开源的分布式的存储中间件!
Zookeeper能够用来存储分布式系统中各个进程都关心的核心数据!
Zookeeper采起观察者模式设计,能够运行客户端在读取数据时,设置一个观察者一旦观察的节点触发了指定的事件,服务端会通知客户端线程,客户端能够执行回调方法,执行对应的操做!
(1)一致性:zookpeer 中的数据按顺序分批入库,并最终一致
(2)原子性:一次数据更新要么成功要么失败
(3)单一视图:client 不管链接到哪一个zk节点,数据都是一致的
(4)可靠性:每次对zk的操做状态都会保存到服务器,每一个server保存一份相同的数据副本(和hdfs不同,dhfs 每一个datanode 数据不一致)
(5)更新请求顺序进行,来自同一个client的更新请求按其发送顺序依次执行
(6)实时性:在必定范围内,client 能读取到最新数据
与unix文件系统相似,总体可看做一棵树,每一个节点称做一个znode,每一个znode能够相似看做一个目录,其余能够建立子目录
zookeeper 集群自身维护了一套数据结构,存储结构是一个树形结构,其上每一个节点,成为znode,每一个znode默认能存1M的数据,每一个znode能够经过其路径惟一标示
数据发布与订阅:适用于配置信息多设备共享,会发生动态变化
软负载均衡:负责收集服务信息与状态监控
集群管理:每台机器的运行状态收集
启动: 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: 监听当前路径子阶段数据的变化,一旦新增或删除了子节点,会触发事件 注意: 观察者在设置后,只有当次有效!
2、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 响应客户端,写操做完成!