大数据浅谈

本文主要介绍了大数据技术的基本知识,包括MapReduceYARN的基本原理等。

一、大数据概要

1.1 定义

什么是大数据?对此定义颇多,下面是来自百度百科的解释:

大数据(big data),指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

《大数据技术原理与应用》总结,其具有这么4个特征(4V):

  1. 数据量大(Volume)
  2. 数据类型繁多(Variety)
  3. 处理速度快(Velocity)
  4. 价值密度低(Value)

1.1.1 数据量大

随着信息技术的发展,21世纪是一个信息爆炸的时代,越来越多的终端设备,像手机电脑智能穿戴设备等,还有无处不在的摄像头,越来越多的监测卫星等等,都在无时无刻输出海量数据,而这个增长速度随着5G的到来,网速越来越快,单位时间内获取到的信息量相比4G更大,而且这个增速也会急速上升,即将产生超巨量的各种数据。

怎么样合理存储和处理如此巨量的数据,也是大数据技术的两大核心问题。

1.1.2 数据类型繁多

结构化数据占10%,主要是被存储在关系数据库中的数据。

非结构化数据占90%,主要包括邮件、音视频、网络日志、指纹、人脸等异构数据。

1.1.3 处理速度快

大数据时代的数据产生速度非常迅速,在数秒之内,新浪可以产生数万条微博,淘宝可以卖出数万件商品,百度可以产生百万条搜索,微信更不用多说,所以大数据的实时处理响应速度极快,而随着数据量的继续增长,处理要求也在不断被提高。

1.1.4 价值密度低

价值密度高的东西能想到的一个典型——金子,一小块也价值不菲,所以才会有很多的淘金者去探求。

金子的意义等同于数据的价值,马云说过“21世纪的竞争是数据的竞争,谁掌握数据,谁就掌握未来。”,马云还说了,“我们集团本质上是一家扩大数据价值的公司”,所以阿里巴巴绝不是一家网购公司,而是一家数据公司,不难发现,阿里早已染指了各个领域,我们的绝大部分数据他们通过投资收购或拥有的旗下企业都可以拿到,出行数据——滴滴快的、高德地图、飞猪、哈罗单车,社交关系数据——微博、陌陌,线上娱乐数据——优酷土豆、阿里影业、淘票票、光线,证券交易所数据——恒生电子,物流数据——菜鸟网络,支付数据——蚂蚁金服、支付宝,餐饮服务数据——口碑、饿了么;

淘金的意义也等同于我们要在海量数据中去获取价值,然而后者难度可能并不亚于前者。举个另外的例子,小区中的大量监控摄像头24h工作,无时无刻都在传输监控数据,然而案件发生时,对我们真正有价值的,只是在海量历史数据中的某一段。

1.2 要解决的问题

Hadoop是一个Java编写的、开源的分布式计算平台,它的目标对准了大数据的两个核心问题,怎么存储和怎么处理,也分别对应Hadoop的两大核心——HDFS和MapReduce。

1.2.1 大数据的存储

如果不采用HDFS这种分布式存储方式,若需存储海量数据,或许我们要靠提升单个机器的存储性能来实现,而随着数据量的爆炸性增长,最终还是得回到分布式存储的方案。

HDFS是对谷歌分布式文件系统GFS的开源实现,面向普通硬件环境,具有较高读写速度、很好的容错性和可伸缩性,支持大规模数据的分布式存储,其冗余数据存储的方式很好地保证了数据安全性。

HDFS特点:适用于大文件存储,高吞吐率,一次写入多次读取,多副本,以块存储,块大小默认128MB。

HDFS Web浏览页

http://10.1.4.18:50070/explorer.html#/tmp/songzehao

HDFS常用命令

hadoop fs –ls /tmp/songzehao
hadoop fs –cat /tmp/songzehao/words_input
hadoop fs -rm -r -skipTrash /tmp/songzehao/words_input 
hadoop fs –cp /tmp/songzehao/words_input /tmp/songzehao/words_input2
hadoop fs -mv /tmp/words_input /tmp/songzehao/words_input
hadoop fs -mkdir -p /tmp/songzehao

1.2.2 大数据的处理

