数据量爆发式增长的今天,数字化转型成为IT行业的热点,数据需要更深度的价值挖掘,应对未来不断变化的需求。海量离线数据分析可以应用于多种商业系统环境,例如电商海量日志分析、用户行为画像分析、科研行业的海量离线计算分析任务等场景。
对于“大数据”(Big data)研究机构Gartner给出了这样的定义。“大数据”是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力来适应海量、高增长率和多样化的信息资产。
麦肯锡全球研究所给出的定义是:一种规模大到在获取、存储、管理、分析方面大大超出了传统数据库软件工具能力范围的数据集合,具有海量的数据规模、快速的数据流转、多样的数据类型和价值密度低四大特征。
在维克托·迈尔-舍恩伯格及肯尼斯·库克耶编写的《大数据时代》 中大数据指不用随机分析法(抽样调查)这样捷径,而采用所有数据进行分析处理。大数据的5V特点(IBM提出):Volume(大量)、Velocity(高速)、Variety(多样)、Value(低价值密度)、Veracity(真实性)。
2.1 Hadoop
Hadoop起源于Apache Nutch项目,始于2002年,是Apache Lucene的子项目之一 。2004年,Google在“操作系统设计与实现”(Operating System Design and Implementation,OSDI)会议上公开发表了题为MapReduce:Simplified Data Processing on Large Clusters(Mapreduce:简化大规模集群上的数据处理)的论文之后,受到启发的Doug Cutting等人开始尝试实现MapReduce计算框架,并将它与NDFS(Nutch Distributed File System)结合,用以支持Nutch引擎的主要算法 。由于NDFS和MapReduce在Nutch引擎中有着良好的应用,所以它们于2006年2月被分离出来,成为一套完整而独立的软件,并被命名为Hadoop。到了2008年年初,hadoop已成为Apache的顶级项目,包含众多子项目,被应用到包括Yahoo在内的很多互联网公司 。
Java编写的支持PB级别数据存储与计算能力的大数据平台。
Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。
把HDFS理解为一个分布式的,有冗余备份的,可以动态扩展的用来存储大规模数据的大硬盘。
把MapReduce理解成为一个计算引擎,按照MapReduce的规则编写Map计算/Reduce计算的程序,可以完成计算任务。
2.2 Spark
Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架。
Scala语言开发的基于内存的新一代分布式开源大数据框架,支持离线,实时计算,也支持 SQL 语法以及机器学习的处理。
Spark是用来弥补基于MapReduce处理数据速度上的缺点,它的特点是把数据装载到内存中计算而不是去读慢的要死进化还特别慢的硬盘。特别适合做迭代运算,所以算法流们特别稀饭它。它是用scala编写的。
对比 MapReduce 和 Spark 异同,不过私以为 MapReduce 能做的 Spark 基本都可以做,除此以外 Spark 可以更优雅的控制计算过程。相比于 MapReduce 仅仅提供的 mapper, reducer 两个算子,Spark有更多好用的算子。
2.3 Hive
Hive最初是应Facebook每天产生的海量新兴社会网络数据进行管理和机器学习的需求而产生和发展的。
Java语言开发的基于Hadoop的一套离线数据处理系统,在HDFS之上提供了结构化的表数据的管理能力,提供类 SQL 的查询语法进行数据分析处理。
Hadoop的存储和计算都不友好,而且传统用户更熟悉Sql语句,于是在上面又包了一层,用户只用写SQL,本质是:将HQL转化成MapReduce程序。
2.4 Kafka
Apache Kafka最初由LinkedIn开发,并在2011年初开源。
由Scala和Java编写的Kafka是一种高吞吐量的分布式发布订阅消息系统,具有出色的性能和可靠性。
kafka的架构师jay kreps对于kafka的名称由来是这样讲的,由于jay kreps非常喜欢franz kafka,并且觉得kafka这个名字很酷,因此取了个和消息传递系统完全不相干的名称kafka,该名字并没有特别的含义。
kafka的诞生,是为了解决linkedin的数据管道问题,起初linkedin采用了ActiveMQ来进行数据交换,大约是在2010年前后,那时的ActiveMQ还远远无法满足linkedin对数据传递系统的要求,经常由于各种缺陷而导致消息阻塞或者服务无法正常访问,为了能够解决这个问题,linkedin决定研发自己的消息传递系统,当时linkedin的首席架构师jay kreps便开始组织团队进行消息传递系统的研发;
2.5 Flink
2008:柏林理工大学一个研究性项目Stratosphere,Next Generation Big Data Analytics Platform(目标是建立下一代大数据分析引擎);
2014-04-16,Stratosphere成为Apache孵化项目,从Stratosphere 0.6开始,正式更名为Flink。由Java语言编写;
针对流数据和批数据的分布式处理引擎,基于Apache Flink的商业化产品Ververica Platform构建的企业级大数据计算平台提供实时计算服务。
目前比较流行的大数据处理引擎Apache Spark,基本上已经取代了MapReduce成为当前大数据处理的标准。但是随着数据的不断增长,新技术的不断发展,人们逐渐意识到对实时数据处理的重要性。相对于传统的数据处理模式,流式数据处理有着更高的处理效率和成本控制能力。Flink 就是近年来在开源社区不断发展的技术中的能够同时支持高吞吐、低延迟、高性能的分布式处理框架。
2.6 Presto0
Facebook2012年开发,2013年开源。Java语言编写的开源的分布式SQL查询引擎,适用于交互式查询分析。是一个运行在多台服务器上的分布式查询引擎,本身并不存储数据,但是可以接入多种数据源(Hive、Oracle、MySql、Kafka、Redis等),并且支持跨数据源的级联查询,比如:select * from a join b where a.id=b.id;,其中表a可以来自Hive,表b可以来自Mysql。
2.7 ClickHouse
ClickHouse 是俄罗斯的 Yandex 于 2016 年开源的用于在线分析处理查询(OLAP :Online Analytical Processing)的列式存储数据库(DBMS:Database Management System),能够使用 SQL 查询实时生成分析数据报告。ClickHouse的全称是Click Stream,Data WareHouse。
C++编写的开源OLAP分析引擎,主要特性:列式存储、MPP架构、支持SQL、实时的数据更新、支持索引等。
Elasticsearch最擅长的主要是完全搜索场景(where过滤后的记录数较少),在内存富裕运行环境下可以展现出非常出色的并发查询能力。但是在大规模数据的分析场景下(where过滤后的记录数较多),ClickHouse凭借极致的列存和向量化计算会有更加出色的并发表现,并且查询支持完备度也更好。ClickHouse的并发处理能力立足于磁盘吞吐,而Elasticsearch的并发处理能力立足于内存Cache,这使得两者的成本区间有很大差异,ClickHouse更加适合低成本、大数据量的分析场景,它能够充分利用磁盘的带宽能力。数据导入和存储成本上,ClickHouse更加具有绝对的优势。
2.8 Hudi
由Java和Scala编写的一种数据湖的存储格式,提供更新数据和删除数据的能力以及消费变化数据的能力。
Apache Hudi是一个Data Lakes的开源方案,Hudi是Hadoop Updates and Incrementals的简写,它是由Uber开发并开源的Data Lakes解决方案。
数据湖(Data Lake)和数据库、数据仓库一样,都是数据存储的设计模式。数据库和数据仓库会以关系型的方式来设计存储、处理数据。但数据湖的设计理念是相反的,数据仓库是为了保障数据的质量、数据的一致性、数据的重用性等对数据进行结构化处理。
了解过Hadoop的同学知道,基于Hadoop可以存储任意形式的数据。所以,很多时候数据湖会和Hadoop关联到一起。
数据湖和数据仓库是用于存储大数据的两种不同策略,最大区别是:数据仓库是提前设计好模式(schema)的,因为数据仓库中存储的都是结构化数据。而在数据湖中,不一定是这样的。数据湖中可以存储结构化和非结构化的数据,是无法预先定义好结构的。
2.9 Hbase
HBase是基于HDFS分布式文件系统去构建的。换句话说,HBase的数据其实也是存储在HDFS上的。那肯定有好奇宝宝就会问:HDFS和HBase有啥区别阿?
HDFS是文件系统,而HBase是数据库,其实也没啥可比性。「你可以把HBase当做是MySQL,把HDFS当做是硬盘。HBase只是一个NoSQL数据库,把数据存在HDFS上」。HBase在HDFS之上提供了高并发的随机写和支持实时查询,这是HDFS不具备的。
所以Hbase更适合非结构化的数据存储;只要求静态数据的极速查询能力,Clickhouse则更好。
2.10 Hue
Hue是一个开源的Apache Hadoop UI系统,
由Cloudera Desktop演化而来,最后Cloudera公司将其贡献给Apache基金会的Hadoop社区,它是基于Python Web框架Django实现的。
方便的Web端管理工具。Hue是一个可快速开发和调试Hadoop生态系统。
Hue的用途:
访问HDFS和文件浏览
通过web调试和开发hive以及数据结果展示
查询solr和结果展示,报表生成
通过web调试和开发impala交互式SQL Query
spark调试和开发
Pig开发和调试
oozie任务的开发,监控,和工作流协调调度
Hbase数据查询和修改,数据展示
Hive的元数据(metastore)查询
MapReduce任务进度查看,日志追踪
创建和提交MapReduce,Streaming,Java job任务
Sqoop2的开发和调试
Zookeeper的浏览和编辑
数据库(MySQL,PostGres,SQlite,Oracle)的查询和展示
上传数据到HDFS
本步骤将指导您如何将自建数据上传到HDFS。
执行如下命令,创建HDFS目录。
hdfs dfs -mkdir -p /data/student
上传文件到hadoop文件系统。
a.执行如下命令,创建u.txt文件。
#创建u.txt文件 vim u.txt
196 242 3 881250949
186 302 3 891717742
22 377 1 878887116
244 51 2 880606923
166 346 1 886397596
298 474 4 884182806
115 265 2 881171488
253 465 5 891628467
305 451 3 886324817
6 86 3 883603013
62 257 2 879372434
286 1014 5 879781125
200 222 5 876042340
210 40 3 891035994
224 29 3 888104457
303 785 3 879485318
122 387 5 879270459
194 274 2 879539794
291 1042 4 874834944
234 1184 2 892079237
119 392 4 886176814
167 486 4 892738452
299 144 4 877881320
291 118 2 874833878
308 1 4 887736532
95 546 2 879196566
38 95 5 892430094
102 768 2 883748450
63 277 4 875747401
160 234 5 876861185
50 246 3 877052329
301 98 4 882075827
225 193 4 879539727
290 88 4 880731963
97 194 3 884238860
157 274 4 886890835
181 1081 1 878962623
278 603 5 891295330
276 796 1 874791932
7 32 4 891350932
10 16 4 877888877
284 304 4 885329322
201 979 2 884114233
276 564 3 874791805
287 327 5 875333916
246 201 5 884921594
242 1137 5 879741196
249 241 5 879641194
99 4 5 886519097
178 332 3 882823437
251 100 4 886271884
81 432 2 876535131
260 322 4 890618898
25 181 5 885853415
59 196 5 888205088
72 679 2 880037164
87 384 4 879877127
290 143 5 880474293
42 423 5 881107687
292 515 4 881103977
115 20 3 881171009
20 288 1 879667584
201 219 4 884112673
13 526 3 882141053
246 919 4 884920949
138 26 5 879024232
167 232 1 892738341
60 427 5 883326620
57 304 5 883698581
223 274 4 891550094
189 512 4 893277702
243 15 3 879987440
92 1049 1 890251826
246 416 3 884923047
194 165 4 879546723
241 690 2 887249482
178 248 4 882823954
254 1444 3 886475558
293 5 3 888906576
127 229 5 884364867
225 237 5 879539643
299 229 3 878192429
225 480 5 879540748
276 54 3 874791025
291 144 5 874835091
222 366 4 878183381
267 518 5 878971773
42 403 3 881108684
11 111 4 891903862
95 625 4 888954412
8 338 4 879361873
162 25 4 877635573
87 1016 4 879876194
279 154 5 875296291
145 275 2 885557505
119 1153 5 874781198
62 498 4 879373848
62 382 3 879375537
28 209 4 881961214
135 23 4 879857765
32 294 3 883709863
90 382 5 891383835
286 208 4 877531942
293 685 3 888905170
216 144 4 880234639
166 328 5 886397722
``
c. 上传文件u.txt到hadoop文件系统。
hdfs dfs -put u.txt /data/student
查看文件。
hdfs dfs -ls /data/student
使用hive创建表
本步骤将指导您如何使用hive创建数据表,并使用hadoop文件系统中的数据加载到hive数据表中。
执行如下命令,登录hive数据库。
hive
创建user表。
CREATE TABLE emrusers ( userid INT, movieid INT, rating INT, unixtime STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ;
执行如下命令,从hadoop文件系统加载数据到hive数据表。
LOAD DATA INPATH '/data/student/u.txt' INTO TABL
对表进行操作
本步骤将指导您如何使用hive对数据表进行查询等操作。
查看5行表数据。
select * from emrusers limit 5;
- 查询数据表中有多少条数据。
select count(*) from emrusers;
返回结果如下,您可以看到您数据表中一共有多少数据,
- 查询数据表中评级最高的三个电影。
select movieid,sum(rating) as rat from emrusers group by movieid order by rat desc limit 3;
返回结果如下,您可以看到您数据表中评级最高的三个电影。