缘起
呆在舒适区太久了
,最近学了下大数据,正好总结,复习一下,用一个小故事来带出Hadoop是什么 !
有一天 ,我的朋友
小扬 在看 某老师的视频 ,他刚开始看的时候,查找没什么难度,一般利用搜索引擎下载下来,然后放在磁盘里, 双击就可以播放,但后面看的老师越来越多,于是整个资源也就越来越来,加上,小扬是个怀旧的人,看完之后就不想删,于是资源越来越多,这个时候,小扬想着,干脆自己写个程序吧,这样找某老师就能快些, 说时迟,那时快, 小扬打开 IDE ,一顿乱敲 ,使用 Java的 Swing
,最后打包一气合成 ,执行 !
这时,小扬激动的看着控制台,在几万个视频内 ,轻松查到了 某老师 的视频 ,小扬很高兴,看来 学Java还是有用的
又过了几年,小扬发现,整个Java程序找 某老师视频,慢慢的查的慢了,虽然可以利用工厂模式 ,对代码进行调优,但是 小扬想了想,有没有其他解决方案 ,万一以后数据比俺的资源大得多咋整,
于是小扬想起了,以前在 某度上看到的 大数据
,俺的资源是 在 几万的视频内查到 某老师的位置
假如,我要在 几T的资源里找咋搞
1GB=1024MB
: 约等于下载一部电影(非高清)的大小。
1TB=1024GB
: 约等于一个固态硬盘的容量大小,能存放一个不间断的监控摄像头录像(200MB/个)长达半年左右。
1PB=1024TB
: 容量相当大,应用于大数据存储设备,如服务器等。
1EB=1024PB
: ,目前还没有单个存储器达到这个容量。
1T(1024G)
的视频中的视频的个数。计算一个1PB(1024T)的视频位置……
面对这样大规模的数据,小扬的那一台计算机已经存储不下了,也计算不了这样大的数据文件中到底有多少个视频。聪明的小扬上网百度了一下,他在百度的输入框中写下了:大数据存储和计算怎么办?按下回车键之后,出现了有关Hadoop的网页。
看了很多网页之后,小扬总结一句话:Hadoop就是存储海量数据和分析海量数据的工具。
这也太书面化了吧
我去
大概表达的意思就是:
Hadoop
是由java
语言编写的,在分布式服务器集群上存储海量数据并运行分布式分析应用的开源框架,其核心部件是HDFS与MapReduce。 HDFS是一个分布式文件系统:引入存放文件元数据信息的服务器Namenode和实际存放数据的服务器Datanode,对数据进行分布式储存和读取。 MapReduce是一个计算框架:MapReduce的核心思想是把计算任务分配给集群内的服务器里执行。通过对计算任务的拆分(Map计算/Reduce计算)再根据任务调度器(JobTracker)对任务进行分布式计算。
Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。 把HDFS理解为一个分布式的,有冗余备份的,可以动态扩展的用来存储大规模数据的大硬盘。 把MapReduce理解成为一个计算引擎,按照MapReduce的规则编写Map计算/Reduce计算的程序,可以完成计算任务。
2、Hadoop能干什么大数据存储:分布式存储日志处理:擅长日志分析ETL:数据抽取到oracle、mysql、DB2、mongdb及主流数据库机器学习: 比如Apache Mahout项目搜索引擎:Hadoop + lucene实现数据挖掘:目前比较流行的广告推荐,个性化广告推荐Hadoop是专为离线和大规模数据分析而设计的,并不适合那种对几个记录随机读写的在线事务处理模式。实际应用:
我们仔细观察了下发现了一个词汇 叫 Hadoop生态圈
根据服务对象和层次分为:数据来源层、数据传输层、数据存储层、资源管理层、数据计算层、任务调度层、业务模型层。接下来对Hadoop生态圈中出现的相关组件做一个简要介绍。
这里在举一个小例子 ,某天 小扬 在 某宝 或者某东上购买 某 资源 , 这时候,你在 浏览某商品 ,例如啤酒杯
小扬看着看着 于是 没有想了想,这个月给女朋友 买包的钱不多了,于是 不舍得买杯子,于是退了出来,可是第二天小扬打开手机 淘宝就发现 ,淘宝 在给他推杯子 !
莫非 有人 偷窥我 !
然后偷偷打电话给淘宝客服, 就是为了让我买到喜欢的杯子 ?
这太奇怪了!
真的是比算命先生还懂我 !
于是小扬有天来和我讨论 ,问我,小刘这时咋回事阿, 最近感觉本人偷窥一样,我买什么,马上整个平台就 推了,而且还不是一个 ,例如我在某多多买的,某东是咋知道的呀 ,!! 渍渍渍
过了几年后,我和小扬已经是大数据工程师了 ,终于明白了这个原因,我们知道,原来当我们点击某宝App 那个卡片的时候 ,这时候,我们的行为就会被 JavaEE 的应用捕捉到 具体点 就是被我们的前端 的埋点日志
记录到 ,最后我们我们 触发我们 后台配置 nginx服务器 ,打入我们的 服务器的日志里头 ,一般这种数据通常来说用文件存储,用户行为数据,因为只是小数据, 这时 Java 工程师 站出来
, 说到小数据啊 ,用 NoSQL啊 , 比如 Redis 啊 、 MongoDB 啊 、 RabbitMQ .......
,大数据工程师反驳道, 你个憨批,这是大数据,这种方案行不通 ,数据大点 ,你就挂了 ,行不通 ,大数据工程师 接着说道 ,目前来说 ,当日志进入到我们的服务器里头,会使用到 Flume 这个框架,来进行日志收集 ,最后Flume采集完成之后,会将数据给到 Kafka 进入这个消息队列,进行缓冲,由于是 猜你喜欢这个功能 ,所有讲究的是实时性, 走实时任务,于是就使用了 Spark Streaming
实时计算 这个 组件 ,或者是 Fink这个组件, 比较流行的就这俩, 作用就是将数据实时同步 在这里头进行计算, 看那种行为能够 触发他的消费, 计算完之后,就返回 给 JavaEE 后台 ,于是 咱们 就看到了 ,上面 小扬某东的例子 !
如下图 :
看完之后 ,大家对大数据应该有了一个基本的概念 ,所有我们就来学习一个 第一个 组件 叫做
Hadoop
,那就是负责计算咱们这个东西是不是能触发用例消费的这么一个组件 ,它有几部分组成(组件)
Hadoop 1.x
: HDFS (分布式文件存储系统) 、MapReduce(分布式计算和调度系统) 、 Common(辅助工具)
Hadoop 2.x
: HDFS(分布式文件存储系统) 、 MapReduce(分布式计算) 、Yarn (调度) ,2.x将调度解耦出来,单独命名yarn
Haddop 3.x
无太多变化。…
所以学习Hadoop 只需要学习它的组件即可,然后搭建集群, 如何配置 ,如何计算,如何整合 下,下面我们来详细学习一下
1、HDFS(分布式文件系统)
HDFS是整个hadoop体系的基础,负责数据的存储与管理。HDFS有着高容错性(fault-tolerant)的特点,并且设计用来部署在低廉的(low-cost)硬件上。而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。
client:切分文件,访问HDFS时,首先与NameNode交互,获取目标文件的位置信息,然后与DataNode交互,读写数据
NameNode
:master节点,每个HDFS集群只有一个,管理HDFS的名称空间和数据块映射信息,配置相关副本信息,处理客户端请求。
DataNode
:slave节点,存储实际数据,并汇报状态信息给NameNode,默认一个文件会备份3份在不同的DataNode中,实现高可靠性和容错性。
Secondary NameNode
:辅助NameNode,实现高可靠性,定期合并fsimage和fsedits,推送给NameNode;紧急情况下辅助和恢复NameNode,但其并非NameNode的热备份。
Hadoop 2为HDFS引入了两个重要的新功能 ——Federation和高可用(HA):
Federation允许集群中出现多个NameNode,之间相互独立且不需要互相协调,各自分工,管理自己的区域。 DataNode 被用作通用的数据块存储设备。每个 DataNode 要向集群中所有NameNode 注册,并发送心跳报告,执行所有 namenode的命令。
HDFS中的高可用性消除了Hadoop 1中存在的单点故障,其中,NameNode故障将导致集群中断。HDFS的高可用性提供故障转移功能(备用节点从失败的主NameNode接管工作的过程)以实现自动化。
2、MapReduce(分布式计算框架)
MapReduce是一种基于磁盘的分布式并行批处理计算模型,用于处理大数据量的计算。其中Map对应数据集上的独立元素进行指定的操作,生成键-值对形式中间,Reduce则对中间结果中相同的键的所有值进行规约,以得到最终结果。
Jobtracker:master节点,只有一个,管理所有作业,任务/作业的监控,错误处理等,将任务分解成一系列任务,并分派给Tasktracker。
Tacktracker:slave节点,运行 Map task和Reduce task;并与Jobtracker交互,汇报任务状态。
Map task:解析每条数据记录,传递给用户编写的map()函数并执行,将输出结果写入到本地磁盘(如果为map—only作业,则直接写入HDFS)。
Reduce task:从Map 它深刻地执行结果中,远程读取输入数据,对数据进行排序,将数据分组传递给用户编写的Reduce()函数执行。
3、Spark(分布式计算框架)
Spark是一种基于内存的分布式并行计算框架,不同于MapReduce的是——Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。
Cluster Manager:在standalone模式中即为Master主节点,控制整个集群,监控worker。在YARN模式中为资源管理器
Worker节点:从节点,负责控制计算节点,启动Executor或者Driver。
Driver: 运行Application 的main()函数
Executor:执行器,是为某个Application运行在worker node上的一个进程
Spark将数据抽象为RDD(弹性分布式数据集),内部提供了大量的库,包括Spark Core、Spark SQL、Spark Streaming、MLlib、GraphX。 开发者可以在同一个应用程序中无缝组合使用这些库。
Spark Core:包含Spark的基本功能;尤其是定义RDD的API、操作以及这两者上的动作。其他Spark的库都是构建在RDD和Spark Core之上的
Spark SQL:提供通过Apache Hive的SQL变体Hive查询语言(HiveQL)与Spark进行交互的API。每个数据库表被当做一个RDD,Spark SQL查询被转换为Spark操作。
Spark Streaming:对实时数据流进行处理和控制。Spark Streaming允许程序能够像普通RDD一样处理实时数据,通过短时批处理实现的伪流处理。
MLlib:一个常用机器学习算法库,算法被实现为对RDD的Spark操作。这个库包含可扩展的学习算法,比如分类、回归等需要对大量数据集进行迭代的操作。
GraphX:控制图、并行图操作和计算的一组算法和工具的集合。GraphX扩展了RDD API,包含控制图、创建子图、访问路径上所有顶点的操作
4、Flink(分布式计算框架)
Flink是一个基于内存的分布式并行处理框架,类似于Spark,但在部分设计思想有较大出入。对 Flink 而言,其所要处理的主要场景就是流数据,批数据只是流数据的一个极限特例而已。
Flink VS Spark
Spark中,RDD在运行时是表现为Java Object,而Flink主要表现为logical plan。所以在Flink中使用的类Dataframe api是被作为第一优先级来优化的。但是相对来说在spark RDD中就没有了这块的优化了。
Spark中,对于批处理有RDD,对于流式有DStream,不过内部实际还是RDD抽象;在Flink中,对于批处理有DataSet,对于流式我们有DataStreams,但是是同一个公用的引擎之上两个独立的抽象,并且Spark是伪流处理,而Flink是真流处理。
5、Yarn/Mesos(分布式资源管理器)
YARN是下一代MapReduce,即MRv2,是在第一代MapReduce基础上演变而来的,主要是为了解决原始Hadoop扩展性较差,不支持多计算框架而提出的。
Mesos诞生于UC Berkeley的一个研究项目,现已成为Apache项目,当前有一些公司使用Mesos管理集群资源,比如Twitter。与yarn类似,Mesos是一个资源统一管理和调度的平台,同样支持比如MR、steaming等多种运算框架。
6、Zookeeper(分布式协作服务)
解决分布式环境下的数据管理问题:统一命名,状态同步,集群管理,配置同步等。
Hadoop的许多组件依赖于Zookeeper,它运行在计算机集群上面,用于管理Hadoop操作。
7、Sqoop(数据同步工具)
Sqoop是SQL-to-Hadoop的缩写,主要用于传统数据库和Hadoop之前传输数据。数据的导入和导出本质上是Mapreduce程序,充分利用了MR的并行化和容错性。
Sqoop利用数据库技术描述数据架构,用于在关系数据库、数据仓库和Hadoop之间转移数据。
8、Hive/Impala(基于Hadoop的数据仓库)
Hive定义了一种类似SQL的查询语言(HQL),将SQL转化为MapReduce任务在Hadoop上执行。通常用于离线分析。
HQL用于运行存储在Hadoop上的查询语句,Hive让不熟悉MapReduce开发人员也能编写数据查询语句,然后这些语句被翻译为Hadoop上面的MapReduce任务。
Impala是用于处理存储在Hadoop集群中的大量数据的MPP(大规模并行处理)SQL查询引擎。 它是一个用C ++和Java编写的开源软件。 与Apache Hive不同,Impala不基于MapReduce算法。 它实现了一个基于守护进程的分布式架构,它负责在同一台机器上运行的查询执行的所有方面。因此执行效率高于Apache Hive。
9、HBase(分布式列存储数据库)
HBase是一个建立在HDFS之上,面向列的针对结构化数据的可伸缩、高可靠、高性能、分布式和面向列的动态模式数据库。
HBase采用了BigTable的数据模型:增强的稀疏排序映射表(Key/Value),其中,键由行关键字、列关键字和时间戳构成。
HBase提供了对大规模数据的随机、实时读写访问,同时,HBase中保存的数据可以使用MapReduce来处理,它将数据存储和并行计算完美地结合在一起。
10、Flume(日志收集工具)
Flume是一个可扩展、适合复杂环境的海量日志收集系统。它将数据从产生、传输、处理并最终写入目标的路径的过程抽象为数据流,在具体的数据流中,数据源支持在Flume中定制数据发送方,从而支持收集各种不同协议数据。
同时,Flume数据流提供对日志数据进行简单处理的能力,如过滤、格式转换等。此外,Flume还具有能够将日志写往各种数据目标(可定制)的能力。
Flume以Agent为最小的独立运行单位,一个Agent就是一个JVM。单个Agent由Source、Sink和Channel三大组件构成
Source:从客户端收集数据,并传递给Channel。
Channel:缓存区,将Source传输的数据暂时存放。
Sink:从Channel收集数据,并写入到指定地址。
Event:日志文件、avro对象等源文件。
11、Kafka(分布式消息队列)
Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。实现了主题、分区及其队列模式以及生产者、消费者架构模式。
生产者组件和消费者组件均可以连接到KafKa集群,而KafKa被认为是组件通信之间所使用的一种消息中间件。KafKa内部氛围很多Topic(一种高度抽象的数据结构),每个Topic又被分为很多分区(partition),每个分区中的数据按队列模式进行编号存储。被编号的日志数据称为此日志数据块在队列中的偏移量(offest),偏移量越大的数据块越新,即越靠近当前时间。生产环境中的最佳实践架构是Flume+KafKa+Spark Streaming。
12、Oozie(工作流调度器)
Oozie是一个可扩展的工作体系,集成于Hadoop的堆栈,用于协调多个MapReduce作业的执行。它能够管理一个复杂的系统,基于外部事件来执行,外部事件包括数据的定时和数据的出现。
Oozie工作流是放置在控制依赖DAG(有向无环图 Direct Acyclic Graph)中的一组动作(例如,Hadoop的Map/Reduce作业、Pig作业等),其中指定了动作执行的顺序。
Oozie使用hPDL(一种XML流程定义语言)来描述这个图。
(1)Flume+Logstash+Kafka+Spark Streaming
进行实时日志处理分析
(2)酷狗音乐的大数据平台
3、怎么使用Hadoop
3.1、Hadoop集群的搭建无论是在windows上装几台虚拟机玩Hadoop,还是真实的服务器来玩,说简单点就是把Hadoop的安装包放在每一台服务器上,改改配置,启动就完成了Hadoop集群的搭建。
3.2、上传文件到Hadoop集群Hadoop集群搭建好以后,可以通过web页面查看集群的情况,还可以通过Hadoop命令来上传文件到hdfs集群,通过Hadoop命令在hdfs集群上建立目录,通过Hadoop命令删除集群上的文件等等。
3.3、编写map/reduce程序通过集成开发工具(例如eclipse)导入Hadoop相关的jar包,编写map/reduce程序,将程序打成jar包扔在集群上执行,运行后出计算结果。
好了
今天写这篇博客,打字打的手都疼了, 最近工作强度低了许多,写起博客,也喜欢偷懒了 ,好了
下次见