+
+ {{ message.displayContent }}
++ 小张在写期末课程小论文的时候,上网查资料发现一篇文章特别有参考价值,但是这篇文章无法复制,小张要怎么做才能获得这篇文章的电子版呢? +
+OCR是一个简称,全称叫Optical CharacterRecognition,中文是:光学字符识别。
+它的本质是:把图像形状转变为文本字符。
+下面说一下,我在教育行业是如何应用OCR的
+信息化教学越来越普及,很多教学素材都要搬到信息化平台,比如试卷试题。那么,纸质的试卷要电子化,就会用到OCR识别技术
+
这么一张图,需要识别成结构化(图片、文字、公式、表格可独立提取出来)的数据,识别结果如下所示:
+
而且,识别结果还可以下载成word文档,便于老师校对并进行二次编辑.
+除此之外,我们常见的各种证件识别、名片识别、车牌识别等,也涉及OCR技术。
+OCR技术的实现,总体上可以分为五步:预处理图片、切割字符、识别字符、恢复版面、后处理文字。
+
我们买回来水果,需要洗一下再吃。如果运气不好的话,还需要挖掉虫眼和糙皮才能吃。我们把吃水果前的这些步骤,叫做CSG(吃水果)的预处理。
+在进行OCR之前,也需要对图片进行预处理。因为,一般待识别的图片千奇百怪,来源复杂:有拍照、有扫描、有截图。
+拿拍照来说,有夏至那天中午头儿,在阳光直射下拍的;也有人在傍晚,拿着大顶转着圈儿拍的。如果不进行预处理,OCR会很为难,因此需要进行灰度化,二值化,噪声去除,倾斜矫正等预处理过程。
+
假设,通过了预处理,我们的图片都变得很规范,于是,我们需要切割字符,把每一个字都给他挖出来。
+
并且,还需要对每个字符做好标记,因为识别完了,还得还原回去。识别完了,结果是一堆单蹦的“1”、“2”、“3”、“+”、“-”字符。我们需要根据它们的相对
位置,还原成“8-7=1”。所以,我们就知道了,哪个题目做对了,做错了,从而给出批改结果。
图片究竟是怎么变为字符的?它还能自己学习。计算机通过学习一些样本之后,遇到一些从未遇到过的同类样本,也能正确地识别出结果,原理如下:
+ 我带着孩子去公园,公园门口有一对大狮子。孩子指着狮子说,狗!我说,哦,那不是狗,那是狮子,跟狗有点像是不是。又走了一段路,公园里又出现一个麒麟的雕塑。孩子指着它说,狮子!我说,那不是狮子。
+ 孩子说,是狗。我说也不是狗,它叫:麒麟。我感觉到,孩子的大脑在反向矫正信息,这就是监督学习。
+ 当我给他看狗的图片时,我告诉她这是狗。
+ 她根据自己的认知,找了几个特征,构建了一个模型:长嘴+尖牙=狗。
+ 虽然只是看过图片,但是出门遇到真狗,她根据这个模型也认识对了。
+ 后来,她遇到了狮子,她修改了模型:长嘴+尖牙+鬃毛≠狗=狮子。
+ 后来,又遇到了麒麟,这个公式变得越来越复杂……决策项越来越多。
+ 人工智能,就是模拟的人类的神经元,构建神经网络来尝试寻找特征和结果的关系。如果对了,就给这个特征加分。如果,错了,就给这个特征减分。
+ 识别数字,也是一样。
+ 比如在学习识别数字6的时候,它随机认为只要有一个圈圈特征,就是数字6。
+ 验证其他样本时,发现这个随机特征是对的(不对就再换一个特征再试)。于是,它建立了一个模型:只要有圈这个特征,就是6。
+ 后来,这个模型遇到了数字0。加入新样本后,人工智能发现,0也有圈,但它不是6,也有可能是0。得再找一个特征,于是,新增一条,有勾就是6。后来,它又遇到了9。那勾在上面的就是6。后来,它又遇到了字
+ 母b……反正计算机有的是算力,能在很短的时间内完成这些学习。上面我是搂着说的,其实即便在32*32像素的小图片上,它随机上几十个特征去做验证,一点都不吃力。
+ 这就是识别字符的原理。OCR字符的识别从来不难。难的是两头,比如开头的预处理,以及下面要说的后处理。
+
识别出了字符,意义不大,有效地连接起来才能发挥作用。
+我们期望的拆分和还原应该是下面这样:
+
“10+2= 4-3= 5+6=11”这些文本从数据结构上应该是一行。而且,“10+2=”从数据结构上是一个基本单位。因为,我们要对基本单位做运算和批改。这才叫还原,其实并不简单。
+ 5.后处理文字 +
+ OCR识别的最终目的,是要获得一份准确的、结构化的文本内容。
+ 单个字符识别,其实是各自为战,前后不商量。
+ 就比如,遇到一个圆圈形状的字符图片。OCR识别就犯了难,它是数字“0”?汉字“〇”?大写字母“O”?小写字母“o”?中文句号“。”?还是“Q”忘了加尾巴……
+ 啥都对,啥都不对。
+ 所以,需要矫正……校正。这两个词,都是高频词,尤其拼音打字jiaozheng,容易出错。其实,也好分辨。看语境,如果我前后提到了“文稿”,那么是“校正”的可能性就大。如果我刚刚说了“牙齿”、“视力”、“角度”啥的,那么基本上就应该是“矫正”了。
+ OCR识别的最后一步校正也是一样。如果无法确定是数字“0”还是字母“o”,可以观察它相邻的几个字符,下面一图胜千言
+

+ 小张假期和几个朋友一起出去旅游,旅途很开心,也拍了很多照片,小张想挑出包含自己的照片,可面对那么多照片犯了难,突然他想到了手机相册里的自动分类功能,
+ 可以把某个人识别出来自动建一个相册,解决问题的同时,他对这个功能背后的原理产生了兴趣,接下来跟着小张一起探究背后的原理吧。
+
请选择一张单人照,让计算机识别该单人照人脸特征
+
+
人脸图像预处理是在进行人脸识别或其他人脸相关任务之前对图像进行的一系列处理步骤。这些步骤包括但不限于:光线调整、旋转和切割、图像滤波、图像尺寸归一化、图像灰度化等步骤,这些预处理步骤的目的是为了在系统对人脸图像的检测基础之上,对人脸图像做出进一步的处理,以利于人脸图像的特征提取,从而提高人脸识别的准确性和可靠性。
+
+
+
+
我们需要利用人脸识别算法对照片中的人脸特征进行提取和比对。人脸特征提取过程的输入也是 “一张人脸图”和“人脸五官关键点坐标”,输出是人脸相应的一个数值串(特征)。人脸特征提取算法都会根据人脸五官关键点坐标将人脸对齐预定模式,然后计算特征。我们将这个特征向量与数据库中已有的特征向量进行比对,找到最相似的那个特征向量所对应的人脸。
+
+
+
请识别包含步骤一所选人物的照片
+
+
+ 将识别到的正确图片放置到框内
+ 人脸是日常生活中最常见和最熟悉的生物特征。作为人工智能应用最广泛的技术,人脸识别常用于安防、支付、考勤、金融等领域,提升了人们生活的安全性和便捷性。
+ 什么是人脸识别? +人脸识别是基于人的脸部特征信息进行身份识别的一种生物识别技术,通过个体先天的生理特性(如人脸、指纹、虹膜、掌纹等)或后天积累形成的行为特征(如字迹、语调、步态等)来完成对个人身份的鉴定。
+ 该技术采集方式为摄像机或摄像头采集,以收集含有人脸的图像或视频等,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部识别。
+
一般来说,该技术的便捷性和安全性远高于密码、口令等传统身份鉴定方法。目前主流的生物特征识别技术有指纹识别、人脸识别、虹膜识别、语音识别、静脉识别、声纹识别等。
+ 而这其中,相比于传统的指纹识别或者是虹膜识别等生物识别技术,人脸识别解锁、人脸识别防盗系统与人脸识别登录账户等应用更加广泛和多样。
+
人脸识别原理主要包含三方面:人脸检测、人脸跟踪与人脸对比。
+· 检测:人脸检测即面貌检测,是指在动态的场景与复杂的背景中寻找人脸并把它分离出来的过程。
+ · 跟踪:人脸跟踪指人脸映射的步骤,对被检测到的人脸进行动态目标跟踪。通常是通过测量眼睛之间的距离、下巴的形状、鼻子和嘴巴之间的距离,然后将其转换为一串数字或点。
+ · 对比:人脸对比是辨认的过程。简单来,就是将采样到的面像与库存的面像依次进行比对,并找出最佳的匹配对象。
+
机器本身没有办法辨别人脸,但数据可以帮助其完成。人工智能公司需要大量经过标注的人脸数据对模型进行训练并不断优化,最后得到一个数据偏见很小、可靠的人脸识别系统。
+ 人脸数据标注属于图像标注,运用的数据标注方法为关键点标注,关键点标注包括人体标注、面部标注、特定类别关键点标注等,是标注中一种常见的数据处理工具。
+ 人脸关键点数据标注是对于图像中人脸五官与轮廓定位的标注,主要用来对人脸的关键位置,如脸廓、眉毛、眼睛、嘴唇进行定位。
+