如果不采用MapReduce这种处理方式,若需处理海量数据,或许我们也要靠提升单个机器的处理性能或购买大型机,而随着2013年后摩尔定律的失效,CPU处理速度已放缓,以及大型机成本过高的原因,我们仍需依靠多台机器的分布式处理能力,使用相对廉价的机器协同作战,同时MapReduce已帮我们保证了协同可靠性以及大大减小了编码难度,在MapReduce里,我们只用关注map和reduce两个函数的实现,至于任务调度和资源分配等都不用过多关注。当然,MapReduce是要运行在HDFS文件系统上。

1.3 现状及未来

大数据技术正处于快速发展期,国家也有相关指导政策,目前的应用比较广泛,像前几年人工智能AlphaGo通过机器学习数百万场高手棋盘对弈和数十万场的实际练习,击败了人类;像前些天宜宾地震的预警信号;还有时不时新闻上的大数据帮忙抓隐姓埋名二十年的逃犯;还有商业上更多的应用,挖掘企业数据的潜在价值,当然,作为消费者,当今也存在大数据杀熟杀生等无奈的现象。

随着人工智能时代的来临,未来大数据的舞台无限大,相关法律和道德规定也会趋于完善,未来已来。

二、大数据怎么玩

2.1 搭建及组件介绍

可选社区开源版Apache Hadoop,或第三方发行版,如HDP、CDH等。综合考虑稳定性、部署配置效率等因素,我们选择使用Cloudera Manager来安装CDH5.7.2版本,安装好的大数据集群环境(考虑到机器配置不足,只能暂时安装最精简版)如下:

可以看到,集群里主要的组成部分包含:主机、HDFS、Hive、Hue、Oozie、YARN(MR2 Included)、ZooKeeper,之后机器配置提升之后再去安装其他组件(如HBase、Spark、Sqoop、Impala、Kafka等)即可。下面简单介绍一下重要组件:

HDFS:见1.2.1,Hadoop的分布式文件系统服务,很多Hadoop组件的运行环境,主从结构,适用于大文件存储,高吞吐率,一次写入多次读取,多副本,以块存储,提供客户端访问,主节点NameNode管理文件命名空间,从节点DataNode真正存储数据块,第二名称节点Secondary NameNode周期性检查NameNode状态并实现冷备份,双机NameNode热备,始终保持一个acive,另一个standby。

MapReduce:见1.2.2,分布式计算框架,依赖于HDFS,“计算向数据靠拢”以减少网络开销,函数式编程,“分而治之”并行处理。

YARN:见2.2.3,资源管理调度框架,以Container为单位动态分配机器资源。

ZooKeeper:高可用的分布式数据管理与协调框架,如YARN中ResourceManager的HA,以及HBase集群中的协调等。

Hive:基于Hadoop的数仓工具,将结构化的HDFS数据文件映射为一张数据库表,HiveQL可转换为MR作业,免于写MR应用程序,但延迟高。

HBase:分布式列式数据库,依赖于ZooKeeper和HDFS底层存储,实时性查询,提供多种访问方式,通过行键RowKey、列族Column Family、列限定符和时间戳才能定位到唯一的一条记录。

Sqoop:SQL-to-Hadoop,ETL工具,可实现HDFS与关系数据库之间的导入导出。

Kafka:消息队列框架,与RocketMQ、RabbitMQ、ActiveMQ同属目前流行的几个消息中间件,实时性好,也支持离线处理消息,可保证海量消息的消费可靠性和高效性。

Spark:基于内存的大数据并行计算框架,内存和CPU要求较高,Spark Streaming将实时输入流以秒为单位拆分,每个分片以类似批处理的方式处理,秒级,实时性要求更高的可选择Storm或Flink等。

2.2 运行WordCount

2.2.1 MapReduce程序的实现

MapReduce编程里的HelloWorld就是统计词频WordCount,编写MR的核心在于map和reduce函数的实现。

对HDFS上的含有很多单词的文本文件,如何统计出每个单词出现的总次数?文本内容如下:

szh dk tyn cj cj zp zp szh dk szh dk dk dk tyn

