相关技术
Hadoop 包含了三个组件:
图片对比
从图中我们可以看出
Spark并不能替换Hadoop,它可以替换Hadoop中的MapReduce,所以现在常见的是Hadoop和Spark配合使用。
HDFS
hadoop fs | dfs
批处理和实时流处理
对比
框架 | 批处理 | 实时流处理 |
---|---|---|
MapReduce(Hadoop) | 支持 | 不支持 |
Spark | 支持对比MapReduce性能高 | 支持使用批处理模拟的 |
Flink | 支持使用实时流处理模拟的 | 支持 |
详情
MapReduce 适合批处理任务,也就是说每天对一个大量的静态数据集进行一次处理,同样,Spark 也非常的适合批处理任务,但是 Spark 有一个子模块就是 Spark Streaming 用于实时数据流处理
Flink 同样适合对大数据进行批处理,也可以使用在实时数据流的处理中,那么 Spark 和 Flink 到底选择哪一个呢?
Spark 是以批处理起家的,它的内核就是以批处理的思想来设计实现的。Spark Streaming 虽然可以实时处理数据,但是它的本质还是批处理,只是批处理的时间间隔缩短,比如时间间隔设置成 1 秒,那也就是说每隔 1 秒钟发起一个批处理,所以严格来说 Spark Streaming 只能是近实时处理的技术,适合用于延迟是秒级别的实时计算应用。
Flink 是以实时流处理起家的,它的内核就是以实时流处理的思想来设计实现的。所以 Flink 的实时流处理才是真正意义上的实时处理,如果你的实时处理应用要求延迟非常低的话,那就是用 Flink 的实时流处理了。
Flink 也是支持批处理的,Flink 批处理是基于 Flink 的实时流处理来实现的,也就是说实时收集到的数据先不做处理,等收集了一段时间的数据后,再对这段时间收集的数据做全量的批处理。
所以,对于计算逻辑非常复杂的应用,建议使用 Spark,对于实时要求非常高的场景,建议使用 Flink 的实时流处理技术,如果实时要求不高的话,仍然可以选择使用 Spark Streaming。
Rabbitmq比Kafka可靠,kafka更适合IO高吞吐的处理,比如ELK日志收集
Kafka和RabbitMq一样是通用意图消息代理,他们都是以分布式部署为目的。但是他们对消息语义模型的定义的假设是非常不同的。
a) 以下场景比较适合使用Kafka。如果有大量的事件(10万以上/秒)、你需要以分区的,顺序的,至少传递成功一次到混杂了在线和打包消费的消费者、希望能重读消息、你能接受目前是有限的节点级别高可用就可以考虑kafka。
b) 以下场景比较适合使用RabbitMQ。如果是较少的事件(2万以上/秒)并且需要通过复杂的路由逻辑去找到消费者、你希望消息传递是可靠的、并不关心消息传递的顺序、而且需要现在就支持集群-节点级别的高可用就可以考虑rabbitmq。
Mapreduce也是分布式计算框架,但是Spark要多加2个字,分布式内存计算框架,牛就牛在内存这块。
所以和它的堂兄MapRedcue比起来,有如哪些不同点呢:
1)Spark脑子聪明、不偷懒- 中间结果不输出磁盘
MR喜欢将中间结果写到磁盘上,MR做事又喜欢将一件事情分层几个环节来做(多个stage,执行的时候讲多个stage串联起来),每个环节都把中间结果写到磁盘,下个stage又从磁盘拿出来,难免啰嗦、麻烦效率低(MR做事比较死板,一板一眼按流程挨个做(一个任务分为多个stage串行执行))。
Spark相对机灵一点,事先评估好做事情的策略和方法,哪些事情可以放在一起,哪些不放在一起,方法策略定好后(所有动作抽象为有向五环图执行计划DAG),再动手干,规划好的事情可以挨个做,也可以同时做,活不离手(数据在内存),当然有时候拿不过来了,也可以放一放手(写到磁盘上),下次再要做的时候再拿起来继续。
但是显然spark的缺点也明显了,内存,你的数据一致放在内存,哪有那么多内存让你败啊,如果和其他一样需要消耗内存的服务在一起,肯定要打个你死我活。MR就不会,别人想多点内存,他一点都不在意,谁要谁拿去,哥不稀罕。
2)脾气不好-Spark容错比maprduce要差
有点才华的人脾气都大啊,spark比较有个性,脾气确实不咋地。如果活干着干着失败了,spark暴怒之下就要从头再来(做事太急,急的都不知道自己在哪里跌倒了-因为数据在内存,需要重新计算),而MR则不会从头再来,他哪里跌倒哪里爬起来,因为做事情慢,所以也是有条不紊(知道在哪里跌倒了-数据在磁盘)。
其实两个人都有比较好的脾气- 好的容错能力,但是他们对比起来,MR容错能力略好一点。
3)相处能力(与其他组件的兼容性)
Spark可以自己单干,也可以在yarn上一伙人干,吃饭也不挑剔-(数据源可以是HDFS支持的各类文件格式),还可以通过jdbc和odbc和家族之外人共事(与传统BI工具)
mr内心是这样想的:这有什么好拿出来炫耀的,我也可以做到。确实他们两兄弟在这一点上是旗鼓相当的。
4)身体健康(安全性)
Spark是一个高效的分布式计算系统,相比Hadoop有以下几个优势:
性能可以比Hadoop高100倍。
Spark提供比Hadoop更上层的API,同样的算法在Spark中实现往往只有Hadoop的十分之一或者一百分之一的长度。
基于对MR的理解,回忆一下分布式计算碰到的几个典型问题
其实分布式计算框架,就这点破事,折腾不出什么新鲜花样,基于对上面问题的思考,看看spark是怎么解决的。
组成
Spark Core是大规模并行计算和分布式数据处理的基础引擎。它的职责有:
内存管理和故障恢复; 调度、分发和监控集群上的作业; 与存储系统进行交互。 Spark引入了RDD(弹性分布式数据集)的概念,RDD是一个不可变的容错、分布式对象集合,支持并行操作。RDD可包含任何类型的对象,可通过加载外部数据集或通过Driver程序中的集合来完成创建。
RDD支持两种类型的操作: 转换(Transformations)指的是作用于一个RDD上并会产生包含结果的新RDD的操作(例如map, filter, join, union等) 动作(Actions)指的是作用于一个RDD之后,会触发集群计算并得到返回值的操作(例如reduce,count,first等) Spark中的转换操作是“延迟的(lazy)”,意味着转换时它们并不立即启动计算并返回结果。相反,它们只是“记住”要执行的操作和待执行操作的数据集(例如文件)。转换操作仅当产生调用action操作时才会触发实际计算,完成后将结果返回到driver程序。这种设计使Spark能够更有效地运行,例如,如果一个大文件以不同方式进行转换操作并传递到首个action操作,此时Spark将只返回第一行的结果,而不是对整个文件执行操作。
默认情况下,每次对其触发执行action操作时,都需要重新计算前面经过转换操作的RDD,不过,你也可以使用持久化或缓存方法在内存中持久化RDD来避免这一问题,此时,Spark将在集群的内存中保留这些元素,从而在下次使用时可以加速访问。
SparkSQL是Spark中支持SQL语言或者Hive查询语言查询数据的一个组件。它起先作为Apache Hive 端口运行在Spark之上(替代MapReduce),现在已经被集成为Spark的一个重要组件。除支持各种数据源,它还可以使用代码转换来进行SQL查询,功能十分强大。下面是兼容Hive查询的示例:
// sc is an existing SparkContext.
val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
sqlContext.sql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING)")
sqlContext.sql("LOAD DATA LOCAL INPATH 'examples/src/main/resources/kv1.txt' INTO TABLE src") // Queries are expressed in HiveQL
sqlContext.sql("FROM src SELECT key, value").collect().foreach(println)
Spark Streaming支持实时处理流数据,例如生产环境中的Web服务器日志文件(例如 Apache Flume和 HDFS/S3),社交媒体数据(例如Twitter)和各种消息队列中(例如Kafka)的实时数据。在引擎内部,Spark Streaming接收输入的数据流,与此同时将数据进行切分,形成数据片段(batch),然后交由Spark引擎处理,按数据片段生成最终的结果流,如下图所示。
Spark Streaming API与Spark Core紧密结合,使得开发人员可以轻松地同时驾驶批处理和流数据。
MLlib是一个提供多种算法的机器学习库,目的是使用分类,回归,聚类,协同过滤等算法能够在集群上横向扩展(可以查阅Toptal中关于机器学习的文章详细了解)。MLlib中的一些算法也能够与流数据一起使用,例如使用普通最小二乘法的线性回归算法或k均值聚类算法(以及更多其他正在开发的算法)。Apache Mahout(一个Hadoop的机器学习库)摒弃MapReduce并将所有的力量放在Spark MLlib上。
GraphX是一个用于操作图和执行图并行操作的库。它为ETL即Extraction-Transformation-Loading、探索性分析和迭代图计算提供了统一的工具。除了内置的图操作之外,它也提供了一个通用的图算法库如PageRank。