Hadoop+HDFS+MapReduce使用总结

1.首先了解下hadoop:

 1.1分为三个重要模块:

     分布式文件系统:HDFS —— 实现将文件分布式存储在很多的服务器上

     分布式运算编程框架:MapReduce —— 实现在很多机器上分布式并行运算

    分布式资源调度平台:Yarn —— 帮用户调度大量的mapreduce程序,并合理分配运算资源

  1.2hadoop:相关框架

  1. Hadoop:Java编写的软件框架,以支持数据密集型分布式应用
  2. ZooKeeper:高可靠性分布式协调系统
  3. MapReduce:针对大数据的灵活的并行数据处理框架
  4. HDFS:Hadoop分布式文件系统
  5. Oozie:负责MapReduce作业调度
  6. HBase:Key-value数据库
  7. Hive:构建在MapRudece之上的数据仓库软件包
  8. Pig:Pig是架构在Hadoop之上的高级数据处理层。Pig Latin语言为编程人员提供了更直观的定制数据流的方法。

2.HDFS

2.1 hdfs是一个分布式文件系统,简单理解就是多台机器组成的一个文件系统。

2.2 单台服务器无法存储处理特大文件。将这个大文件切割成各个块(block),分散存在各个服务器中。

2.3 Hdfs按照字节数组(byte)切割,切割之后的每个块(每一个块的容量大小是一样的),无序的分散在集群节点中,hadoop2.0上的版本,默认块大小是128M 。块和块之间通过偏移量来有序的组装数据,偏移量的值是上个块大小的值。

2.4 每一个块有几个副本,用于备份数据。副本的数量,最好不好超过总节点数量。hadoop2.0上的版本,默认3个,下图是副本备份策略。第一个副本备份于当前机架当前节点上。第二个副本必须出机架,选一个磁盘不满,cpu空闲的节点上。第三个副本,是另外机架上的另一个节点上。

2.5 每个块的数据不可以修改,块大小也不可以修改。因为修改或者删除会改变块的偏移量,造成整个集群变动。但是可以增加,增加是增加一个块,只是一个单点的操作。

 

包含的模块和作用:

2.6NameNode:元数据MetaData:描述文件相关信息(大小,名字,修改时间,目录位置...)

主节点,只有一个,掌管所有节点中的块的元数据信息。

2.7Secondary NameNode:是NameNode冷备份分担NameNode其工作量、定期合并fsimage和fsedits,并推送给NameNode、在紧急情况下,可辅 助恢复 NameNode。

2.8DataNode:存在除NameNode节点的其他节点。利用本地服务器文件系统,保存真正的数据。和NameNode保持心跳,向NameNode时时汇报块和块备份的信息。

2.9HdfsClient:与NameNode获取元数据信息。与DataNode获取Block块数据。

热备份:b是a的热备份,如果a坏掉。那么b马上运行代替a的工作。 冷备份:b是a的冷备份,如果a坏掉。那么b不能马上代替a工作。但是b上存储a的一些信息,减少a坏掉之后的损失。

fsimage:元数据镜像文件(文件系统的目录树。) edits:元数据的操作日志(针对文件系统做的修改操作记录) namenode内存中存储的是=fsimage+edits SecondaryNameNode负责定时默认1小时,从namenode上,获取fsimage和edits来进行合并,然后再发送给namenode。减少namenode的工作量。

 

关于MapReduce的理解?

特点:

编程简单。它简单的实现一些接口,就可以完成一个分布式程序。

高扩展性。当计算资源不足的时候,可以通过简单的增加机器来扩展计算能力。

高容错性。比如其中一台机器挂了,它可以把上面的计算任务转移到另外一个节点上面上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,而完全是由 Hadoop 内部完成的。 4. 适合 PB 级以上海量数据的离线处理。它适合离线处理而不适合在线处理。

