高可用Hadoop平台-探索
1.概述
上篇《高可用Hadoop平台-启航》博客已经让我们初步了解了Hadoop平台;接下来,我们对Hadoop做进一步的探索,一步一步的揭开Hadoop的神秘面纱。下面,我们开始赘述今天的探索之路。
2.探索
在探索之前,我们来看一下Hadoop解决了什么问题,Hadoop就是解决了大数据(大到单台服务器无法进行存储,单台服务器无法在限定的时间内进行处理)的可靠存储和处理。
- HDFS:在由普通或廉价的服务器(或PC)组成的集群上提供高可用的文件存储,通过将块保存多个副本的办法解决服务器或硬盘坏掉的问题。
- MapReduce:通过简单的Mapper和Reducer的抽象提供一个编程模型,可以在一个由几十台或上百台的服务器组成的集群上进行并发,分布式的处理大量的数据集;而并发,分布式(如:机器间通信)和故障恢复等计算细节隐藏起来。而Mapper和Reducer的抽象,又是各种各样的复杂数据处理都可以分解为基本元素。这样,复杂的数据处理可以分解为由多个Job(包含一个Mapper和一个Reducer)组成的有向无环图(DAG),然后每个Mapper和Reducer放到Hadoop集群上执行,就可以得出如下图所示的结果:
在Hadoop的源码中,提供了一个很经典的例子:WordCount,具体源码可以参见上篇文章,如果对MapReduce不熟悉,通过该示例对MapReduce进行一些了解对理解下文会由帮助。在MapReduce中,Shuffle是一个非常重要的过程,正是有了看不见的Shuffle过程,才可以使在MapReduce之上写数据处理的开发者完全感觉不到分布式和并发的存在。
注:广义的Shuffle是指图中在Map和Reduce之间的一系列过程。
2.1Hadoop的局限和不足
MapReduce存在以下局限,使用起来比较困难。
- 抽象层次低,需要手工编写代码来完成,使用上难以上手,入门门槛较高。
- 只提供两个操作,Map和Reduce,表达的力度不够。
- 一个Job只有Map和Reduce两个阶段,复杂的计算需要大量的Job来完成。Job之间的依赖关系是由开发者自己来管理的。
- 处理逻辑隐藏在代码细节中,没有整体逻辑。
- 中间结果也放在HDFS文件系统中。
- ReduceTask需要等待所有的MapTask都完成后才可以开始。
- 时延高,只适用Batch数据处理,对于交互式数据处理,实时数据处理的支持不够。
- 对于迭代式数据处理性能比较差。
举个例子,用MapReduce实现表与表之间的join,都是一个很需要技巧来处理的过程,如下图:
因此,在Hadoop之后,出现来很多相关技术对其中的局限进行改进,如:Hive,Oozie,Tez,Spark,Storm等等。
3.Hive
Hive是Facebook的产品,目前已托管到Apache基金。关于Hive的安装搭建和使用请参考《那些年使用Hive踩过的坑》和《Hive的安装部署》,这里就不多赘述了。Hive是一种底层封装了Hadoop的数据仓库处理工具,使用类SQL的HiveSQL语言实现数据查询,所有Hive的数据都存储在HDFS中。Hive在加载数据过程中不会对数据进行任何的修改,只是将数据移动到HDFS中Hive的指定目录下,因此,Hive不支持对数据的改写和添加,所有的数据都是在加载的时候确定的。
Hive解决类MapReduce存在的大量手写代码,语义隐藏,提供操作种类少的问题。类似的项目还有Pig,JAQL等。
4.Tez
Tez是HortonWorks的Stinger Initiative的的一部分。作为执行引擎,Tez也提供了有向无环图(DAG),DAG由顶点(Vertex)和边(Edge)组成,Edge是对数据的移动的抽象,提供了One-To-One,BroadCast,和Scatter-Gather三种类型,只有Scatter-Gather才需要进行Shuffle。
示例:
SELECT a.state, COUNT(*), AVERAGE(c.price) FROM a JOIN b ON (a.id = b.id) JOIN c ON (a.itemId = c.itemId) GROUP BY a.state
Tez的优化主要体现在:
- 去除了连续两个任务之间的写屏障
- 去除了每个工作流中多余的Map阶段
通过提供DAG语义和操作,提供了整体的逻辑,通过减少不必要的操作,Tez提升了数据处理的执行性能。
5.Spark
Spark也是一个大数据处理的引擎,主要特点是提供了一个集群的分布式内存抽象,以支持需要工作集的应用。
这个抽象就是RDD(Resilient Distributed Dataset),RDD就是一个不可变的带分区的记录集合,RDD也是Spark中的编程模型。Spark提供了RDD上的两类操作,转换和动作。转换是用来定义一个新的RDD,包括map, flatMap, filter, union, sample, join, groupByKey, cogroup, ReduceByKey, cros, sortByKey, mapValues等,动作是返回一个结果,包括collect, reduce, count, save, lookupKey。
Spark支持故障恢复的方式也不同,提供两种方式,Linage,通过数据的血缘关系,再执行一遍前面的处理,Checkpoint,将数据集存储到持久存储中。
Spark的API非常简单易用,使用Spark,WordCount的示例如下所示:
val spark = new SparkContext(master, appName, [sparkHome], [jars])
val file = spark.textFile("hdfs://nna:9000/hdfs/in/a.txt")
val counts = file.flatMap(line => line.split(" "))
.map(word => (word, 1))
.reduceByKey(_ + _)
counts.saveAsTextFile("hdfs://nna:9000/hdfs/out")
其中的file是根据HDFS上的文件创建的RDD,后面的flatMap,map,reduceByKe都创建出一个新的RDD,一个简短的程序就能够执行很多个转换和动作。在Spark中,所有RDD的转换都是是惰性求值的。Spark的任务是由相互依赖的多个RDD组成的有向无环图(DAG),每个RDD又包含多个分区,当在RDD上执行动作时,Spark才对任务进行调度。
Spark对于有向无环图对任务进行调度,确定阶段,分区,流水线,任务和缓存,进行优化,并在Spark集群上运行任务。RDD之间的依赖分为宽依赖(依赖多个分区)和窄依赖(只依赖一个分区),在确定阶段时,需要根据宽依赖划分阶段。根据分区划分任务。
Spark为迭代式数据处理提供更好的支持。每次迭代的数据可以保存在内存中,而不是写入文件。
Spark的性能相比Hadoop有很大提升,2014年10月,Spark完成了一个Daytona Gray类别的Sort Benchmark测试,排序完全是在磁盘上进行的,与Hadoop之前的测试的对比结果如表格所示:
原图链接地址:http://databricks.com/blog/2014/11/05/spark-officially-sets-a-new-record-in-large-scale-sorting.html
从表格中可以看出排序100TB的数据(1万亿条数据),Spark只用了Hadoop所用1/10的计算资源,耗时只有Hadoop的1/3。
Spark的优势不仅体现在性能提升上的,Spark框架为批处理(Spark Core),交互式(Spark SQL),流式(Spark Streaming),机器学习(MLlib),图计算(GraphX)提供一个统一的平台,这相对于使用Hadoop有很大优势。
6.总结
那么Spark解决了Hadoop的哪些问题?
- 抽象层次低,需要手工编写代码来完成,使用上难以上手。
- =>基于RDD的抽象,实数据处理逻辑的代码非常简短。
- 只提供两个操作,Map和Reduce,表达力欠缺。
- =>提供很多转换和动作,很多基本操作如Join,GroupBy已经在RDD转换和动作中实现。
- 一个Job只有Map和Reduce两个阶段,复杂的计算需要大量的Job完成,Job之间的依赖关系是由开发者自己管理的。
- =>一个Job可以包含RDD的多个转换操作,在调度时可以生成多个阶段,而且如果多个map操作的RDD的分区不变,是可以放在同一个Task中进行。
- 处理逻辑隐藏在代码细节中,没有整体逻辑。
- =>在Scala中,通过匿名函数和高阶函数,RDD的转换支持流式API,可以提供处理逻辑的整体视图。
- 代码不包含具体操作的实现细节,逻辑更清晰。 中间结果也放在HDFS文件系统中。
- =>中间结果放在内存中,内存放不下了会写入本地磁盘,而不是HDFS。
- ReduceTask需要等待所有MapTask都完成后才可以开始
- =>它允许用户单独为Map Task和Reduce Task设置不同的资源,进而细粒度控制任务占用资源量,有利于大作业的正常平稳运行。
- 时延高,只适用Batch数据处理,对于交互式数据处理,实时数据处理的支持不够。
- =>通过将流拆成小的batch提供Discretized Stream处理流数据。
- 对于迭代式数据处理性能比较差。
- =>通过在内存中缓存数据,提高迭代式计算的性能。
这篇文章就分享到这里,若在研究的过程中有什么疑问,可以加群讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!
高可用Hadoop平台-探索的更多相关文章
- 高可用Hadoop平台-Oozie工作流之Hadoop调度
1.概述 在<高可用Hadoop平台-Oozie工作流>一篇中,给大家分享了如何去单一的集成Oozie这样一个插件.今天为大家介绍如何去使用Oozie创建相关工作流运行与Hadoop上,已 ...
- 高可用Hadoop平台-Hue In Hadoop
1.概述 前面一篇博客<高可用Hadoop平台-Ganglia安装部署>,为大家介绍了Ganglia在Hadoop中的集成,今天为大家介绍另一款工具——Hue,该工具功能比较丰富,下面是今 ...
- 高可用Hadoop平台-实战尾声篇
1.概述 今天这篇博客就是<高可用Hadoop平台>的尾声篇了,从搭建安装到入门运行 Hadoop 版的 HelloWorld(WordCount 可以称的上是 Hadoop 版的 Hel ...
- 高可用Hadoop平台-实战
1.概述 今天继续<高可用的Hadoop平台>系列,今天开始进行小规模的实战下,前面的准备工作完成后,基本用于统计数据的平台都拥有了,关于导出统计结果的文章留到后面赘述.今天要和大家分享的 ...
- 高可用Hadoop平台-集成Hive HAProxy
1.概述 这篇博客是接着<高可用Hadoop平台>系列讲,本篇博客是为后面用 Hive 来做数据统计做准备的,介绍如何在 Hadoop HA 平台下集成高可用的 Hive 工具,下面我打算 ...
- 高可用Hadoop平台-启航
1.概述 在上篇博客中,我们搭建了<配置高可用Hadoop平台>,接下来我们就可以驾着Hadoop这艘巨轮在大数据的海洋中遨游了.工欲善其事,必先利其器.是的,没错:我们开发需要有开发工具 ...
- 高可用Hadoop平台-Flume NG实战图解篇
1.概述 今天补充一篇关于Flume的博客,前面在讲解高可用的Hadoop平台的时候遗漏了这篇,本篇博客为大家讲述以下内容: Flume NG简述 单点Flume NG搭建.运行 高可用Flume N ...
- 高可用Hadoop平台-Ganglia安装部署
1.概述 最近,有朋友私密我,Hadoop有什么好的监控工具,其实,Hadoop的监控工具还是蛮多的.今天给大家分享一个老牌监控工具Ganglia,这个在企业用的也算是比较多的,Hadoop对它的兼容 ...
- 高可用Hadoop平台-HBase集群搭建
1.概述 今天补充一篇HBase集群的搭建,这个是高可用系列遗漏的一篇博客,今天抽时间补上,今天给大家介绍的主要内容目录如下所示: 基础软件的准备 HBase介绍 HBase集群搭建 单点问题验证 截 ...
随机推荐
- 笔记:使用mailto在网页中链接Email地址
<a>标签还有一个作用是可以链接Email地址,使用mailto能让访问者便捷向网站管理者发送电子邮件.我们还可以利用mailto做许多其它事情.下面一一进行讲解,请看详细图示: 注意:如 ...
- Python爬虫防封杀方法集合
Python爬虫防封杀方法集合 mrlevo520 2016.09.01 14:20* 阅读 2263喜欢 38 Python 2.7 IDE Pycharm 5.0.3 前言 ...
- 一个支持邮件带附件群发的java类
import java.io.UnsupportedEncodingException;import java.util.ArrayList;import java.util.Date;import ...
- 构造函数new执行与直接执行的区别
//创建一个Test构造 function Test(){ // new执行与直接执行 this的不同指向 this.init(); }; // this 指向 Test Test.prototype ...
- MySQL查询实例
单表查询查询所有列 1 SELECT * FROM product; 查询指定列 1 SELECT pro_name,price,pinpai FROM product; 添加常量列 1 SELECT ...
- 3、利用GDB进行程序调试
本文将用一个实际例子讲解如何通过GDB进行程序调试. 首先,我们需要理解的是GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,其产生和调试的目的是让调试者知道,程序在执行时内部发生了什么 ...
- [zjoi2010]cheese
题目: 贪吃的老鼠(cheese.c/cpp/pas/in/out) 时限:每个测试点10秒 [问题描述] 奶酪店里最近出现了m只老鼠!它们的目标就是把生产出来的所有奶酪都吃掉.奶酪店中一天会生产n块 ...
- 利用阿里大于接口发短信(Delphi版)
阿里大于是阿里通信旗下产品,融合了三大运营商的通信能力,提供包括短信.语音.流量直充.私密专线.店铺手机号等个性化服务.每条四分五,价钱还算公道,经老农测试,响应速度非常快,基本上是秒到.官方文档提供 ...
- [C# 开发技巧]如何使不符合要求的元素等于离它最近的一个元素
一.问题描述 今天在MSDN论坛中看到这样的一个问题,觉得非常锻炼思维能力,所以这里记录下来作为备份,题目的要求是这样的: 假设有一组字符串数组{"0","0" ...
- SoftWareHelper
SoftWareHelper 环境 Visual Studio 2017,.Net Framework 4.0 SDK GitHub源码:https://github.com/yanjinhuagoo ...