目录
Flume
一:flume是什么?
二:flume核心概念:
Kafka
一:kafka是什么?
二:为什么使用kafka?
三:如何保证消息不被重复?
四:如何保证消息不丢失?
五:如何保证消息的顺序性?
六:消息队列快写满怎么办?
七:kafka的ack机制:
HIVE
一:hive是什么?
二:hive的优势?
三:Hive(行转列 列转行)
四:hive的自定义函数?
五:内部表与外部表?
六:hive优化
七:hive存储格式:
八:小文件是如何产生的?
九:维度建模
十:hive的运行模式
impala
Spark
一:spark是什么?
二:spark的基本原理:
三:spark的运行模式:
四:spark集群角色:
五:spark作业运行流程:
flume是一个可分布式,可靠。可高可用得日志收集,汇聚和传输得系统。适用于大部分得日常数据采集场景。
webserver-
taildir source---采集组件和数据源对接,获取数据。他有断点续传功能和读取多目录文件的功能
(source和channel中间有一个put事务)
Memory channel-- 读写速度快
(channel和sink中间有take事务)
通过这两个事务,flume提高了数据传输的完整性和准确性
kafka sink--能够将数据推送到kafka下消息队列。---hdfs
kafka是一个消息队列
topic ---- 消息存放的目录即主题 producer 生产消息到topic的一方
consumer ---- 订阅topic消费消息的一方 broker kafka的服务实例就是一个broker
Kafka中发布订阅的对象是topic。我们可以为每类数据创建一个topic,把向topic发布消息的客户端称作producer
从topic订阅消息的客户端称作consumer。Producers和consumers可以同时从多个topic读写数据
一个kafka集群由一个或多个broker服务器组成,它负责持久化和备份具体的kafka消息。
解耦--异步--削峰
引入消息队列后, 系统A产生的数据直接发送到消息队列中, 哪个系统需要系统A的数据就直接去消息队列中消费, 这样系统A就和其他系统彻底解耦了
引入消息队列后, 系统A将消息发送到消息队列中就可以直接返回, 接口总共耗时很短, 用户体验非常棒
在高并发场景下(比如秒杀活动)某一刻的并发量会非常高, 如果这些请求全部到达MySQL, 会导致MySQL崩溃,
这时我们需要引入消息队列, 先将请求积压到消息队列中, 让MySQL正常处理.
Kafka是一个分布式的消息队列, 一个topic有多个partition, 每个partition分布在不同的节点上
Kafka还可以为partition配置副本机制, 一个主副本对外提供服务, 多个从副本提供冷备功能(即只起备份作用, 不提供读写).
导致消息重复的原因:分区重平衡--消费者重启或宕机 都会导致消费者消费消息后没有提交offset
业务手段来解决, 比如我们在消费前先查询数据库, 判断是否已消费(status = 1), 或消费后在Redis中做个记录,
下次消费前先从Redis中判断是否已消费.
导致消息丢失的原因:kafka没有保存消息 消费者还没消费就提交offset。然后消费者重启或宕机。
配置partition副本机制 关闭自动提交offset,改为手动提交
先消费,消费成功后在手动提交offset
kafka只保证单个分区内的消息有序,所以保证消息的顺序性,只能一个topic。一个partition,一个consumer。
原因:消费端出了问题,导致无法消费或消费极慢
紧急扩容---批量重导
针对生产者,我们的ack设置1,leader收到了,就回应生产者offset,
还可以设置0,这个很容易丢数据,设置-1的话,也可以,leader和follower都收到数据,才返回消息。
基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能
本质是:将HQL转化成MapReduce程序
Hive处理的数据存储在HDFS Hive分析数据底层的实现是MapReduce 执行程序运行在Yarn上
Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高
Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
hive架构:
用户接口:元数据(metastore) client (jdbc clt) 驱动器(dirver) hadoop
行转列
行专列常用的几种方式有
collect_list
collect_set
列转行
explode
常与split连用
date_add(str,n)、date_sub(str,n) 加减时间
next_day(to_date(str),’MO’) 周指标相关,获取str下周一日期
date_format(str,’yyyy’) 根据格式整理日期
last_day(to_date(str)) 求当月最后一天日期
collect_set(col) 收集数据返回一个以逗号分割的字符串数组
get_json_object(jsondata,’$.object’) 解析json,使用'$. object’获取对象值
NVL(str,replace) 空字段赋值,str为空返回replace值;两个都为空则返回null
UDF:用户定义(普通)函数,只对单行数值产生作用;
继承UDF类,添加方法 evaluate() 解析公共字段
节假日订单和普通日订单 的区别
继承UDF类,重写evaluate方法
UDAF:用户定义聚合函数,可对多行数据产生作用;
等同与SQL中常用的SUM(),AVG(),也是聚合函数
UDTF:用户定义表生成函数,用来解决输入一行输出多行;
内部表:内部表直接创建,不需要加关键字。
删除内部表会直接删除元数据(metadata)及存储数据;
外部表:外部表的创建需要加上external关键字修饰,可以通过location指定hive仓库的路径。
删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除
hive优化 sql语句优化:分区 ,谓词下推 ,列裁剪
尽量尽早地过滤数据 减少每个阶段的数据量,对于分区表要加分区,同时只选择需要使用到的字段。
存储格式:
orc
map数
当input的文件都很大,任务逻辑复杂,map执行非常慢的时候,可以考虑增加Map数,
来使得每个map处理的数据量减少,从而提高任务的执行效率
1.动态分区插入数据,产生大量的小文件,从而导致map数量剧增。
2.reduce数量越多,小文件也越多(reduce的个数和输出文件是对应的)。
3.数据源本身就包含大量的小文件。
.使用Sequencefile作为表存储格式,不要用textfile,在一定程度上可以减少小文件
怎样解决?对于已有的小文件,我们可以通过以下几种方案解决:
1..减少reduce的数量(可以使用参数进行控制)
2.少用动态分区,用时记得按distribute by分区
3.使用hadoop archive命令把小文件进行归档
4.重建表,建表时减少reduce数量
5.通过参数进行调节,设置map/reduce端的相关参数
星形模式(Star Schema)是最常用的维度建模方式。星型模式是以事实表为中心,所有的维度表直接连接在事实表上,像星星一样。星形模式的维度建模由一个事实表和一组维表成,且具有以下特点:
a. 维表只和事实表关联,维表之间没有关联;
b. 每个维表主键为单列,且该主键放置在事实表中,作为两边连接的外键;
c. 以事实表为核心,维表围绕核心呈星形分布。
Hive支持三种不同的元存储服务器,分别为:内嵌式元存储服务器、本地元存储服务器、远程元存储服务器,每种存储方式使用不同的配置参数。
内嵌式元存储主要用于单元测试,在该模式下每次只有一个进程可以连接到元存储,Derby是内嵌式元存储的默认数据库。
在本地模式下,每个Hive客户端都会打开到数据存储的连接并在该连接上请求SQL查询。
在远程模式下,所有的Hive客户端都将打开一个到元数据服务器的连接,该服务器依次查询元数据,元数据服务器和客户端之间使用Thrift协议通信
Impala采用与商用并行关系数据库类似的分布式查询引擎,可直接从HDFS、HBase中用SQL语句查询数据,
不需把SQL语句转换成MR任务,降低延迟,可很好地满足实时查询需求。
Impala不能替换Hive,可提供一个统一的平台用于实时查询。
Impala的运行依赖于Hive的元数据(Metastore)
Impala和Hive采用相同的SQL语法、ODBC驱动程序和用户接口,可统一部署Hive和Impala等分析工具,同时支持批处理和实时查询。
是一种通用的大数据计算框架,基于内存进行
计算
spark sql spark streaming spark rdd
计算速度快(rdd内存计算) (基于dag的任务编排 ) (比mapreduce快100倍)
易于使用(丰富的算子) (支持多种语言)
通用的大数据解决方案 (spark批处理) (spark sql)(spark streaming流处理)
丰富的生态圈 (支持多种数据类型)(机器学习)(图计算)
sparkcore --spark基础配置 存储系统(内存,磁盘) 计算层
sparksql ---基于sql的数据处理方法,
sparkstreaming---对流数据的处理,支持流数据的可伸缩和容错处理。可以和flume与kafka等建立的数据源集成。
local 本地模式 用于本地开发测试
on yarn 集群模式 在yarn资源管理器框架上运行。由yarn负责资源管理。spark负责任务调度和计算
集群管理节点cluster manager:集群管理器,它存在于Master进程中,主要用来对应用程序申请的资源进行管理,根据其部署模式的不同,可以分为local,standalone,yarn,mesos等模式。
工作节点worker:spark的工作节点,用于执行任务的提交
执行器executor:是真正执行计算任务的组件,它是application运行在worker上的一个进程。
这个进程负责Task的运行,它能够将数据保存在内存或磁盘存储中,也能够将结果数据返回给Driver。
驱动器driver:驱动器节点,它是一个运行Application中main函数并创建SparkContext的进程
应用程序application 五部分组成
RDD:转换算子 Transformation和 执行(action)算子
spark应用程序以进程集合为单位在分布式集群上运行,通过driver程序的main方法创建sparkContext的对象与集群进行交互。具体运行流程如下:
sparkContext向cluster Manager申请CPU,内存等计算资源。
cluster Manager分配应用程序执行所需要的资源,在worker节点创建executor。
sparkContext将程序代码和task任务发送到executor上进行执行,代码可以是编译成的jar包或者python文件等。接着sparkContext会收集结果到Driver端。
为了能够和HDFS系统之外的数据库系统进行数据交互,MapReduce程序需要使用外部API来访问数据,因此我们需要用到Sqoop。
关系型数据库(mysql,oracle)----sqoop--hadoop(hdfs,hive,hbase)