MapReduce的基本原理就是:将大的数据分析分成小块逐个分析,最后再将提取出来的数据汇总分析,最终获得我们想要的内容。当然怎么分块分析,怎么做Reduce操作非常复杂,Hadoop已经提供了数据分析的实现,我们只需要编写简单的需求命令即可达成我们想要的数据。

 

  1. map读取输入的数据,处理完之后,放到环形缓存区中(默认先写内存中,内存满了,就写进磁盘中),然后有一个分区的操作,最后合并到磁盘中
  2. Reduce开始读取磁盘中的数据,首先Shuffle进行一个合并,然后执行reduce任务,处理完的数据写入HDFS中

 

举个例子:文件中统计单词重复出现的次数

假设有个文件txt文档,有3行,值为:

Mary javk

This is jack

He is mary

mr框架会读取文件中的内容,生成给map处理的key-value集合,生成的数据内容如下

(1,Mary jack)

(8,This is jack)

(16,He is mary)

mr框架生成的key-value的key是每行的首字符在文件中的位置,value是每行的文本

对于上面的每对key-value数据,会交给map处理,本例子是为了获取单词重复的次数,首先需要将单词区分出来,显然,map阶段可以用来干这个事,这样我们map阶段可以有这样的输出,输出的key-value对是每个单词,其中key是单词本身,value是固定值为1

(Mary,1)

(jack,1)

(This ,1)

(is,1)

(jack,1)

(He ,1)

(is ,1)

(mary,1)

map处理后,框架会对Map输出的Key-value数据基于key来对数据进行排序和分组(这过程称为shuffle),shuffle操作的结果是,将map输出数据中相同Key的value进行合并成列表,生成新的key-value数据,传给reduce。结果数据如下:

(mary,[1,1])

(jack,[1,1])

(this,[1])

(is,[1,1])

(he,[1])

这样,reduce要做的事情就很简单了,就是将每对key-value数据中的value中的各个元素的值汇总即可,然后写入不同的数据源,提供接口:

He 1

Is 2

Jack 2

Mary 2

This 1

 

令举一个更为深刻理解的例子:查询全国人口不重名的数量。可以利用shuffle归组这一神操作实现,然后reduce中直接把key写出去,做一个 count++就好了

 

mapreduce的运行原理:

  1. 将文件进行分割后,进行map操作.map输出结果放在缓冲区,当缓存区到达一定阈值时,将其中数据溢写到磁盘,然后进行partition, sort, combine操作,这样多次spill(溢写)后,磁盘上就会有多个文件,merge操作将这些文件合并成一个大文件。
  2. shuffle从map节点拉取数据文件,如果在内存中放得下,就直接放在内存中,每个map对应一块数据,当内存中放不下的话,就直接写到磁盘上.一个map数据对应一个文件,当文件数量达到一定阀值时,开始启动磁盘文件merge,把这些文件合并到一个文件中。 最后,把内存中的文件和磁盘上的文件进行全局merge,形成一个最终端文件,做为reduce的输入文件 

mapreduce中的combiner 和partition的区别:Combiner就是在map端先进行一次reduce操作,减少map端到reduce端的数据传输量,节省网络带宽,提高执行效率。

Partition就是将map输出按key分区,送到不同的reduce上去并行执行,提高效率。

 

Map阶段:首先是读数据,数据来源可能是文本文件,表格,MySQL数据库。这些数据通常是成千上万的文件(叫做shards),这些shards被当做一个逻辑输入源。然后Map阶段调用用户实现的函数,叫做Mapper,独立且并行(每行处理一次,调一次map函数)的处理每个shard。对于每个shard,Mapper返回多个键值对,这是Map阶段的输出。

Shuffle阶段:把键值对进行归类,也就是把所有相同的键的键值对归为一类。这个步骤的输出是不同的键和该键的对应的值的数据流。

Reduce阶段: 输入当然是shuffle的输出。然后Reduce阶段调用用户实现的函数,叫做Reducer,对每个不同的键和该键的对应的值的数据流进行独立、并行的处理。每个reducer遍历键对应的值,然后对值进行“置换”。这些置换通常指的的是值的聚合或者什么也不处理,然后把键值对写入数据库、表格或者文件中。

 

猜你喜欢

转载自blog.csdn.net/SmallTenMr/article/details/106719705
今日推荐