并发编程:
1. 多任务
抢占式:总控制权在操作系统中,操作系统会轮流询问每一个任务是否需要的CPU,需要的话就让让它用,不过在一定时间之后,操作系统会剥夺当前任务的CPU使用权,让它排在询问队列的最后,再去询问下一个任务。
协作式:一个任务得到了CPU时间,除非它自己放弃使用CPU,否则将完全霸占CPU,所以任务之间需要协作--使用一段时间之后就放弃使用CPU,其它任务也是这样,才能保证系统的正常运行。
2. volatile关键字:
提醒编译器它后面所定义的变量随时有可能发生变化,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读数据。
如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的情况。
比如:外设数据的读取。多个线程都需要去读取这个数据的时候,也需要小心
Hadoop:
Common:最底层模块,为Hadoop各子项目提供各种工具
HDFS:具有高容错性的文件系统
MapReduce:编程模型
HBase:分布式的,面向列的开源数据库
ZooKeeper:分布式的服务框架,解决分布式系统中的一致性问题
Hive:基于Hadoop的数据仓库工具,将结构化的数据映射为一张表
Pig:对大数据进行分析和评估的工具
Mahout:机器学习和数据挖掘,利用MapReduce实现K-means,Naive Bayes等
MapReduce理论介绍:
MapReduce编程模型:
1. MapReduce采用“分而治之”的思想,把对大规模数据集的操作,分发给一个主节点管理下的各个分结点共同完成,然后通过整合各个节点的中间结果,得到最终的结果。简单点:MapReduce就是:任务的分解与结果的汇总。
2. 在Hadoop中,只想MapReduce任务的机器角色有两个:JobTracker & TaskTracker,JobTracker是用于调度工作的,TaskTracker是用于执行工作的。一个Hadoop集群中只有一台JobTracker。
3. 在分布式计算中,MapReduce框架负责处理了并行编程中分布式存储,工作调度,负载均衡,容错均衡,容错处理以及网络通信等复杂问题,把处理过程高度抽象为两个函数:map 和 reduce。map负责把任务的分解成为多个任务,reduce负责把分解后多任务处理的结果汇总起来。
Note:
用MapReduce处理的数据集必须具有这样的特点:待处理的数据集可以分解为许多小的数据集,而且每一个数据集都可以完全并行地处理。
必须会解释的关键名词:
Map:
1. 是指MapReduce框架中的Map过程,即将一个分片根据用户定义的Map逻辑处理后,经由MapReduce框架处理,形成输出结果,然后供后续的Reduce过程使用
2. 是指用户定义Java程序实现Mapper类的map接口的用户自定义逻辑,时常称之为mapper.
Reduce:
1. MapReduce框架中的Reduce过程,即将Map的结果作为输入,根据用户定义的Reduce逻辑,将结果处理并汇总,输出最后的结果。
2. 是指用户定义Java程序实现Reduce类的reduce接口的用户自定义逻辑,时常称之为reducer
Shuffle:
当一个map任务完成之后,节点可能还要继续执行更多的map任务,但这时候也开始把map任务的中间输出交换到需要它们的reducer中去。
Partition:
每一个Reduce节点会被分派到中间输出的键集合中的一个不同的子集合,这些子集合被称之为partitions,是reduce任务的输入数据,每一个map任务生成的键值对有可能会隶属于任意的partition,有着相同键的数值总是在一起被reduce,不管它是来自哪个mapper。因此,所有的map节点必须把不同的中间数据发往何处达成一致。Partition类就是用来决定给定键值对的去向,默认的分类器partitioner会计算 键的hash值并基于这个结果来把键赋值到相应的partition上。
Sort:
每一个reduce任务负责归约(reducing)关联到相同键上的所有数值,每一个节点收到的中间键集合在被送到具体的reducer那里前就已经自动被Hadoop排序过了。
Combiner:
它在Mapper之后Reducer之前运行,Combiner是可选的,如果这个过程适合你的作业,Cmibiner实例会在每一个运行map任务的节点上运行。Comniner会接收特点节点的Mapper实例的输出作为输入,接着Combiner的输出会被发送到Reducer那里,而不是发送Mapper的输出。Combiner是一个“迷你reduce”过程,它只处理单台机器产生的数据。
Reporter:
是用于MapReduce应用程序进度报告,设定应用级别的状态消息,更新Counters(计数器)的机制。
是时候放几张图了:
- 输入大量数据
- 对数据进行分组,其实就是split操作
- 然后做一个mapping,就是把单词切分出来
- shuffing就是把数据扔到需要做计数的组里面去
- Reducing就是合并数据结果
- Final result输出结果
没看懂:再来一张更详细的:
map/reduce/shuffle/Partition/Sort/Combiner/Reporter
第一步,将文件拆分为splits,由于测试用的文件较小,所以每个文件为一个split,并将文件按行分割形成键值对<key, values>,如上图所示,这一步由MapReuce框架自动完成,其中偏移量(即key值)包括了回车所占的字符数
第二步,将分割好的<key, value>键值对交给用户定义的map方法进行处理,生成新的<key, value>对,如上图所示。
第三步,得到map方法输出的<key, value>对后,Mapper会将它们按照key值进行排序,并执行Combine过程,将key值相同的value值累加,得到Mapper的最终输出结果,如上所示。
第四步,Reducer先对Mapper接收的数据进行排序,再交由用户定义的reduce方法进行处理,得到新的<key, value>对,并作为WordCount的输出结果,如上图。