Bigdata:数据分三类
结构化数据:约束
半结构化数据:xml,json,yaml没有预定义的数据模型
非结构化数据:没有元数据;日志信息,
搜索引擎:搜索组件、索引组件(一般保存在分布式存储中)
蜘蛛程序;(爬取的数据都是非结构化,半结构化数据)
搜索引擎构建出倒排索引来检索,
ELK,任何文档要被检索需要先被分析,分析由分析器完成,需要分词和正规化,分析的结果正规化后生成索引
存储:
分析处理:
2003年:The Google File System 论文,google,
GFS不支持对数据随机实时访问,且只适用存储少量体型巨大的文件
2004年:MapReduce: Simplified Data Processing On Large Cluster (能够将处理任务分为一个个任务单元,并行运行个节点的,收集个节点的结果来处理,二次处理得到数据,PB数据并行处理框架)
2006年:BigTable:A Distributed Storage System for Structure Data
(用于存储结构化数据的分布式存储系统,不支持传统的范式,类似键值对的格式实现数据存储)
HDFS + MapReduce = Hadoop(底层的分布式存储形态,完成数据分布式处理的框架
hadoop的 分布式文件系统局势HDFS)
HBase hadoop的database
2
Nutch 就是网络爬虫程序,专门给lucene生成poll数据,开源的搜索引擎的实现,爬来的数据能导入到lucene中去,lucene负责索引,但是数据越来越大,存储不好,google就发布了论文,
hadoop有个缺陷,mapreduce是个批处理结构,受限于存储和工作机制,工作速度和处理性能非常的差,存储采用有中心节点的存储格式
mapreduce 当某一个用户要处理存储分布式系统上的数据的时候,需要自己调用mapreduce开发框架,调用这个库来写一个程序,然后提交给mapreduce框架来运行
mapreduce代表三个东西,开发API,运行框架,运行时环境
程序员先要调用这个程序,写代码,一个代码运行分成多个实例,同时在各个节点各运行一份,每一份只处理一份本地应用的数据,默认数据副本是2各,每个数据由三份,分布式框架要探明数据存放在那些节点上
数据处理后还要合并
但是1节点完成时间块,2节点慢
map完了就reduce,第二个阶段什么时候开始,就是众多实例哪个最慢的完成了,如果出错还得重启,所以这样的速度是很慢的,hadoop是各mapreduce框架,不能要求实时反馈,提交一个作业可能第二天才有结果
NAS共享存储,SAN
缺陷,存储系统只有一个,面对大量数据存取的时候,前端有众多节点需要完成数据处理,网络,磁盘IO都会面临极大挑战,所以才有后来的分布式存储应用,这是集中的传统解决方案
有中心节点的分布式文件系统,HDFS,GFS,有一个节点专门做元数据服务器(做高可用,但是是存在内存中,需要做持久化),在HDFS元数据称为namenode NN,
数据节点DN,datanode
无中心节点的分布式文件系统,
innodb存储数据是依赖事务日志
NN :name node是存储了文件名和指明所在文件的数据块,每个文件都是分为trunk当作独立的存储单元来存储,每个trunk可能都在某个节点上存储一次,还会生成副本,有些数据如果没来得及保存,可能有些trunk本地就没有元数据了,跟文件系统一样检测,有元数据无数据的把元数据删除,把无元数据有数据的标记为数据块可用,一旦磁盘崩溃需要把磁盘文件载入进来,等待每个数据块所持的列表,最终完成文件系统检测,如果数据达到TB级别,需要半个小时以上
意味一旦元数据服务器崩溃了,再次启动需要半小时
后来HDFS采用了更高级点的方法,可用提供一个节点,辅助的名称节点,第二名称节点,SNN secondary name node,名称节点既要自己不断更新数据,还需要自己放在追加日志文件中,还要不断把日志文件和映像文件合并起来,
把这些内容放在共享存储上,由secondary name node把信息合并到里面,万一主节点挂了,第二节点负责从共享存储,加载到内存中,等待报告,缩短了一部分时间,这就是HDFS1遇到的问题
海量数据可能元数据并不少,而且访问频率并不少,很有可能一个名称节点成为瓶颈,后来研究了联邦制,Federatic
任何一个文件系统,传统的基本都是树状结构,Federatic负责整个跟文件系统当中的一个分支,只看到一个片段,加入有四个分支,右侧的分支右侧的服务器维护,左侧的左侧的服务器维护,用户访问数据左侧的就发往左侧的服务器上,右侧的请求发送给另外的服务器
但是这也很不漂亮
HDFS2就得到了解决,nn可用高可用了
把元数据不直接存储在本地内存中,而是找一个共享存储来存放,这个共享存储是用内存来完成基于元数据存储的,这个共享存储常见的解决方案就是NFS,后来用ZOOKeeper(自身能特别好支持分布式应用,能自动解决依赖),因此可用把节点都存储在zookeeper上,第二个节点的更新操作也向zookpeer发送,因此每一个zookeeper都可用得到一致的试图了,所以访问每个节点都没有问题,zookeeper,记录的这两个节点是一主一备,有问题了用另外的代替
HDFS2,高可用有很好的解决方案了
数据节点主要用来存放各trunk,不会通过高可用来解决数据问题,而是通过数据副本,每个节点存的trunk,都在其他节点上也找一个,存储一个副本数据,默认存三分,一主2备,存的时候就存一个,其他的由HDSF决定另找两份存,基于链式的方式进行复制,第一个完成第二个,第二个完成第三个,所以称为链式复制机制,每一次复制完了还需要报告存储结束,元数据节点的内node列表就更新了
任何一节点故障都会导致某一个数据块的副本数量不够,需要及早让元数据节点及早得知,因为必须要补足副本,再出现故障,将来可能数据丢失,数据节点不断向元数据节点报告自己情况,在线,数据块列表,元数据节点有两个列表,以数据为核心的在那些节点上,节点为核心由哪些数据块
如果某个节点超时一直没有报告,如果报告的数据块数量和存的数据列表不一致,可能就认为这个数据节点损失了,这时候就需要链式重新启动,补足不够的数据块列表,这就是数据块的可用性,这就是HDFS基本工作法则
**
存储得到解决,如何对数据进行处理,适用mapreduce,mapreduce也一样作为集群在工作,依然把存储数据的节点当作集群中的节点,把每一个节点都是可用运行程序的节点
MAP REDUCE,1.是一个API,2.运行框架,3.运行时环境
一个任务怎么被map,一个任务被请求后应该被分成几个map,由mapreduce的freework来控制,需要一个总控节点,
mapreduce集群也需要一个能调度,提交用户请求的节点,所以用户要想运行作业时,需要向司令部请求允许一个任务,这个map需要被允许多个节点上,运行在有数据的节点上,但是数据在哪就运行几个节点也不合适,一个节点所能运行的任务数量是有限的,因此在你启动的时候,很可能已经有任务了,每一个节点所跑的任务都是java程序,而一个java程序通常需要大量的系统资源,每一个节点能跑几个任务事先都是定义好的
jobtracker,作业追踪器所追踪的作业都是运行在datanode上的,在作业追踪器的上下文中,不叫datanode,而叫做tasktracker 任务追踪器,
所以每个数据节点都需要运行两类进程,datanode负责存储或删除数据管理操作,tasktracker负责完成数据任务,属于mapreduce
所以一个hadoop就是两类集群的结合,两个集群共享两个存储数据的节点,所以每个节点既是存数据又是处理数据的,这种数据处理模型和传统的还是有所区别的
传统的:程序运行在哪里,数据就应该在哪里,程序运行在哪里就需要把数据加载到哪里
现在的:数据在哪里,程序在哪里跑**
小规模的hadoop集群可能是这样子,N个数据节点,tasktracker,再有一个节点是jobtracker ,还是namenode。tasktracker和datanode是无法分离的。对一个任务所用到的tasktracker并非是集群中的所有节点,有可能是其中的一部分。甚至有可能是其中的一个,为了避免一个datanode执行很多的task,有一个Task slot任务槽来决定一个任务运行多少份任务,这就是hadoop分布式运行处理框架
了解mapreduce先了解函数式编程,一个函数可以把另外的函数当参数
函数式编程:
Lisp, ML函数式编程语言;高阶函数;
map(一个任务映射为多个任务), fold(做折叠)
map: (python支持函数编程)
map(f())
map:接受一个函数为参数,并将其应用于列表中的所有元素;从而生成一个结果列表;
能够把一个函数在列表中的每一个元素上都运行一次
“Ou Yangfeng”, “Dongfang Bubai”, “Saodi Seng”, "Dugu Qiubai"
fold:fold在上面的结果列表上再次作折叠
接受两个参数:函数,初始值
能够把函数应用在列表中的每一个元素和下一个元素上
运行是基于fold再传给一个参数g,初始值init
fold(g(), init)
“Hamo Gong”, “Kuihua Baodian”, “Yijin jing”, “Dugu Jiujian”
second third
把这个函数和得到的结果应用再第二个参数上,得到的结果当作init
(在处理第一个元素的时候,由g函数来处理,处理的时候把初始值当参数,处理之后得到一个结果,得到second第二个值,会把g函数应用在第二个元素上,把second当作参与值,会生成第三个参数,third,而后把g应用在第三个列表上,third当作它的参数,最终生成一个最终结果)
Kuihua Baodian
mapreduce参考 ,map和fold这样的机制
mapreduce:
mapper(是在tasktracker运行的实例,需要等待所有的mapper都运行完了,结果很大,处理起来很慢该如何), reducer
统计一本书每个单词出现的次数:
mapper: 每100页一个单位,5 mappers
用于拆分成为单词;10000000,拆成单词就为结果列表
reducer:
把10000000拆为两份
(同一个单词都放在一个reducer)
reducer1, reducer2
this 500
is 20
how 301
do 32
mapper需要把每一个单词分发给多个reducer时,同一个单词只能分发给同一个reducer’
这个过程是shuffle and sort,传输和排序
shuffle and sort
mapper:把整本书切成单词转换为 kv数据
同一个键出现多次
this 1, is 1, this 1, how 1
同一个键只能发往同一个reducer,一个键只能在其中一个reducer之上,reducer在生成一个键值数据
reducer:
this 500
is 20
有时候mapreducer形成的结果部是最终结果还需要再次处理,可能要mapreduceN次
要把一个大数据切割成多块,转换成键值数据,由mapper发送给mapper,mapper再转成键值,mapper对输入的键值处理以后,输出的也是键值
reducer的数量可以跟mapper不一样,同一个key只能发给一个reducer
中间的过程为shuffle and sort