Hadoop大数据平台入门——HDFS和MapReduce

Stella981
• 阅读 571

随着硬件水平的不断提高,需要处理数据的大小也越来越大。大家都知道,现在大数据有多火爆,都认为21世纪是大数据的世纪。当然我也想打上时代的便车。所以今天来学习一下大数据存储和处理。

随着数据的不断变大,数据的处理就出现了瓶颈:存储容量,读写速率,计算效率等等。

google不愧是走在世界前列的大公司,为了处理大数据,google提出了大数据技术,MapReduce,BigTable和GFS。

这个技术给大数据处理带来了巨大的变革。

1.降低了大数据处理的成本,用PC机就可以处理大数据,而不需要采用大型机和高端设备进行存储。

2.将硬件故障视为常态的基础上,采用了软件容错的方法,保证软件的可靠性。

3.简化并行分布式计算,不需要控制节点的同步和数据的交换,降低了大数据处理的门槛。

虽然google的技术非常好,但是google并没有将技术开源。不过值得庆幸的是,模仿google大数据的开源实现,Hadoop的出现了。

Hadoop是什么

Hadoop主要完成两件事,分布式存储和分布式计算。

Hadoop主要由两个核心部分组成:

1.HDFS:分布式文件系统,用来存储海量数据。

2.MapReduce:并行处理框架,实现任务分解和调度。

Hadoop能做什么

Hadoop能完成大数据的存储,处理,分析,统计等业务,在数据挖掘等方面应用广泛。

Hadoop的优势

1.高扩展性。简单的增加硬件就可以达到效果的提高。

2.低成本,用PC机就能做到。

3.Hadoop具有成熟的生态圈,比如Hive,Hbase,zookeeper等,让Hadoop用起来更方便。

说了这么多,我们还没了解Hadoop的机制。

我们首先就需要了解Hadoop的两个核心组成:HDFS和MapReduce。

HDFS是什么呢?

前面说过,HDFS是一个分布式文件系统,用来存储和读取数据的。

文件系统都有最小处理单元,而HDFS的处理单元是块。HDFS保存的文件被分成块进行存储,默认的块大小是64MB。

并且在HDFS中有两类节点:

1.NameNode和DataNode。

NameNode:

NameNode是管理节点,存放文件元数据。也就是存放着文件和数据块的映射表,数据块和数据节点的映射表。

也就是说,通过NameNode,我们就可以找到文件存放的地方,找到存放的数据。

DataNode:

DataNode是工作节点,用来存放数据块,也就是文件实际存储的地方。

这么说有点抽象,让我们来看图:

Hadoop大数据平台入门——HDFS和MapReduce

客户端向NameNode发起读取元数据的消息,NameNode就会查询它的Block Map,找到对应的数据节点。然后客户端就可以去对应的数据节点中找到数据块,拼接成文件就可以了。这就是读写的流程。

作为分布式应用,为了达到软件的可靠性,如图上所示,每个数据块都有三个副本,并且分布在两个机架上。

这样一来,如果某个数据块坏了,能够从别的数据块中读取,而当如果一个机架都坏了,还可以从另一个机架上读取,从而实现高可靠。

我们从上图还可以看到,因为数据块具有多个副本,NameNode要知道那些节点是存活的吧,他们之间的联系是依靠心跳检测来实现的。这也是很多分布式应用使用的方法了。

我们还可以看到,NameNode也有一个Secondary NameNode,万一NameNode出故障了,Secondary就会成替补,保证了软件的可靠性。

HDFS具有什么特点呢?

1.数据冗余,软件容错很高。

2.流失数据访问,也就是HDFS一次写入,多次读写,并且没办法进行修改,只能删除之后重新创建

3.适合存储大文件。如果是小文件,而且是很多小文件,连一个块都装不满,并且还需要很多块,就会极大浪费空间。

HDFS的适用性和局限性:

1.数据批量读写,吞吐量高。

2.不适合交互式应用,延迟较高。

3.适合一次写入多次读取,顺序读取。

4.不支持多用户并发读写文件。

了解完了HDFS,就轮到MapReduce了。

MapReduce是什么:

MapReduce是并行处理框架,实现任务分解和调度。

其实原理说通俗一点就是分而治之的思想,将一个大任务分解成多个小任务(map),小任务执行完了之后,合并计算结果(reduce)。

Hadoop大数据平台入门——HDFS和MapReduce

也就是说,JobTracker拿到job之后,会把job分成很多个maptask和reducetask,交给他们执行。 MapTask、ReduceTask函数的输入、输出都是<key,value>的形式。HDFS存储的输入数据经过解析后,以键值对的形式,输入到MapReduce()函数中进行处理,输出一系列键值对作为中间结果,在Reduce阶段,对拥有同样Key值的中间数据进行合并形成最后结果。

首先我们需要先知道几个小概念:

1.job  2.task  3.jobTracker  4.taskTracker

job:在Hadoop内部,用Job来表示运行的MapReduce程序所需要用到的所有jar文件和类的集合,>这些文件最终都被整合到一个jar文件中,将此jar文件提交给JobTraker,MapReduce程序就会执行。

task:job会分成多个task。分为MapTask和ReduceTask。

jobTracker:管理节点。将job分解为多个map任务和reduce任务。

作用:
1.作业调度
2.分配任务,监控任务执行进度
3.监控TaskTracker状态

taskTracker:任务节点。一般和dataNode为同一个节点,这样计算可以跟着数据走,开销最小化。

作用:

1.执行任务

2.汇报任务状态

在MapReduce中,也有容错机制。

1.重复执行。一个job最多被执行4次。

2.推测执行。因为Map全部算完之后才会执行Reduce,如果其中一个Map很慢,就会多开一个task来完成同样的工作,哪个执行的快用哪个。

这样,我们就大致了解了Hadoop其中的原理,主要了解HDFS文件系统的存储过程和MapReduce的作业调度分配过程。

长按识别关注我们,每天都有精彩内容分享哦!~

Hadoop大数据平台入门——HDFS和MapReduce

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Java修道之路,问鼎巅峰,我辈代码修仙法力齐天
<center<fontcolor00FF7Fsize5face"黑体"代码尽头谁为峰,一见秃头道成空。</font<center<fontcolor00FF00size5face"黑体"编程修真路破折,一步一劫渡飞升。</font众所周知,编程修真有八大境界:1.Javase练气筑基2.数据库结丹3.web前端元婴4.Jav
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这