大数据入门
总结一下近期学习的大数据知识,主要是参考了厦门大学林子雨老师的博客
学习之前没搞清楚的知识
-
传统的web应用(LAMP、JavaEE、NODE系等)与大数据什么关系?
之前一直以为大数据的东西就是来取代传统的Web应用的,其实并不是这样;即使是大数据的架构,应用层依然会是传统的web应用,但是会根据数据特点对数据存储(结构化数据依然会保存在传统的关系型数据库——如MySql,日志等非结构数据会保存在分布式文件系统——如Hadoop的HDFS)。
大数据的东西不是取代传统的web应用,而是对web应用的增强。基于分布式存储和分布式计算,以前单机或者小规模集群无法解决的问题,使用了大数据技术之后就可以解决了,比如日志等数据当数据量非常大的时候(TB甚至PB),对这些数据的分析在传统架构上是不可能或者是非常慢的,使用了大数据技术之后就是可能的了——主要是将数据处理通过MapReduce等拆分到不同的节点(电脑)上执行,然后将节点上的结果合并,最后生成分析结果。
-
云计算和大数据
这个话题在林子雨老师的教程——“第一讲 大数据概述”里介绍的非常好,感兴趣的朋友可以自己去看看,这里概括总结为:“云计算为大数据提供了技术基础,大数据为云计算提供了用物之地”。
现在几乎所有的公司都把自己的产品吹成“云”...但是真的都是“云”么?其实很多都是传统的web应用部署到阿里云这些第三方云平台吧;还有一部分有自己服务器(一般配置),然后搞个公网ip,部署上去也说自己是“云”。
Hadoop结构(更新)
参照厦门大学林子雨-大数据技术原理与应用-教材配套讲课视频-第2讲-大数据处理架构Hadoop
这部分内容请观看林子雨老师的视频,讲得比较透彻。下面的内容是在看视频之前(那会儿只看了林子雨老师的教材和博客,如林子雨老师在视频中说得,教材上的内容都是基于Hadoop1.0的,在视频中已经更新到了2.0)写的,作为一些参考吧。
学习历程
- 了解Hadoop生态系统,了解一下生态系统中各模块的作用,文章后面对各模块有一些简单的总结
- HDFS
- YARN
- HBase
- MapReduce
- Hive
- Pig
- Mahout
- Zookeeper
- Sqoop
- Flume
- Kafka等
-
了解Spark,了解Spark比MapReduce的优势,学习RDD编程
- Spark SQL
- Spark Streaming
- Spark Mlib
- ...
找两台电脑搭个Hadoop、Spark集群,配置Spark开发环境(SBT),运行一些demo例程,典型如WordCount
研究一下MapReduce的WordCount和Spark的WorkCount的代码,通过对比加深理解
-
参考如下案例,了解大数据应用,熟悉HBase,Hive,Sqoop等
整理一些知识(来自厦门大学林子雨老师的博客)
HBase
HBase是一个高可靠、高性能、面向列、可伸缩的分布式数据库,是谷歌BigTable的开源实现,主要用来存储非结构化和半结构化的松散数据。HBase的目标是处理非常庞大的表,可以通过水平扩展的方式,利用廉价计算机集群处理由超过10亿行数据和数百万列元素组成的数据表
HBase可以直接使用本地文件系统或者Hadoop作为数据存储方式,不过为了提高数据可靠性和系统的健壮性,发挥HBase处理大数据量等功能,需要使用Hadoop作为文件系统。与Hadoop一样,HBase目标主要依靠横向扩展,通过不断增加廉价的商用服务器来增加计算和存储能力。
HIVE
Hive是一个构建于Hadoop顶层的数据仓库工具,由Facebook公司开发,并在2008年8月开源。Hive在某种程度上可以看作是用户编程接口,其本身并不存储和处理数据,而是依赖HDFS来存储数据,依赖MapReduce来处理数据。Hive定义了简单的类似SQL的查询语言——HiveQL,它与大部分SQL语法兼容,但是,并不完全支持SQL标准,比如,HiveSQL不支持更新操作,也不支持索引和事务,它的子查询和连接操作也存在很多局限。
HiveQL语句可以快速实现简单的MapReduce任务,这样用户通过编写的HiveQL语句就可以运行MapReduce任务,不必编写复杂的MapReduce应用程序。对于Java开发工程师而言,就不必花费大量精力在记忆常见的数据运算与底层的MapReduce Java API的对应关系上;对于DBA来说,可以很容易把原来构建在关系数据库上的数据仓库应用程序移植到Hadoop平台上。所以说,Hive是一个可以有效、合理、直观地组织和使用数据的分析工具。
Impala
Hive 作为现有比较流行的数据仓库分析工具之一,得到了广泛的应用,但是由于Hive采用MapReduce 来完成批量数据处理,因此,实时性不好,查询延迟较高。Impala 作为新一代开源大数据分析引擎,支持实时计算,它提供了与Hive 类似的功能,并在性能上比Hive高出3~30 倍。Impala 发展势头迅猛,甚至有可能会超过Hive 的使用率而成为Hadoop 上最流行的实时计算平台。
Hive 与Impala 的不同点总结如下:
- 第一,Hive 比较适合进行长时间的批处理查询分析,而Impala 适合进行实时交互式SQL 查询。
- 第二,Hive 依赖于MapReduce 计算框架,执行计划组合成管道型的MapReduce 任务模式进行执行,而Impala 则把执行计划表现为一棵完整的执行计划树,可以更自然地分发执行计划到各个Impalad执行查询。
- 第三,Hive在执行过程中,如果内存放不下所有数据,则会使用外存,以保证查询能顺序执行完成,而Impala在遇到内存放不下数据时,不会利用外存,所以,Impala目前处理查询时会受到一定的限制。
Hive与Impala的相同点总结如下:
- 第一,Hive与Impala使用相同的存储数据池,都支持把数据存储于HDFS和HBase中,其中,HDFS支持存储TEXT、RCFILE、PARQUET、AVRO、ETC等格式的数据,HBase存储表中记录。
- 第二,Hive与Impala使用相同的元数据。
- 第三,Hive与Impala中对SQL的解释处理比较相似,都是通过词法分析生成执行计划。
总的来说,Impala的目的不在于替换现有的MapReduce工具,把Hive与Impala配合使用效果最佳,可以先使用Hive进行数据转换处理,之后再使用Impala在Hive处理后的结果数据集上进行快速的数据分析。
PIG
Pig 是Hadoop 生态系统的一个组件,提供了类似SQL 的Pig Latin 语言(包含Filter、GroupBy、Join、OrderBy 等操作,同时也支持用户自定义函数),允许用户通过编写简单的脚本来实现复杂的数据分析,而不需要编写复杂的MapReduce 应用程序,Pig 会自动把用户编写的脚本转换成MapReduce 作业在Hadoop 集群上运行,而且具备对生成的MapReduce程序进行自动优化的功能,所以,用户在编写Pig 程序的时候,不需要关心程序的运行效率,这就大大减少了用户编程时间。因此,通过配合使用Pig 和Hadoop,在处理海量数据时就可以实现事半功倍的效果,比使用Java、C++等语言编写MapReduce 程序的难度要小很多,并且用更少的代码量实现了相同的数据处理分析功能。Pig 可以加载数据、表达转换数据以及存储最终结果,因此,在企业实际应用中,Pig通常用于ETL(Extraction、Transformation、Loading)过程,即来自各个不同数据源的数据被收集过来以后,采用Pig 进行统一加工处理,然后加载到数据仓库Hive 中,由Hive 实现对海量数据的分析。需要特别指出的是,每种数据分析工具都有一定的局限性,Pig 的设计和MapReduce 一样,都是面向批处理的,因此,Pig 并不适合所有的数据处理任务,特别是当需要查询大数据集中的一小部分数据时,Pig 仍然需要对整个或绝大部分数据集进行扫描,因此,实现性能不会很好。
Tez
Tez 是Apache 开源的支持DAG 作业的计算框架,通过DAG 作业的方式运行MapReduce 作业,提供了程序运行的整体处理逻辑,就可以去除工作流当中多余的Map 阶段,减少不必要的操作,提升数据处理的性能。Hortonworks把Tez 应用到数据仓库Hive 的优化中,使得性能提升了约100 倍。如图15-13 所示,可以让Tez 框架运行在YARN 框架之上,然后让MapReduce、Pig 和Hive 等计算框架运行在Tez框架之上,从而借助于Tez 框架实现对MapReduce、Pig 和Hive 等的性能优化,更好地解决现有MapReduce 框架在迭代计算(如PageRank 计算)和交互式计算方面存在的问题。
Tez在解决Hive、Pig延迟大、性能低等问题的思路,是和那些支持实时交互式查询分析的产品(如Impala、Dremel和Drill等)是不同的。Impala、Dremel和Drill的解决问题思路是抛弃MapReduce计算框架,不再将类似SQL语句的HiveQL或者Pig语句翻译成MapReduce程序,而是采用与商用并行关系数据库类似的分布式查询引擎,可以直接从HDFS或者HBase中用SQL语句查询数据,而不需要把SQL语句转化成MapReduce任务来执行,从而大大降低了延迟,很好地满足了实时查询的要求。但是,Tez则不同,比如,针对Hive数据仓库进行优化的“Tez+Hive”解决方案,仍采用MapReduce计算框架,但是对DAG的作业依赖关系进行了裁剪,并将多个小作业合并成一个大作业,这样,不仅计算量减少了,而且写HDFS次数也会大大减少。
Kafka
Kafka是由LinkedIn公司开发的一种高吞吐量的分布式发布订阅消息系统,用户通过Kafka系统可以发布大量的消息,同时也能实时订阅消费消息。
在大数据时代涌现的新的日志收集处理系统(Flume、Scribe等)往往更擅长批量离线处理,而不能较好地支持实时在线处理。相对而言,Kafka可以同时满足在线实时处理和批量离线处理。
Kafka设计的初衷是构建一个可以处理海量日志、用户行为和网站运营统计等的数据处理框架
最近几年,Kafka在大数据生态系统中开始扮演越来越重要的作用,在Uber、Twitter、Netflix、LinkedIn、Yahoo、Cisco、Goldman Sachs等公司得到了大量的应用。目前,在很多公司的大数据平台中,Kafka通常扮演数据交换枢纽的角色。
在公司的大数据生态系统中,可以把Kafka作为数据交换枢纽,不同类型的分布式系统(关系数据库、NoSQL数据库、流处理系统、批处理系统等),可以统一接入到Kafka,实现和Hadoop各个组件之间的不同类型数据的实时高效交换,较好地满足各种企业应用需求。
Sqoop
Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。