随着慢慢深入学习大数据的个个组件,记录一下这些组件的功能与使用。
HDFS 文件系统
传统的文件系统是单机的,不能跨不同机器。HDFS的设计就是为了解决大量数据跨越成千上万的机器上存储,而提供给我们的是一个文件系统而不是多个文件系统。 举个例子:你需要操作/hdfs/tmp目录上的数据,而这些数据存放在不同的多个机器上。作为用户,你不需要关心这些数据分布在哪些机器。hdfs会帮助你操作管理这些数据。
MapReduce 是什么?
举个例子:统计一个非常大的文本文件,统计其中出现的某些个单词出现的次数。
处理过程:先启动一个MapReduce程序,map阶段是多个机器从这个文件中读取这个文件的某一部分,然后每个机器统计出这些单词的出现次数。reduce阶段是某个机器(假设机器A)接收其他机器的所有单词A,那么机器B就会接收所有其他机器的B单词然后汇总统计求和。
总结: MapReduce就是这么简单的过程。它可以说是第一代的计算引擎,第二代计算引擎是Tez和Spark。第二代的引擎让MapReduce的过程效率更高。
Hive
hive sql 交互引擎。用习惯了sql的数据分析人员让他去写MapReduce程序可能会逼疯一堆。hive sql解放了他们。许多从传统数据库过渡到大数据平台,通过hive sql能减少很多代码的重构。 再说说hive执行的效率吧,如果使用hive on hdfs,只能说巨慢!!!不过还好接入第二代计算hive on Tez/Spark/SparkSql可以减少许多痛苦的等待。但是hive不适合实时查询。
HBase
HBase非常适合大数据的实时查询。HBase是一种NoSql数据库,因此自身不支持Sql查询语言。同时它又是分布式存储数据库,但是缺少关系型数据库的很多特性。想要在 HBase 上使用 SQL,则需要联合使用 Apache Phonenix,或者联合使用 Hive 和 HBase。但是和上面提到的一样,如果集成使用 Hive 查询 HBase 的数据,则无法绕过 MapReduce,那么实时性还是有一定的损失。Phoenix 加 HBase 的组合则不经过 MapReduce 的框架,因此当使用 Phoneix 加 HBase 的组成,实时性上会优于 Hive 加 HBase 的组合。
Phoenix
Apache Phoenix接收SQL查询,将其编译成一系列HBase扫描,并编排这些扫描的运行,以生成常规的JDBC结果集。直接使用HBase API,以及协处理器和自定义过滤器,对于小查询,性能可以提高到毫秒级,对于数千万行,性能可以提高到秒级。
Streaming(流处理)
- Apache Storm: 在Storm中,先要设计一个用于实时计算的图状结构,我们称之为拓扑(topology)。这个拓扑将会被提交给集群,由集群中的主控节点(master node)分发代码,将任务分配给工作节点(worker node)执行。一个拓扑中包括spout和bolt两种角色,其中spout发送消息,负责将数据流以tuple元组的形式发送出去;而bolt则负责转换这些数据流,在bolt中可以完成计算、过滤等操作,bolt自身也可以随机将数据发送给其他bolt。由spout发射出的tuple是不可变数组,对应着固定的键值对。
- Apache Spark: Spark Streaming是核心Spark API的一个扩展,它并不会像Storm那样一次一个地处理数据流,而是在处理前按时间间隔预先将其切分为一段一段的批处理作业。Spark针对持续性数据流的抽象称为DStream(DiscretizedStream),一个DStream是一个微批处理(micro-batching)的RDD(弹性分布式数据集);而RDD则是一种分布式数据集,能够以两种方式并行运作,分别是任意函数和滑动窗口数据的转换。
- Apache Samza: Samza处理数据流时,会分别按次处理每条收到的消息。Samza的流单位既不是元组,也不是Dstream,而是一条条消息。在Samza中,数据流被切分开来,每个部分都由一组只读消息的有序数列构成,而这些消息每条都有一个特定的ID(offset)。该系统还支持批处理,即逐次处理同一个数据流分区的多条消息。Samza的执行与数据流模块都是可插拔式的,尽管Samza的特色是依赖Hadoop的Yarn(另一种资源调度器)和Apache Kafka。