我们常说的分布式系统,其实就是分布式软件系统,支持分布式处理的软件系统。他是在通信网络互联的多处理机体系结构上执行任务。
hadoop是分布式软件系统中文件系统层的软件,他实现了分布式文件系统和部分分布式数据库系统。hadoop中的分布式文件系统hdfs可以实现数据在计算机集群组成的云上,高效的存储和管理。hadoop中的并行编程框架mapreduce可以让用户编写hadoop应用程序。
mapreduce应用程序开发是基于mapreduce编程模型,mapreduce编程的原理是:利用输入一个key,value的集合处理后,来输出一个key,value的集合。mapreduce用两个函数表达这儿计算:map和redcue
mapreduce处理过程:
从hdfs上读取数据块,由一个个map去处理数据片段,将map任务的输出,按key相同的进行合并(key,value1,value2...)将合并后的结果交给
reduce处理,reduce输出结果文件到hdfs上。
分布式文件存储:
hdfs有一个nameNode(在hadoop2中有两个nameNode)节点和多个dataNode节点组成,一个文件在hdf的底层会分成一个个block,block的默认大小是64M。一个block块会有多个副本(默认有三个),副本会存在不同的dataNode上,以达到容错容灾的目的。nameNode里存储的是文件的源信息(文件权限,拥有者,block块存储在哪台dataNode上等)
分布式并行计算:
hadoop中有一个主控的jobTracker和多个taskTracker,主控的jobTracker用于调度和管理其他的taskTracker,TaskTracker负责执行jobTracker分发给他的任务。jobTracker可以运行任意的一台机器上。taskTracker只能运行在dataNode节点上,所以说,dataNode不光是存储文件的节点也是计算节点。jobTracker会把任务分发给空闲的TaskTracker上执行,如果哪个TaskTracker出现故障,任务失败。jobTracker则会把这个任务再分给其他的空闲taskTracker执行
本地计算(移动计算而不是移动数据)
数据存储在哪台机器上,就由哪个机器进行计算。这样的好处是可以减少网络io,减少对网络带宽的要求。在hadoop这种分布式集群上,计算节点可以很容易的扩张。数据在不同计算机之间传输,故而网络带宽就成了颈瓶。所以本地计算是一种很有效的节约网络带宽的方法(移动计算比移动数据更经济)
任务粒度
把原始文件切成小数据片段,一般来说数据片段的大小要小于或者等于hdfs中block块的大小,这样可以保证一个数据片段是位于一个计算机上的,便于本地计算。n个数据片段由n个map任务执行,注意这n个map任务是分布于n台计算机上,将他们并行处理。reduce的数量可以由用于控制。
Mapper和Reduce中全局共享数据
(1)读取hdfs文件
这样可以很直观,缺点是就算是很小的全局数据需要读取hdfs文件,这将会占用网络io,占用系统资源
(2)读取job属性
在task运行的时,可以利用Configuration对象中config.set(name, value);读取job中的属性值,可以将简单的属性封装到配置的作业中,
优点是简单,消耗的资源小,缺点是:对于大的共享资源就没法了
(3)DistributedCache
是为应用提供缓存文件的工具,他可以缓存文本文件,hdfs文件,jar文件,压缩文件
优点是每个job共享文件在启动之后复制一次,可以适合大量的全局文件。缺点是他是只读的
shuffle和排序
shuffle就是map端的输出到redcue端的输入整个过程就是shuffle过程。我们为了让reducec端并行处理数据,所以对map的输出 要进行排序和处理。
shuffle的过程可以分为map端和reduce端:
map端shufflle会对map的输出结果进行 划分(pattion),排序(sort),分割(spllit),将划分好的map结果进行排序合并并写到磁盘上,同时按照不同的划分结果发送到对应的reduce上。reduce端会把不同map端送来的相同区域的数据给对应reduceTask去处理。
shuffle过程是mapperReduce的核心过程,shuffle的性能直接影响mapReduce的执行过程(默认shuffle过程并不是最优的,可以根据需求进行定义shuffle过程)
推测式执行
推测式执行就是当做作业启动时,jobTracker会计算整个作业的进度,当发现某一个map执行的速度要慢(cpu负载果高,运行的任务较多等)与整体的平均速度的时候,jobTracker就会重启一个备份的taskTracker去运行这个map. 哪个task先运行完,就kill掉另一个taskMap。
但是这样缺点是,如果是代码的问题,这样另起一个任务并不会有什么效果,反而会增加整个集群的负担(推测式执行要在整个作业都开始之后才会启动,并且只针对运行一段时间之后,执行的速度慢与整个作业),所以可以根据具体的情况而选择开启和关闭推测式执行。
jvm重用
不管是mapTask还是 reduceTask 都是运行在taskTracke节点上的java虚拟机(jvm),每当taskTracker被分配一个任务,就会在本地启动一个新的java虚拟机。对于有大量零碎文件的map来说,启动那么多的虚拟机显然是不明智,优化有待提升的。如果在很多的时间一个map运行结束,让后续的任务继续重用这个虚拟机就是jvm重用。虽然一个taskTracker节点上可以有多个任务,但是他们都是运行在相互独立的虚拟机上的,taskTracker上的其他任务必须等待,就算是jvm重用也只能是顺序执行
控制jvm重用的属性是mapred.job.reuse.jvm.num.tasks 这个属性上定义了一个TaskTracker运行任务的最大数量,默认为1,可以自定义,为-1则表示没有数量限制
跳过坏环节
mapReduce执行的数据量非常的大,所以用户在编写程序是可能会疏忽或者数据中有坏的记录的存在,所以用户的代码在处理某个记录时可能会崩溃,这时虽然hadoop有处理这种错误的机制,即使再次重复执行也无济于事( 默认是会重新执行4次),还是会导致整个作业的失败。但是要在庞大的数据量中找到坏的数据也是很困难,很费时的。所以就是当前代码执行时,遇到坏的记录就直接跳过去,然后继续执行(数据量很大的话,有个别错误数据也是可以忍受的)。
当忽略模式启动后,任务失败两次,他就会将错误信息告诉taskTracker,taskTracker就会重新启动一个任务去运行,当再次收到先前任务运行时所遇到的错误信息时,就会直接跳过改记录。忽略模式只适合忽略个别记录数
任务的执行环境
hadoop能够为执行任务的taskTracker提供任务的运行环境,比如map知道处理文件的名称,集群的id等,jobTracker在分配任务给taskTracker时候,会将作业的配置文件发送给taskTracker,taskTracker会将文件保存在本地。我们知道,taskTracker是运行在本地节点单独的jvm上一子进程的方式运行map和reduce,每一个map或者reduce都会启动一个新的jvm,子的jvm会继承父的jvm的执行环境。
- Hadoop笔记系列 一 用Hadoop进行分布式数据处理(1)
学习资料参考地址: 1.http://blog.csdn.net/zhoudaxia/article/details/8801769 1.先说说什么是Hadoop? 个人理解:一个分布式文件存储系统+ ...
- Hadoop笔记
教程: Elasticsearch.MongoDB和Hadoop比较: http://blog.csdn.net/hong0220/article/details/47631409
- hadoop 笔记(hbase)
hbase 基础: hbase是基于列的数据,其数据模式如下: 1.安装 1.1)hbase安装分为单机.伪分布式.分布式,单机下安装不依赖于hadoop:因为不需要分布式文件系统支持: 1.2)安装 ...
- Hadoop笔记HDFS(2)
高级Hadoop MapReduce管理 1 调试部署好的Hadoop的配置 2 运行基准测试检验Hadoop的安装 3 重新利用JVM提升性能 4 容错性 5 调试脚本-分析失败任务原因 6 设置失 ...
- Hadoop笔记HDFS(1)
环境:Hadoop2.7.3 1.Benchmarking HDFS 1.1测试集群的写入 运行基准测试是检测HDFS集群是否正确安装以及表现是否符合预期的好方法.DFSIO是Hadoop自带的一个基 ...
- hadoop笔记之Hive的数据存储(内部表)
Hive的数据存储(内部表) Hive的数据存储(内部表) 基于HDFS 可使用hadoop给我们提供的web管理工具查看数据.打开管理工具localhost:9000–>Utilities下的 ...
- hadoop笔记之Hive入门(Hive的体系结构)
Hive入门(二) Hive入门(二) Hive的体系结构 ○ Hive的元数据 Hive将元数据存储在数据库中(metastore),支持mysql.derby.oracle等数据库,Hive默认是 ...
- hadoop笔记之Hive入门(什么是Hive)
Hive入门(一) Hive入门(一) 什么是Hive? Hive是个数据仓库,数据仓库就是数据库,但又与一般意义上的数据库有点区别 实际上,Hive是构建在hadoop HDFS上的一个数据仓库. ...
- hadoop笔记之MapReduce的应用案例(利用MapReduce进行排序)
MapReduce的应用案例(利用MapReduce进行排序) MapReduce的应用案例(利用MapReduce进行排序) 思路: Reduce之后直接进行结果合并 具体样例: 程序名:Sort. ...
随机推荐
- Could not execute action
2.Could not execute action 原因:action成员变量有空值,要访问方法中,使用了该成员变量 参考: http://www.blogjava.net/javagrass/ar ...
- 线段树 poj 2991
我们只要把这些向量求和,最终所指的位置就是终点,因此我们只要维护好向量的区间和就可以了.对于第二个问题,我们可以用一个数组degree[i]表示第i个向量和第i-1一个向量当前的夹角,这样就有了当前的 ...
- 【caffe】绘制网络结构图
@tags caffe 网络结构 可视化 当拿到一份网络定义文件net.prototxt,可以用工具画出网络结构.最快速的方法是使用在线工具netscope,粘贴内容后shift+回车就可以看结果了. ...
- C#安全性记录
安全性一直是开发中,重中之重的问题.不过平时用的不算特别多,基本上用个MD5,SSL也就到这了.再次记录一下,以免忘记. MD5多次加密 MD5算法是不可逆算法.应用于密码验证,完整性验证这种特征.这 ...
- ArcGIS Server开发教程系列(2)配置ARCMAP和ARCCatalog发布服务
1. Arc catalog的配置 打开catalog,如图新增刚刚创建的server 1. Use GIS services: 用户身份连接 使用此种连接,可以浏览.使用站点内发布的所有 ...
- 面试题目——《CC150》栈与队列
面试题3.1:描述如何只用一个数组来实现三个栈. 方法1:固定分割 方法2:弹性分割(较难) package cc150; public class ArrayStack { public stati ...
- webpack-dev-server
webpack-dev-server是一个小型的node.js Express服务器,它使用webpack-dev-middleware中间件来为通过webpack打包生成的资源文件提供Web服务.它 ...
- java 实现文件下载
需求:把每天产生的日志文件,从服务器上下载下来 File file = new File(path); // 根据路径,获取File String filename = file.getName(); ...
- B:Wordpress不同分类调用不同的模板
这里指的是默认文章类型的模板(single.php,category.php) 应用场景: 默认文章默认有2个大类(新闻资讯.游戏资料) 新闻资讯下的所有子分类调用"新闻资讯列表模板,新闻内 ...
- [Fluent NHibernate]第一个程序
目录 写在前面 Fluent Nhibernate简介 基本配置 总结 写在前面 在耗时两月,NHibernate系列出炉这篇文章中,很多园友说了Fluent Nhibernate的东东,也激起我的兴 ...