①map,即映射,在map()中,将每个单词映射为KV输出,K=word,V=1,代表某个单词已出现一次;

②reduce,即缩聚,在reduce()中,通过输入K相同的KV对,并将V累加,即可统计出某单词出现的频次;

③将应用打成jar包,准备在客户端提交执行,并指定在HDFS上的统计结果输出目录:

hadoop jar /opt/szh/wc.jar WordCount /tmp/songzehao/words_input /tmp/songzehao/words_output

④Hdfs命令查看检验输出结果:

szh     3
zp      2
cj      2
dk      5
tyn     2

2.2.2 MapReduce作业的运行机制

2.2.3 资源管理调度YARN

MR作业在客户端提交到YARN,交由YARN去管理调度,就像我们把应用程序启动后,交由操作系统上的CPU去指挥调度一样,YARN相当于分布式的操作系统平台。其组件如下:

YARN对作业的处理流程:

YARN的调度策略:

  • FIFO
  • Capacity,多队列,队列内部FIFO
  • Fair,动态调整系统资源

当然也可在YARN的控制台上实时查看应用的资源分配情况:

Apps:提交过的、等待中的、正在运行的、已经完成的应用;

Containers:包含了CPU、内存、磁盘等机器资源的资源分配单位;

Memory:已占用的、总的、预定的内存空间;

VCores:已占用的、总的、预定的CPU核心数;

Nodes:活跃的、停止使用的、丢失的、故障的、重启的节点。

2.2.4 Hive实现SQL功能

HiveQL的执行实质上也是MR,只是免去编写MR程序并做了某些优化,来实现跟SQL一样的功能,如group by和join。

① 创建Hive表:

hive> create table user(
    id      int
   ,name    string
   ,address   string
)
row format delimited
fields terminated by ','
;

② 将HDFS上的文件数据映射到创建好的Hive表:

hive> load data local inpath '/opt/szh/users.csv' overwrite into table user;

③ 查看Hive表:

hive> show tables;
OK
history
salaries
t1
user
Time taken: 1.55 seconds, Fetched: 4 row(s)

④ 查看Hive表数据:

hive> select * from user;
OK
1 szh sx
2 dk sh
3 tyn hn
4 cj js
5 zp sd
Time taken: 0.377 seconds, Fetched: 5 row(s)

⑤ Hive实现join:

hive> select history.*,user.name,address from user right join history on user.id = history.user_id;
Query ID = hdfs_20190626153939_5ee9d981-f995-4231-9e1f-df6044ece4c0
Total jobs = 1
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512M; support was removed in 8.0
Execution log at: /tmp/hdfs/hdfs_20190626153939_5ee9d981-f995-4231-9e1f-df6044ece4c0.log
2019-06-26 03:39:40 Starting to launch local task to process map join; maximum memory = 1908932608
2019-06-26 03:39:41 Dump the side-table for tag: 0 with group count: 5 into file: file:/tmp/hdfs/210a3b24-ac96-47be-b483-2777a2525946/hive_2019-06-26_15-39-36_706_7895996595552593295-1/-local-10003/HashTable-Stage-3/MapJoin-mapfile00--.hashtable
2019-06-26 03:39:41 Uploaded 1 File to: file:/tmp/hdfs/210a3b24-ac96-47be-b483-2777a2525946/hive_2019-06-26_15-39-36_706_7895996595552593295-1/-local-10003/HashTable-Stage-3/MapJoin-mapfile00--.hashtable (387 bytes)
2019-06-26 03:39:41 End of local task; Time Taken: 0.653 sec.
Execution completed successfully
MapredLocal task succeeded
Launching Job 1 out of 1
Number of reduce tasks is set to 0 since there's no reduce operator
Starting Job = job_1561526929614_0001, Tracking URL = http://bi-zhaopeng03:8088/proxy/application_1561526929614_0001/
Kill Command = /opt/cloudera/parcels/CDH-5.7.2-1.cdh5.7.2.p0.18/lib/hadoop/bin/hadoop job  -kill job_1561526929614_0001
Hadoop job information for Stage-3: number of mappers: 1; number of reducers: 0
2019-06-26 15:39:48,353 Stage-3 map = 0%,  reduce = 0%
2019-06-26 15:39:53,521 Stage-3 map = 100%,  reduce = 0%, Cumulative CPU 1.44 sec
MapReduce Total cumulative CPU time: 1 seconds 440 msec
Ended Job = job_1561526929614_0001
MapReduce Jobs Launched:
Stage-Stage-3: Map: 1   Cumulative CPU: 1.44 sec   HDFS Read: 5918 HDFS Write: 154 SUCCESS
Total MapReduce CPU Time Spent: 1 seconds 440 msec
OK
3 20190303 303 tyn hn
3 20190301 301 tyn hn
3 20190302 302 tyn hn
1 20190101 101 szh sx
1 20190102 102 szh sx
2 20190201 201 dk sh
10 20190617 1001 NULL NULL
Time taken: 17.92 seconds, Fetched: 7 row(s)