在实际场景中,不同的算法模型对面部标注的点数要求也不尽相同,具可分为关键点标注与非关键点标注,有特定位置的点即为关键点,描绘物体轮廓的点为非关键点。
+ 关键点指的是特定位置的点,而非关键点为关键点之间沿物体轮廓均分的点。如五官为关键点,面部轮廓为非关键点。
+ 每张人脸关键点数量从25到100点不等,数量越多越精细,对标注员的基本功和标注团队审核能力的要求也越高,标注质量的好坏,对人脸模型的算法精确度有很大作用。
+ 此外,为了提升标注与质检效率,面部标注也会利用多样辅助标注工具,让面部识别更加精细化。如自定义连线功能可灵活调整连线对象与颜色,椭圆标注模式可准确标注眼球的轮廓。
+

+ 面部特征分析:人脸识别依靠对五官、轮廓的精准定位,实现面部特征分析,主要用于智能医美行业。
+ 智能教育:人脸关键点标注可对老师、学生的脸部轮廓进行精准定位,可有效监察其上下课状态,为教育提供高效的监督作用。
+ 智能安防:人脸识别可准确监测车站、机场等公共场合的可疑人物,保障市民人身安全。
+ 金融行业:在金融领域中,人脸识别主要用于智能审核、自主开卡等业务,通过“刷脸”对用户身份进行鉴别,保护用户的资金安全。
+
+ 本案例通过搭建服务器集群,安装Hadoop组件,实训演练Hadoop的核心组件HDFS分布式文件系统的读、写流程和原理 +
+ 1、搭建服务器集群,为每个机架配置三台服务器,建立通信联系 +
+
+
+
+
+
+
+
+
+
+
+
+ + (每个块的大小可以通过配置参数(dfs.blocksize)来规定,默认的大小在hadoop2.x版本中是128M,在之前的版本中是64M。) +
+
+
+
+
+ 请求上传文件
+
+ 可以上传
+
+ 请求第一个块文件上传
+
+ 接收信息
+
+ 请求上传文件
+
+ 返回是否可以上传
+
+ 请求Block1上传到哪几个
+ DataNode服务器上
+
+ 返还可以上传的数据节点
+
+
+
+
+
+
+ 检查目标文件是否已存在
+ 父目录是否存在
+
+ 查询可用的数据节点,返回3个
+ DataNode节点,分别为DataN
+ ode1、DataNode2、DataN
+ ode3
+
+
+
+
+ 请求建立block1
+ 请求建立
+ block1
+ 传输通道
+
+ 请求建立
+ block1
+ 传输通道
+
+ 应答成功
+
+ IO存储备份
+ 成功
+
+ IO存储成功
+
+
+
+
+ 传输第一个
+ 网络传输备份
+
+ 网络传输备份
+
+ IO存储备份成功
+
+ IO存储备份成功
+
+ IO存储成功
+
+
+
+
+
+
+ Block1:{{value7}},{{value8}},{{value9}}
+Block2:{{value7}},{{value8}},{{value9}}
+Block3:{{value7}},{{value8}},{{value9}}
+Block4:{{value7}},{{value8}},{{value9}}
+步骤①: Client向NameNode发送信息,告知NameNode自己想读取哪一份文件
+ 步骤②: NameNode查找自身存下来的元数据(meta data)。为Client生成一张清单消息,这个消息包括:
+ 待读取的文件在集群上所有的block信息。
+ 每一个block信息的副本所存放的DataNode的ip地址(有3个副本就有3个DataNode)。同时对这3个地址,按照其和Client的距离排好序。
+ 步骤③: 客户端拿到清单,联系相关的DataNode,请求文件块。DataNode返回文件块给客户端。客户端会选取排序靠前的DataNode来依次读
+ 取Block块,每一个Block都会进行CheckSum若文件不完整,则客户端会继续向NameNode获取下一批的Block列表,直到验证读取出来文件是
+ 完整的,则Block读取完毕。
+ 步骤④客户端会把最终读取出来所有的Block块合并成一个完整的最终文件。
+
+
+
+
+
+ Block1:{{value7}},{{value8}},{{value9}}
+Block2:{{value7}},{{value8}},{{value9}}
+Block3:{{value7}},{{value8}},{{value9}}
+Block4:{{value7}},{{value8}},{{value9}}
+一、 分布式文件系统
+ 分布式文件系统是横跨在多台计算机上的存储系统,是分布式系统的一个应用子集。这些互相联网的计算机,也被称为集群。
+ Hadoop Distributed File System(简称 HDFS)是一个分布式文件系统,是
+ Hadoop
+ 的核心组件之一。它能够将大规模数据存储到多个服务器集群上,并提供数据访问服务。它的主要优势是:
+ •
+ 高容错性(受益于它的“副本拷贝”机制和“机架感知”机制),适合部署在廉价的机器上。
+ • 高吞吐量的数据写入和访问
+
二、HDFS的架构
HDFS中有三个重要的模块:NameNode(名称节点)、DataNode(数据节点)和Client(客户节点)。这三个模块用典型的master/slave(主从)模式进行搭建。 +
+
+ 1、NameNode:即master节点。是分布式文件系统中的管理者。
+ NameNode的主要职责有:
+ • 管理文件系统的命名空间
+ • 管理集群的配置信息
+ •
+ 管理文件块(block)的复制(文件块是HDFS中的基本读写单元,在下面会细说)
+ • 监测DataNode及其所存储的数据的情况(心跳机制和数据报告机制)
+ 为了履行好这些职责,NameNode将文件系统的元数据(meta
+ data)存放在自己的内存中,元数据里主要包括:
+ • 文件信息
+ • 每一个文件对应的文件块的信息(block_id)
+ • 每一个文件块所存放的DataNode的信息
+ NameNode是整个HDFS中唯一的单点,因此它一旦故障,就会引起整个集群的故障。针对此做了一个防护措施,即构建一个节点Secondary
+ NameNode,该节点定期与NameNode进行通信,获取元数据的快照存储下来。
+ 2、DataNode:即slave节点,是真正存放文件数据的地方。更严谨地说,它存放的是文件块。
+ •
+ 通过心跳机制(heartbeat),它每隔3s就会向NameNode发送一次心跳,告诉NameNode自己没宕机。如果NameNode连续10min都没有收到心跳,它会认为这个DataNode已经死掉,所以将这个DataNode移出集群,并启动一个进程恢复数据,同时做好相应记录。
+ •
+ 通过数据报告机制,它在固定的周期内会向NameNode发送自己存储的所有文件块的信息(验证和校验)。这个机制让NameNode知道哪些数据副本已经损坏,及时创建副本(只要DataNode没死掉),并做好记录。
+ 3、Client:客户端,它的主要职责如下:
+ • 切分文件。把一份文件切分成若干个文件块。
+ • 与NameNode进行交互,获得文件信息和相关的DataNode的信息。
+ • 与DataNode进行直接交互,进行相关的数据流操作。
+ 以上三种类型的节点承担起了HDFS运作的主要工作,在Hadoop中,还有另外两个主要节点:JobTracker(作业跟踪节点)和TaskTracker(任务跟踪节点)。这两个节点在MapReduce的运作中起到重要作用。由于这里只关注HDFS数据的写和读,因此先略过这两个节点。在数据计算,即MapReduce中,再来看这两个节点。
+
三、HDFS写入数据
+
+ 步骤1:Client想写入一份文件,它首先将文件切分成若干个块(block),每个块64MB(或128MB)。例如原始文件200MB,则它被切分成四块,分别是64+64+64+8。
+ 然后它开始逐个处理文件块,针对第一个文件块(以下简称block1),它向NameNode发生请求:
+ • 每一个文件块,我都想在集群上存3个副本
+ • 因此,请帮我在集群上找到3个可以存副本的DataNode
+ “3”只是个默认值,Client可以自定义想要存放的副本个数
+
+ 步骤2:NameNode接收到Client的信息,做了如下处理
+ • 把这个文件块复制3份
+ • 为这个文件块找到可用的三个数据节点:DateNode A,DataNode E和DataNode
+ F。在找可用数据节点的过程中,NameNode启用了机架感知机制(rack-awareness):
+ 若Client在集群中,则将Client所在的节点选为第一个数据节点。
+ 若Client不在集群中,则随机选择一个节点。
+ • 就这样,NameNode选中了DataNode A
+ •
+ 第二个数据节点需要满足:和第一个数据节点在不同的机架(rack)上。就这样。NameNode选择了DataNode
+ E。
+ •
+ 第三个数据节点需要满足:和第二个数据节点在同一个机架上。就这样,NameNode选择了DataNode
+ F
+ 采用机架感知机制的原因是,在存放运行Hadoop和HDFS机器的数据中心中,一个机架共享同一个电源,网线和交换机。因此如果有意外,通常是一整个机架上所有的机器一起宕机。所以把副本存放在不同的机架上,也是为了有效应对这个情况。
+ •
+ 将选好的三个数据节点的相关信息告诉Client,让Client自己和数据节点进行交流
+
+ • 步骤3:Client接收到数据节点信息,接下来发生了几件事:
+ Client直接联系DataNode A,告诉它存放一个block1的副本;
+ DataNode A联系DataNode E,告诉它存放一个block1的副本;
+ DataNode E联系DataNodeF,告诉它存放一个block1的副本。
+ •
+ 步骤4:三个副本都存放在各自的DataNode上后,三个DataNode给NameNode发送消息,告知NameNode存放已经完成。
+ • 步骤5:
+ 第一个block的存储结束后,其余block按照相同的流程进行存储。所有block存完之后,Client将会通知NameNode终止写入流程。
+
四、HDFS读出数据
+
+ • 步骤1: Client向NameNode发送信息,告知NameNode自己想读取哪一份文件
+ • 步骤2: NameNode查找自身存下来的元数据(meta
+ data)。为Client生成一张清单消息,这个消息包括:
+ 待读取的文件在集群上所有的block信息。
+ 每一个block信息的副本所存放的DataNode的ip地址(有3个副本就有3个DataNode)。同时对这3个地址,按照其和Client的距离排好序。
+ • 步骤3:
+ 客户端拿到清单,联系相关的DataNode,请求文件块。DataNode返回文件块给客户端。返回完毕后关闭连接
+
+ 本任务以案例数据形式,介绍Apriori算法下的实现步骤,假设有四名客户(1、2、3、4),购买了编号为A、B、C、D、E若干 +
+
+ 支持度(support):定义为 supp(X) = occur(X) / count(D) = P(X)。P(A
+ ∩ B)表示既有A又有B的概率
+ 最小支持度(min_support)定义为50%
+
+ 步骤1、扫描数据库D,并计数 +
++ 步骤2、根据最小支持度50%的要求,比较剪枝,产生频繁项集L1 +
++ 步骤3、对满足要求的频繁项集L1进行排列组合,产生候选项集C2,并计算支持度 +
++ 步骤4、根据最小支持度50%的要求,扫描数据集,比较剔除,产生频繁项集L +
++ 步骤5、对满足要求的频繁项集L2进行排列组合,产生候选项集C3,并计算支持度 +
++ 步骤6、根据最小支持度50%的要求,扫描数据集,对不符合的候选项进行剪枝,产生频繁项集L3。循环结束 + 拷贝 +
++ 步骤7、总结以上的步骤,Apriori算法流程图如下所示: +
+
+
+
+
+
+
+
+ 数字营销
++ 所谓数字营销,就是指借助于互联网络、电脑通信技术和数字交互式媒体来实现营销目标的一种营销方式,从而以一种及时、相关、定制化和节省成本的方式与消费者进行沟通。数字营销将尽可能地利用先进的计算机网络技术,以最有效、最省钱地谋求新的市场的开拓和新的消费者的挖掘。数字营销包含了很多互联网营销(网络营销)中的技术与实践。通过数字化多媒体渠道,实现营销精准化,营销效果可量化,数据化的一种高层次营销活动。 +
+
+ + 数字营销与传统营销的区别? +
+
+
+ 传统营销策略主要围绕4P,即产品、价格、渠道、促销,以此制定公司发展和营销战略,以建立品牌意识为首要目的,较属于单向式、间接性方式。无法精确抓到目标对象,只能花费更多预算,投放更多广告宣传,以确保所有人都“记住”你的产品。
+ 数字营销策略与传统模式最大的差异是用户,企业不再以产品为中心闭门造车,而是更多地关注用户需求、体验,甚至以免费、补贴的方式来快速占领市场,同时更关注与用户的沟通连接。
+
+ + 智能推荐是以“客户需求”为导向的,是给客户带来价值的。常见的如淘宝的 + “你可能还喜欢”,亚马逊的 “购买此商品的用户也购买了” + 便是实例。常见的推荐系统分类有:基于应用领域: + 电子商务/社交好友推荐等;基于设计思想: + 基于协同过滤的推荐等;基于使用数据: 基于用户标签的推荐等。 +
+
+ Apriori算法
+
+ 1、算法简介
+ Apriori
+ algorithm是关联规则里一项基本算法。其核心思想是通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集,是由Rakesh
+ Agrawal和Ramakrishnan
+ Srikant两位博士在1994年提出的关联规则挖掘算法。关联规则的目的就是在一个数据集中找出项与项之间的关系,也被称为购物蓝分析
+ (Market Basket
+ analysis),“购物蓝分析”很贴切的表达了适用该算法情景中的一个子集。关于这个算法有一个非常有名的故事:"尿布和啤酒"。故事是这样的:美国的妇女们经常会嘱咐她们的丈夫下班后为孩子买尿布,而丈夫在买完尿布后又要顺
+ 手买回自己爱喝的啤酒,因此啤酒和尿布在一起被购买的机会很多。这个举措使尿布和啤酒的销量双双增加,并一直为众商家所津津乐道。
+
+
+ 2、算法的一些基本概念和定义
+ 资料库(Transaction Database):存储着二维结构的记录集。定义为:D
+ 所有项集(Items):所有项目的集合。定义为:I。
+ 记录 (Transaction ):在资料库里的一笔记录。定义为:T,T ∈ D
+ 项集(Itemset):同时出现的项的集合。定义为:k-itemset(k项集),k均表示项数。
+ 支持度(support):定义为 supp(X) = occur(X) / count(D) = P(X)。P(A ∩
+ B)表示既有A又有B的概率,例如购物篮分析:牛奶 ⇒
+ 面包,支持度3%:意味着3%顾客同时购买牛奶和面包
+ 置信度(Confidence):定义为 conf(X->Y) = supp(X ∪ Y) / supp(X) =
+ P(Y|X)。 P(B|A),在A发生的事件中同时发生B的概率 p(AB)/P(A)
+ 例如购物篮分析:牛奶 ⇒
+ 面包,置信度40%:意味着购买牛奶的顾客40%也购买面包
+ 候选集(Candidate itemset):通过向下合并得出的项集。定义为C[k]。
+ 频繁k项集:如果事件A中包含k个元素,那么称这个事件A为k项集事件A满足最小支持度阈值的事件称为频繁k项集。即支持度大于等于特定的最小支持度(Minimum
+ Support/minsup)的项集,表示为L[k]。注意,频繁集的子集一定是频繁集。
+ 强规则:同时满足最小支持度阈值和最小置信度阈值的规则称为强规则。即lift(X
+ -> Y) = lift(Y -> X) = conf(X -> Y)/supp(Y) = conf(Y -> X)/supp(X) =
+ P(X and Y)/(P(X)P(Y))
+
+ 3、实现步骤:
+ Apriori算法是一种最有影响的挖掘布尔关联规则频繁项集的算法,正如我们之前所提到的,我们希望置信度和支持度要满足我们的阈值范围才算是有效的规则,实际过程中我们往往会面临大量的数据,如果只是简单的搜索,会出现很多的规则,相当大的一部分是无效的规则,效率很低,那么Apriori就是通过产生频繁项集,然后再依据频繁项集产生规则,进而提升效率。以上所说的代表了Apriori算法的两个步骤:产生频繁项集和依据频繁项集产生规则。
+ 频繁项集就是对包含项目A的项目集C,其支持度大于等于指定的支持度,则C(A)为频繁项集,包含一个项目的频繁项集称为频繁1-项集,即L1。
+ 如何寻找频繁项集?Apriori使用一种称作逐层搜索的迭代方法,即“K-1项集”用于搜索“K项集”。首先,找出频繁“1项集”的集合,该集合记作L1。L1用于找频繁“2项集”的集合L2,而L2用于找L3。如此下去,直到不能找到“K项集”。找每个Lk都需要一次数据库扫描。核心思想是:连接步和剪枝步。连接步是自连接,原则是保证前k-2项相同,并按照字典顺序连接。剪枝步,是使任一频繁项集的所有非空子集也必须是频繁的。反之,如果某个候选的非空子集不是频繁的,那么该候选肯定不是频繁的,从而可以将其从CK中删除。简单的讲,1、发现频繁项集,过程为:(1)扫描(2)计数(3)比较(4)产生频繁项集(5)连接、剪枝,产生候选项集
+ 重复步骤(1)~(5)直到不能发现更大的频集。这里不再讲述,直接说一个例子大家就都明白了。Apriori寻找频繁项集的过程是一个不断迭代的过程,每次都是两个步骤,产生候选集Ck(可能成为频繁项集的项目组合);基于候选集Ck计算支持度,确定Lk。Apriori的寻找策略就是从包含少量的项目开始逐渐向多个项目的项目集搜索。
+
以下是Hadoop的技术框架图,请选择相应的组件填入其中:
+
+
Hadoop概述
++ Hadoop是一个由Apache基金会所开发的分布式系统基础架构。主要解决海量数据的存储以及海量数据的分析计算,Hadoop核心概念是HDFS(分布式存储),以及MapReduce。通俗来将就是,当一个海量数据,如果你使用传统方法去处理,比如10TB的数据,那么数据库就不太够用,并且即使数据库够用,那么在有限的资源(也就是CPU、内存)中处理的数据量是极少 + 的,10TB数据可能需要运作很久,那么有了Hadoop,HDFS是分布式存储文件系统,它将10TB数据分块存储在不同服务器(节点)中,然后在每个服务器中处理相应文件,也就是 + 相当于n个服务器并行处理,并且每个服务器都不需要太高的配置。而这些处理的任务是由MapReduce分配的。 +
++ 如果你不太清楚什么是并行:举个简单的例子。传统处理方法,假如要写10000个字,你一个人写字速度为一分钟100个,那么就需要100分钟才能写完。而采用并行处理,相当于有100同学一起写,并且分工明确,那么只需要一分钟,你们100个人就能写10000个字。 + 一个简单的案例就是WordCount,字数统计,假设有100G的文件,要统计里面所有单词出现的次数。 +
+传统方法:
++ 假设我们有个2G的机器。首先这100G我们不可能都加载到内存中,内存不够,所以要将100G文件依次读入内存中并操作,就产生类似下图的一个队列,每次读取文件的一部分然后再处理,然后处理时间。需要加载至内存的次数 + = 100G/2G = + 50次,假设每次处理字数统计所用时间为T(process),假设每次读取至内存所用时间为T(IO),假设将所有的50次统计结果汇总时间为T(wordcount),那么一共需要的时间为:50次 + x [T(process) + T(IO)] + T(wordcount) +
+可以看出是非常耗时的
+
+ 采用分布式并行计算后(Hadoop使用类似的方法,但是其多了reduce去汇总处理) +
+
+ 可以看到,同样将任务分割然后送到集群中不同的服务器(节点),每个服务器并行处理(可以理解为同时处理)。此时,依照上面传统方法的时间计算。共使用了1次
+ x [T(process)
+ + T(IO)] + T(wordcount)
+
+ 这里要注意,hadoop实际应用中,会将汇总处理也分布式并行处理,所以其实更加省时,这里先忽略,依然能看出两者相差的耗时。 +
+看完例子你可能就差不多知道hadoop是干什么的了:
+分布式存储:将文件分布式存储在多个服务器(节点)上。
++ 分布式并行处理:通过编写处理任务的代码,将文件进行切割,然后将文件以及任务资源(比如jar包,也就是你写的处理逻辑)分发给多个服务器,每个服务器进行并行处理。 +
+ +一、Hadoop介绍
+ 1.1 Hadoop是什么
+ Hadoop是一个开源的软件,并且是可靠性的(reliable)、可扩展性的(scalable)、分布式计算的(distributed
+ computing)软件。
+ • Hadoop是一个框架,可以允许分布式处理大数据集(big data
+ sets),而且这个数据集是横跨在集群的机器上的(clusters of
+ computers)。也就是说数据可以分开地存储在集群中的每个机器
(节点)上,并且可以跨节点进行处理计算,它使用的是一种简单的编程模型(using
+ simple programming models)。
+ •Hadoop被设计成可以从单个服务器(single
+ servers)扩展到数千台机器的的集群上,每台机器都提供本地的存储和计算服务。也就是说当数据量小的时候,可以使用少一点的机器的集群,
而面对一个大量数据的情况时,现有的机器不足以支撑存储运算时,只需要再添加一些机器到集群中,就能解决问题。
+ •Hadoop并不是依赖硬件来提供高可用性,而是它自己被设计成可以检测和处理应用层的故障。在集群中每台机器上提供高可靠性服务,而这些机器可能会倾向于出现故障。
+
+ 1.2 Hadoop能做什么
+ •Hadoop可以搭建大型数据仓库,PB级数据的存储、处理、分析、统计等业务。
+ •商业智能(BI)、可视化报表的产生等等。
+ •数据挖掘,从大量的数据中挖掘出有价值的结论等等。
+
1.3 Hadoop包括什么
+Hadoop框架包含以下模块
+
+ • Hadoop Common:提供支撑其他模块的通用工具。
+ • Hadoop HDFS:为应用程序访问提供高吞吐量的分布式文件系统。
+ • Hadoop YARN:提供任务调度服务和集群资源管理的框架。
+ • Hadoop MapReduce:可以并行处理大数据集的编程计算模型。
+ • Hadoop Ozone:提供对象存储的功能。
+ • Hadoop Submarine :提供机器学习引擎。
+
二、HDFS数据存储原理
+ 2.1 HDFS概述 +
+
+ HDFS,全称Hadoop Distributed File System,是一个分布式文件系统。
+ 分布式文件系统(Distributed File
+ System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。分布式文件系统的设计基于客户机/服务器
+ 模式。一个典型的网络可能包括多个供多用户访问的服务器。
+

+ HDFS是一个设计可以运行在廉价硬件上的分布式文件系统。HDFS是一个高容错和可部署(deployed)在廉价机器上的系统,提供了对应用程序数据的高吞吐量访问,适用于具有
大型数据集的应用程序。
+
+ • 2.2 HDFS特点
+ •
+ 商用硬件。硬件故障是常态,而不是异常。整个HDFS系统将由数百或数千个存储着文件数据片段的服务器组成。实际上它里面有非常巨大的组成部分,每一个组成部分都很可能出现故
障,这就意味着HDFS里的总是有一些部件是失效的,因此,故障的检测和自动快速恢复是HDFS一个很核心的设计目标。
+ •
+ 流数据访问。运行在HDFS之上的应用程序必须流式地访问它们的数据集,它不是运行在普通文件系统之上的普通程序。HDFS被设计成适合批量处理的,而不是用户交互式的。重点是
在数据吞吐量,而不是数据访问的反应时间,POSIX的很多硬性需求对于HDFS应用都是非必须的,去掉POSIX一小部分关键语义可以获得更好的数据吞吐率。
+ •
+ 大型数据集。运行在HDFS之上的程序有很大量的数据集。典型的HDFS文件大小是GB到TB的级别。所以,HDFS被调整成支持大文件。它应该提供很高的聚合数据带宽,一个集群中
支持数百个节点,一个集群中还应该支持千万级别的文件。
+ •
+ 简单一致模型。HDFS应用需要一个一次写入多次读取的文件访问模型。一个文件一旦创建,写入和关闭都不需要改变除了追加和截断(truncate)。支持在文件的末端进行追加数据而不
支持在文件的任意位置进行修改。这个假设简化了数据一致性问题和支持高吞吐量的访问。一个Map/Reduce任务或者web爬虫(crawler)完美匹配了这个模型。
+ •
+ 移动计算比移动数据便宜。在靠近计算数据所存储的位置来进行计算是最理想的状态,尤其是在数据集特别巨大的时候。这样消除了网络的拥堵,提高了系统的整体吞吐量。一个假定
就是迁移计算到离数据更近的位置比将数据移动到程序运行更近的位置要更好。HDFS提供了接口,来让程序将自己移动到离数据存储更近的位置。
+ •
+ 在异构硬件和软件平台上的可移植性。HDFS被设计成可以简便地实现平台间的迁移,这将推动需要大数据集的应用更广泛地采用HDFS作为平台。
+
2.3 HDFS架构
+
+ •
+ NameNode:管理节点,维护着文件系统树及整个树内的所有文件和目录(元数据),同时负责客户端请求。
+ •
+ DataNode:文件系统的工作节点,根据需要存储和检索数据块,并且定期向NameNode发送他们所存储的块的列表。
+ • Blocks:HDFS中的存储单元,默认为128M,通常有多个备份,默认为3个。
+
2.4 HDFS数据读写
+

+ 元数据有三种形式:内存、EditsLog、FsImage。
+ • 内存中保存的是最完整最新的元数据。
+ • EditsLog保存HDFS自最新的元数据检查点后的元数据变化的记录。
+ • FsImage保存最新的元数据检查点。
+ Checkpoint(检查点)指的是在NameNode启动时候,会先将fsimage中的文件系统元数据信息加载到内存,然后根据eidts中的记录将内存中的元数据同步至最新状态(这里读的是
journalnode中的editlog),将这个新版本的
+ FsImage 从内存中保存到本地磁盘上,然后删除旧的 Editlog。
+ fsimage存放上次checkpoint生成的文件系统元数据,Edits存放文件系统操作日志。checkpoint的过程,就是合并fsimage和Edits文件,然后生成最新的fsimage的过程。
+
2.6 HDFS副本存放
+
+ 机架感知策略:
+ •
+ 第一个复本放在运行客户端的节点上(如果客户端运行在集群之外,则在避免挑选存储太满或太忙的节点的情况下随机选择一个节点)。
+ • 第二个复本放在与第一个不同且随机选择的机架的节点上。
+ • 第三个复本与第二个复本放在同一个机架上,且随机选择另一个节点。
+ • 其它复本放在集群中随机选择的节点中,尽量避免在同一个机架上放太多复本。
+
三、MapReduce编程模型框架
+ 3.1 MapReduce概述
+ •
+ 定义:是谷歌开源的一种大数据并行计算编程模型,它降低了并行计算应用开发的门槛。
+ • 工作原理:利用一个输入key/value pair集合来产生一个输出的key/value
+ pair集合。
+ •
+ 运行机制:以一种可靠的、容错的方式,在大型的商用硬件集群(数千个节点)上并行处理大量数据(多为TB级别的数据集)。
+ • 优点:简单容易使用、扩展性强、高容错性、可离线计算 PB
+ 量级的数据。
+ • 缺点:实时计算、流式计算、有向图计算支持性不高。
+
3.2 工作原理
+
+ 分而治之。采用分布式并行计算,将计算任务进行拆分,由主节点下的各个子节点共同完成,最后汇总各子节点的计算结果,得出最终计算结果。
+ MapReduce任务通常将输入数据集分割成独立的块,由map任务以完全并行的方式处理。框架对map任务映射的输出进行排序,然后将这些输出输入到reduce任务中。
+ 通常,作业的输入和输出都存储在文件系统中,框架负责调度任务,监视任务,并重新执行失败的任务。
+ MapReduce框架只对'key,value',对进行操作,也就是说,框架将作业的输入视为一组'key,value'对,并生成一组'key,value'对作为作业的输出,可以认为是不同类型的。
+
3.3 MapReduce执行步骤
+
+
+
+ •
+ 第一阶段是把输入文件按照一定的标准分片(InputSplit),每个输入片的大小是固定的。默认情况下,输入片(InputSplit)的大小与数据块(Block)的大小
是相同的。如果数据块(Block)的大小是默认值64MB,输入文件有两个,一个是32MB,一个是72MB。那么小的文件是一个输入片,大文件会分为两个数据块,那么是两个输入片。一共产生三个输入片。每一个输入片由一个
Mapper进程处理。
+ •
+ 第二阶段是对输入片中的记录按照一定的规则解析成键值对。有个默认规则是把每一行文本内容解析成键值对。“键”是每一行的起始位置(单位是字节),“值”是本行的文本内容
+
+ •
+ 第三阶段是调用Mapper类中的map方法。第二阶段中解析出来的每一个键值对,调用一次map方法。如果有1000个键值对,就会调用1000次map方法。每一次调用map方法会输出零个或
者多个键值对。
+ •
+ 第四阶段是按照一定的规则对第三阶段输出的键值对进行分区。分区是基于键进行的。比如我们的键表示省份(如北京、上海、山东等),那么就可以按照不同省份进行分区,同一个省份
的键值对划分到一个区中。默认是只有一个区。分区的数量就是Reducer任务运行的数量。默认只有一个Reducer任务。
+
+ •
+ 第五阶段是对每个分区中的键值对进行排序。首先,按照键进行排序,对于键相同的键值对,按照值进行排序。比如三个键值对<2,2>、<1,3>、<2,1>,键和值分别是整数。那么排序后的
结果是<1,3>、<2,1>、<2,2>。如果有第六阶段,那么进入第六阶段。
+
+ •
+ 第六阶段是对数据进行归约处理,也就是reduce处理,通常情况下的Combine过程,键相等的键值对会调用一次reduce方法,经过这一阶段,数据量会减少,归约后的数据输出到本地的linux文件中。
+
+ 在MapReduec任务调度模型中,主要包含以下几个角色:
+
+ •
+ JobClient:接收客户端提交的程序jar包,并进行一系列的操作,具体会在下面进行详细分析。
+
+ •
+ JobTracker:负责接收JobTracker分配的作业,将Task分配到各个节点上去运行,并提供诸如监控工作节点状态及任务进度等管理功能,一个MapReduce集群只有一个JobTracker。
+
+ •
+ TaskTracker:负责监控任务的执行情况,并通过心跳连接周期性地向jobtracker汇报任务进度,资源使用量等。每台执行任务的节点都会有一个TaskTracker
+ ,其使用“slot”等量划分本节点
上的资源量。“slot”代表计算资源(CPU、内存等)。一个Task
+ 获取到一个slot 后才有机会运行,slot 分为Map slot和Reduce slot
+ 两种,分别供MapTask 和Reduce Task 使用。TaskTracker
通过slot
+ 数目(可配置参数)限定Task 的并发度。
+
+ • HDFS:用于提供数据存储服务和和作业间的文件共享。
+
四、YARN资源调度管理
+ 4.1 概述
+ YARN全称是Yet Another Resource
+ Negotiatord。通用的资源管理系统,要申请资源统一经过YARN进行申请。为上层应用提供统一的资源管理和调度。不同计算框架可以共享同一个HDFS
集群上的数据,享受整体上的资源调度:Spark
+ on YARN 、 MapReduce on YAEN 、 Storm on YARN
+ ...与其他计算框架共享集群资源,按资源需要分配,进而提高集群资源的利用率。
+
4.2 架构
+
+ Yarn 采用传统的 master-slave 架构模式,其主要由 4
+ 种组件组成,它们的主要功能如下:
+
+ •
+ ResourceManager(RM):全局资源管理器,负责整个系统的资源管理和分配;
+
+ • ApplicationMaster(AM):负责应用程序(Application)的管理;
+
+ • NodeManager(NM):负责 slave 节点的资源管理和使用;
+
+ • Container(容器):对任务运行环境的一个抽象。
+
4.3 执行流程
+
+ • 客户端向RM中提交程序 。
+
+ • RM向NM中分配一个container,并在该container中启动AM 。
+
+ •
+ AM向RM注册,这样用户可以直接通过RM査看应用程序的运行状态(然后它将为各个任务申请资源,并监控它的运行状态,直到运行结束)
+ 。
+
+ •
+ AM采用轮询的方式通过RPC协议向RM申请和领取资源,资源的协调通过异步完成。
+
+ • AM申请到资源后,便与对应的NM通信,要求它启动任务 。
+
+ •
+ NM为任务设置好运行环境(包括环境变量、JAR包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务
+ 。
+
+ •
+ 各个任务通过某个RPC协议向AM汇报自己的状态和进度,以让AM随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务
+ 。
+
+ • 应用程序运行完成后,AM向RM注销并关闭自己。
+
大数据之所以称为大数据,因其和“小数据”比较起来,有显著的特征:
+
+
在2003年,Google创造了两个突破,使得大数据成为可能:一个是Hadoop,它由两个关键服务组成:
+ · 使用Hadoop分布式文件系统(HDFS)可靠的数据存储
+ · 使用称为MapReduce的技术进行高性能并行数据处理。
+
一、大数据平台通用架构
+大数据技术的体系庞大且复杂,基础的技术包含数据的采集、数据预处理、分布式存储、NoSQL数据库、数据仓库、机器学习、并行计算、可视化等各种技术范畴
和不同的技术层面。
+ 首先科学的给出一个通用化的大数据处理技术框架,主要分为下面几个方面:数据采集与预处理、数据存储、数据清洗、数据查询分析和数据可视化。
+

二、数据采集与预处理
+ 对于各种来源的数据,包括移动互联网数据、社交网络的数据等,这些结构化和非结构化的海量数据是零散的,也就是所谓的数据孤岛,此时的这些数据并没有什么意义,数据采集就是将这些数据写入数据仓库中,把零散的数据整合在一起,对这些数据综合起来进行分析。数据采集包括文件日志的采集、数据库日志的采集、关系型数据库的接入和应用程序的接入等。在数据量比较小的时候,可以写个定时的脚本将日志写入存储系统,但随着数据量的增长,这些方法无法提供数据安全保障,并且运维困难,需要更强壮的解决方案。
+ Flume NG作为实时日志收集系统,支持在日志系统中定制各类数据发送方,用于收集数据,同时,对数据进行简单处理,并写到各种数据接收方(比如文本,HDFS,Hbase等)。Flume NG采用的是三层架构:Agent层,Collector层和Store层,每一层均可水平拓展。其中Agent包含Source,Channel和 Sink,source用来消费(收集)数据源到channel组件中,channel作为中间临时存储,保存所有source的组件信息,sink从channel中读取数据,读取成功之后会删除channel中的信息。
+ NDC,Netease Data Canal,直译为网易数据运河系统,是网易针对结构化数据库的数据实时迁移、同步和订阅的平台化解决方案。它整合了网易过去在数据传输领域的各种工具和经验,将单机数据库、分布式数据库、OLAP系统以及下游应用通过数据链路串在一起。除了保障高效的数据传输外,NDC的设计遵循了单元化和平台化的设计哲学。
+ Logstash是开源的服务器端数据处理管道,能够同时从多个来源采集数据、转换数据,然后将数据发送到您最喜欢的 “存储库” 中。一般常用的存储库是Elasticsearch。Logstash 支持各种输入选择,可以在同一时间从众多常用的数据来源捕捉事件,能够以连续的流式传输方式,轻松地从您的日志、指标、Web 应用、数据存储以及各种 AWS 服务采集数据。
+ Sqoop,用来将关系型数据库和Hadoop中的数据进行相互转移的工具,可以将一个关系型数据库(例如Mysql、Oracle)中的数据导入到Hadoop(例如HDFS、Hive、Hbase)中,也可以将Hadoop(例如HDFS、Hive、Hbase)中的数据导入到关系型数据库(例如Mysql、Oracle)中。Sqoop 启用了一个 MapReduce 作业(极其容错的分布式并行计算)来执行任务。Sqoop 的另一大优势是其传输大量结构化或半结构化数据的过程是完全自动化的。
+ 流式计算是行业研究的一个热点,流式计算对多个高吞吐量的数据源进行实时的清洗、聚合和分析,可以对存在于社交网站、新闻等的数据信息流进行快速的处理并反馈,目前大数据流分析工具有很多,比如开源的strom,spark streaming等。
+ Strom集群结构是有一个主节点(nimbus)和多个工作节点(supervisor)组成的主从结构,主节点通过配置静态指定或者在运行时动态选举,nimbus与supervisor都是Storm提供的后台守护进程,之间的通信是结合Zookeeper的状态变更通知和监控通知来处理。nimbus进程的主要职责是管理、协调和监控集群上运行的topology(包括topology的发布、任务指派、事件处理时重新指派任务等)。supervisor进程等待nimbus分配任务后生成并监控worker(jvm进程)执行任务。supervisor与worker运行在不同的jvm上,如果由supervisor启动的某个worker因为错误异常退出(或被kill掉),supervisor会尝试重新生成新的worker进程。
+ 当使用上游模块的数据进行计算、统计、分析时,就可以使用消息系统,尤其是分布式消息系统。Kafka使用Scala进行编写,是一种分布式的、基于发布/订阅的消息系统。Kafka的设计理念之一就是同时提供离线处理和实时处理,以及将数据实时备份到另一个数据中心,Kafka可以有许多的生产者和消费者分享多个主题,将消息以topic为单位进行归纳;Kafka发布消息的程序称为producer,也叫生产者,预订topics并消费消息的程序称为consumer,也叫消费者;当Kafka以集群的方式运行时,可以由一个服务或者多个服务组成,每个服务叫做一个broker,运行过程中producer通过网络将消息发送到Kafka集群,集群向消费者提供消息。Kafka通过Zookeeper管理集群配置,选举leader,以及在Consumer Group发生变化时进行rebalance。Producer使用push模式将消息发布到broker,Consumer使用pull模式从broker订阅并消费消息。Kafka可以和Flume一起工作,如果需要将流式数据从Kafka转移到hadoop,可以使用Flume代理agent,将Kafka当做一个来源source,这样可以从Kafka读取数据到Hadoop。
+ Zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,提供数据同步服务。它的作用主要有配置管理、名字服务、分布式锁和集群管理。配置管理指的是在一个地方修改了配置,那么对这个地方的配置感兴趣的所有的都可以获得变更,省去了手动拷贝配置的繁琐,还很好的保证了数据的可靠和一致性,同时它可以通过名字来获取资源或者服务的地址等信息,可以监控集群中机器的变化,实现了类似于心跳机制的功能。
三、数据存储
+
+ Hadoop作为一个开源的框架,专为离线和大规模数据分析而设计,HDFS作为其核心的存储引擎,已被广泛用于数据存储。
+
+ HBase,是一个分布式的、面向列的开源数据库,可以认为是hdfs的封装,本质是数据存储、NoSQL数据库。HBase是一种Key/Value系统,部署在hdfs上,克服了hdfs在随
机读写这个方面的缺点,与hadoop一样,Hbase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。
+
+ Phoenix,相当于一个Java中间件,帮助开发工程师能够像使用JDBC访问关系型数据库一样访问NoSQL数据库HBase。
+
+ Yarn是一种Hadoop资源管理器,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。Yarn由下面的几大组件构成:一个全局的资源管理器ResourceManager、ResourceManager的每个节点代理NodeManager、表示每个应用的Application以及每一个ApplicationMaster拥有多个Container在NodeManager上运行。
+
+ Mesos是一款开源的集群管理软件,支持Hadoop、ElasticSearch、Spark、Storm 和Kafka等应用架构。
+
+ Redis是一种速度非常快的非关系数据库,可以存储键与5种不同类型的值之间的映射,可以将存储在内存的键值对数据持久化到硬盘中,使用复制特性来扩展性能,还可以使用客户端分片来扩展写性能。
+
+ Atlas是一个位于应用程序与MySQL之间的中间件。在后端DB看来,Atlas相当于连接它的客户端,在前端应用看来,Atlas相当于一个DB。Atlas作为服务端与应用程序通讯,它实现了MySQL的客户端和服务端协议,同时作为客户端与MySQL通讯。它对应用程序屏蔽了DB的细节,同时为了降低MySQL负担,它还维护了连接池。Atlas启动后会创建多个线程,其中一个为主线程,其余为工作线程。主线程负责监听所有的客户端连接请求,工作线程只监听主线程的命令请求。
+
+ Kudu是围绕Hadoop生态圈建立的存储引擎,Kudu拥有和Hadoop生态圈共同的设计理念,它运行在普通的服务器上、可分布式规模化部署、并且满足工业界的高可用要求。其设计理念为fast analytics on fast data。作为一个开源的存储引擎,可以同时提供低延迟的随机读写和高效的数据分析能力。Kudu不但提供了行级的插入、更新、删除API,同时也提供了接近Parquet性能的批量扫描操作。使用同一份存储,既可以进行随机读写,也可以满足数据分析的要求。Kudu的应用场景很广泛,比如可以进行实时的数据分析,用于数据可能会存在变化的时序数据应用等。
+
+ 在数据存储过程中,涉及到的数据表都是成千上百列,包含各种复杂的Query,推荐使用列式存储方法,比如parquent,ORC等对数据进行压缩。Parquet 可以支持灵活的压缩选项,显著减少磁盘上的存储
+
四、数据清洗
+
+ MapReduce作为Hadoop的查询引擎,用于大规模数据集的并行计算,”Map(映射)”和”Reduce(归约)”,是它的主要思想。它极大的方便了编程人员在不会分布式并行编程的
情况下,将自己的程序运行在分布式系统中。
+
+ 随着业务数据量的增多,需要进行训练和清洗的数据会变得越来越复杂,这个时候就需要任务调度系统,比如oozie或者azkaban,对关键任务进行调度和监控。
+
+ Oozie是用于Hadoop平台的一种工作流调度引擎,提供了RESTful API接口来接受用户的提交请求(提交工作流作业),当提交了workflow后,由工作流引擎负责workflow的执行以>及状态的转换。用户在HDFS上部署好作业(MR作业),然后向Oozie提交Workflow,Oozie以异步方式将作业(MR作业)提交给Hadoop。这也是为什么当调用Oozie 的RESTful接口提交作业之后能立即返回一个JobId的原因,用户程序不必等待作业执行完成(因为有些大作业可能会执行很久(几个小时甚至几天))。Oozie在后台以异步方式,再将workflow对应的Action提交给hadoop执行。
+
+ Azkaban也是一种工作流的控制引擎,可以用来解决有多个hadoop或者spark等离线计算任务之间的依赖关系问题。azkaban主要是由三部分构成:Relational Database,Azkaban Web Server和Azkaban Executor Server。azkaban将大多数的状态信息都保存在MySQL中,Azkaban Web Server提供了Web UI,是azkaban主要的管理者,包括project的管理、认证、调度以及对工作流执行过程中的监控等;Azkaban Executor Server用来调度工作流和任务,记录工作流或者任务的日志。
+
五、数据查询分析
+ Hive的核心工作就是把SQL语句翻译成MR程序,可以将结构化的数据映射为一张数据库表,并提供 HQL(Hive SQL)查询功能。Hive本身不存储和计算数据,它完全依赖于HDFS和MapReduce。可以将Hive理解为一个客户端工具,将SQL操作转换为相应的MapReduce jobs,然后在hadoop上面运行。Hive支持标准的SQL语法,免去了用户编写MapReduce程序的过程,它的出现可以让那些精通SQL技能、但是不熟悉MapReduce 、编程能力较弱与不擅长Java语言的用户能够在HDFS大规模数据集上很方便地利用SQL 语言查询、汇总、分析数据。
+
+ Hive是为大数据批量处理而生的,Hive的出现解决了传统的关系型数据库(MySql、Oracle)在大数据处理上的瓶颈 。Hive 将执行计划分成map->shuffle->reduce->map->shuffle->reduce…的模型。如果一个Query会被编译成多轮MapReduce,则会有更多的写中间结果。由于MapReduce执行框架本身的特点,过多的中间过程会增加整个Query的执行时间。在Hive的运行过程中,用户只需要创建表,导入数据,编写SQL分析语句即可。剩下的过程由Hive框架自动的完成。
+
+ Impala是对Hive的一个补充,可以实现高效的SQL查询。使用Impala来实现SQL on Hadoop,用来进行大数据实时查询分析。通过熟悉的传统关系型数据库的SQL风格来操作大数据,同时数据也是可以存储到HDFS和HBase中的。Impala没有再使用缓慢的Hive+MapReduce批处理,而是通过使用与商用并行关系数据库中类似的分布式查询引擎(由Query Planner、Query Coordinator和Query Exec Engine三部分组成),可以直接从HDFS或HBase中用SELECT、JOIN和统计函数查询数据,从而大大降低了延迟。
+
+ Impala将整个查询分成一执行计划树,而不是一连串的MapReduce任务,相比Hive没了MapReduce启动时间。Hive 适合于长时间的批处理查询分析,而Impala适合于实时交互式SQL查询,Impala给数据人员提供了快速实验,验证想法的大数据分析工具,可以先使用Hive进行数据转换处理,之后使用Impala在Hive处理好后的数据集上进行快速的数据分析。总的来说:Impala把执行计划表现为一棵完整的执行计划树,可以更自然地分发执行计划到各个Impalad执行查询,而不用像Hive那样把它组合成管道型的map->reduce模式,以此保证Impala有更好的并发性和避免不必要的中间sort与shuffle。但是Impala不支持UDF,能处理的问题有一定的限制。
+
+ Spark拥有Hadoop MapReduce所具有的特点,它将Job中间输出结果保存在内存中,从而不需要读取HDFS。Spark 启用了内存分布数据集,除了能够提供交互式查询外,它还可以优化迭代工作负载。Spark 是在 Scala 语言中实现的,它将 Scala 用作其应用程序框架。与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。
+
+ Nutch 是一个开源Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具,包括全文搜索和Web爬虫。Solr用Java编写、运行在Servlet容器(如Apache Tomcat或Jetty)的一个独立的企业级搜索应用的全文搜索服务器。它对外提供类似于Web-service的API接口,用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。
+
+ Elasticsearch是一个开源的全文搜索引擎,基于Lucene的搜索服务器,可以快速的储存、搜索和分析海量的数据。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
+
+ 还涉及到一些机器学习语言,比如,Mahout主要目标是创建一些可伸缩的机器学习算法,供开发人员在Apache的许可下免费使用;深度学习框架Caffe以及使用数据流图进行数值计算的开源软件库TensorFlow等,常用的机器学习算法比如,贝叶斯、逻辑回归、决策树、神经网络、协同过滤等。
+
六、数据可视化
+
+
+
+ 对接一些BI平台,将分析得到的数据进行可视化,用于指导决策服务。主流的BI平台比如FineBI,国外的敏捷BI Tableau、Qlikview、PowrerBI等,国内的SmallBI和新兴的有数BI等。
+
+ 在上面的每一个阶段,保障数据的安全是不可忽视的问题。
+
+ 基于网络身份认证的协议Kerberos,用来在非安全网络中,对个人通信以安全的手段进行身份认证,它允许某实体在非安全网络环境下通信,向另一个实体以一种安全的方式证明自己的身份。
+
+ 控制权限的ranger是一个Hadoop集群权限框架,提供操作、监控、管理复杂的数据权限,它提供一个集中的管理机制,管理基于yarn的Hadoop生态圈的所有数据权限。可以对Hadoop生态的组件如Hive,Hbase进行细粒度的数据访问控制。通过操作Ranger控制台,管理员可以轻松的通过配置策略来控制用户访问HDFS文件夹、HDFS文件、数据库、表、字段权限。这些策略可以为不同的用户和组来设置,同时权限可与hadoop无缝对接。
+
七、大数据通用处理流程
+
大数据之所以称为大数据,因其和“小数据”比较起来,有显著的特征:
+
+ 伴随着云计算、大数据、物联网、人工智能等信息技术的快速发展和传统产业数字化的转型,数据量呈现几何级增长,根据市场研究资料显示,全球数据总量将从 2016 年的 16.1ZB 增长到 2025 年的 163ZB (约合 180 万亿 GB),十年内将有 10 倍的增长,复合增长率为 26%
+ 若以现有的蓝光光盘为计量标准,那么 40ZB 的数据全部存入蓝光光盘,所需要的光盘总重量将达到 424 艘尼米兹号航母的总重量。而这些数据中,约 80% 是非结构化或半结构化类型的数据,甚至更有一部分是不断变化的流数据。因此,数据的爆炸性增长态势,以及其数据构成特点使得人们进入了“大数据”时代。
+
一般认为,大数据主要具有以下4个方面的典型特征,即大量(Volume)、多样(Variety)、高速(Velocity)和价值(Value),即所谓的4V,接下来,通过一张图来具休描述。
+
一、Volume(大量)
大数据的特征首先就是数据规模大。随着互联网、物联网、移动互联技术的发展,人和事物的所有轨迹都可以被记录下来,数据呈现出爆发性增长。数据相关计量单位的换算关系如下表所示。
+
互联网每分钟产生的数据
+
二、Variety(多样)
+ 数据来源的广泛性,决定了数据形式的多样性。我们把这些数据大致分为三类:结构化的数据、半结构化的数据和非结构化的数据。
+ 结构化的数据,一般指的是关系型数据库中的数据,例如MySQL、Oracle中的表中的数据。如财务系统数据、信息管理系统数据、医疗系统数据等,其特点是数据间因果关系强。这些数据中,每一行的数据都保持着相同的数据格式,有规律可循,非常容易处理。
+ 半结构化的数据,指的是有一定的结构性,但是比起关系型数据库表中的结构化的数据来说,结构不是那么清晰,处理起来也比结构化的数据略微麻烦。常见的半结构化的数据有json、xml、html等。其特点是数据间的因果关系弱。
+ 非结构化的数据,指的就是没有丝毫结构性可言的数据了,如即时消息、视频、照片、点击流、 日志文件、地理位置信息等,其特点是数据间没有因果关系。数据没有固定的格式,通常需要我们单独设计程序来处理这些数据,从中提取出来有价值的信息。
+ 而我们在工作中要处理的数据,往往都是以半结构化和非结构化的居多。有统计显示,目前结构化数据占据整个互联网数据量的75%以上,而产生价值的大数据,往往是这些非结构化数据。
+
三、Velocity(高速)
+数据的增长速度和处理速度是大数据高速性的重要体现。与以往的报纸、书信等传统数据载体生产传播方式不同,在大数据时代,大数据的交换和传播主要是通过互联网和云计算等方式实现的,其生产和传播数据的速度是非常迅速的。另外,大数据还要求处理数据的响应速度要快,例如,上亿条数据的分析必须在几秒内完成。数据的输人、处理与丢弃必须立刻见效,几乎无延迟。
+四、Value(价值)
+ 大数据的核心特征是价值,其实价值密度的高低和数据总量的大小是成反比的,即数据价值密度越高数据总量越小,数据价值密度越低数据总量越大,总结为:价值密度低、商业价值高。大数据相关的技术体系,需要处理的数据量是非常庞大的,动辄PB、EB规模的数据,但是真正具有价值的数据却非常稀少,只有100M,甚至更少。我们就需要从这么庞大的数据集中提取出来这些密度非常低的有价值的数据进行处理。任何有价值的信息的提取依托的就是海量的基础数据,以监控视频为例,在一小时的视频中,有用的数据可能仅仅只有一两秒,但是却会非常重要。
+
大数据
人工智能
AIGC大模型