⑥ Hive实现group by:

hive> select dept_id,sum(sal) from salaries group by dept_id order by dept_id;
Query ID = hdfs_20190626154646_f4979d01-ca0a-4ea4-aa13-4b013adcf833
Total jobs = 2
Launching Job 1 out of 2
Number of reduce tasks not specified. Estimated from input data size: 1
In order to change the average load for a reducer (in bytes):
  set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
  set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
  set mapreduce.job.reduces=<number>
Starting Job = job_1561526929614_0002, Tracking URL = http://bi-zhaopeng03:8088/proxy/application_1561526929614_0002/
Kill Command = /opt/cloudera/parcels/CDH-5.7.2-1.cdh5.7.2.p0.18/lib/hadoop/bin/hadoop job  -kill job_1561526929614_0002
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
2019-06-26 15:46:09,517 Stage-1 map = 0%,  reduce = 0%
2019-06-26 15:46:14,648 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 1.18 sec
2019-06-26 15:46:18,747 Stage-1 map = 100%,  reduce = 100%, Cumulative CPU 2.98 sec
MapReduce Total cumulative CPU time: 2 seconds 980 msec
Ended Job = job_1561526929614_0002
Launching Job 2 out of 2
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
  set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
  set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
  set mapreduce.job.reduces=<number>
Starting Job = job_1561526929614_0003, Tracking URL = http://bi-zhaopeng03:8088/proxy/application_1561526929614_0003/
Kill Command = /opt/cloudera/parcels/CDH-5.7.2-1.cdh5.7.2.p0.18/lib/hadoop/bin/hadoop job  -kill job_1561526929614_0003
Hadoop job information for Stage-2: number of mappers: 1; number of reducers: 1
2019-06-26 15:46:23,977 Stage-2 map = 0%,  reduce = 0%
2019-06-26 15:46:29,101 Stage-2 map = 100%,  reduce = 0%, Cumulative CPU 1.05 sec
2019-06-26 15:46:34,213 Stage-2 map = 100%,  reduce = 100%, Cumulative CPU 3.06 sec
MapReduce Total cumulative CPU time: 3 seconds 60 msec
Ended Job = job_1561526929614_0003
MapReduce Jobs Launched:
Stage-Stage-1: Map: 1  Reduce: 1   Cumulative CPU: 2.98 sec   HDFS Read: 7589 HDFS Write: 139 SUCCESS
Stage-Stage-2: Map: 1  Reduce: 1   Cumulative CPU: 3.06 sec   HDFS Read: 4664 HDFS Write: 17 SUCCESS
Total MapReduce CPU Time Spent: 6 seconds 40 msec
OK
30 9500
31 95000
Time taken: 30.265 seconds, Fetched: 2 row(s)

2.3 分布式计算引擎

分布式存储的问题目前都普遍借助于HDFS,但是分布式计算引擎由于业务需求的改变或提高,从最原始的Mapreduce编程,到HiveQL对静态数据的类SQL批处理计算,都不能满足如今的实际场景,所以很多分布式计算引擎相继登场百家争鸣:

还有一些尚未流行的优秀引擎:

所以,我们要选型的话,综合考虑各方面因素,性能最好的不一定是最适合我们业务需求的。

 

三、实际应用

 

发布了62 篇原创文章 · 获赞 22 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/songzehao/article/details/94117990