一、线下处理
1.离线处理方案
数据支持:HDFS
调度:YARN
收入:Flume,sqoop,loader
处理:Mapreduce,SparkSql,spark,hive(,Flink)
2.Hadoop
Namenode(metadata),client(备份block),datanode(blocks结构)
core-site.xml
3.Hive
数仓软件,分布式数据管理查询
特性:
ETL/支持mapreduce,spark/直接访问HDFS和HBase/易用
内部表和外部表
UDF/UFAF/UDTF
UDF开发步骤:继承UDF,实现evaluate(),上传打包HDFS,Hive创建临时函数,调用
调优:数据倾斜:group by, distinct count,join
调优:map中聚合,负载均衡,并行,大小表mem加载
数据集市和仓库的区别
HIVE数仓分层(ODS,DWD,DWS,ADS)
分层优点:简化问题,减少从父开发,隔离原始数据
4.sparkSQL
基于内存的分布式批处理系统,它把任务拆分,然后分配到多个的CPU上进
行处理,处理数据时产生的中间产物(计算结果)存放在内存中
应用场景:数据处理,迭代计算,数据挖掘,流处理,查询分析
血统机制(checkpoint)
RDD(分布式弹性数据集)(来源:RDD,数据集合转化,HDFS或其他Hadoop存储系统)
Shuffle(洗牌)
窄依赖跟宽依赖
Transformation懒操作(算子),包括map(func),flatMap(func)
Action是RDD的算子
参数优先级 :代码配置>动态参数>配置文件
SparkSession封装SparkContext(包含sparkconf)
SQL语句(SparkSQL解析为RDD执行计划)SparkCore执行
Sparksession集群运行,JDBCServer单点运行
Dataset由特定域的对象组成的强类型集合
Catalyst逻辑执行计划表示,并且数据以编码的二进制形式存储
SparkSQL:
不适合实时查询
5、sqoop
用于在Hadoop(Hive)与传统的数据库(MySQL )间进行数据的传递
Sqoop Import原理(入HDFS):
根据不同的split-by参数值来进行切分,然后将切分出来的区域分配到不同map中
每个map中再处理数据库中获取的一行一行的值,写入到HDFS中
Sqoop export 原理:
导出表的schema、meta信息,和Hadoop中的字段match
将Hadoop 上文件划分成若干个分片,每个分片由一个Map Task进行数据导入。
6.Loader
可视化向导式的作业配置管理界面
调度任务,周期性执行
多种不同的数据源、配置数据的清洗和转换步骤、配置集群存储系统等
特点:可视化,可靠性(失败重试,不残留数据),高性能,安全
二、即使检索
1.需求:检索性能,数据量大,高并发,结构化和非结构化,高效,图检索
2.方案:
加载:Loader\Spark\Spark Streaming
处理:HBase
检索:GES,ElasticSearch
3.HBase
分布式的NoSQL数据库,其特点高可靠、高性能、面向列、可伸缩
+HDFS+Zookeeper
能够同时处理结构化和非结构化的数据
高效的随机读取
架构:HMaster,HRegionServer(HLog,Hserver(store(memstore,storefile(Hfile)))),Client
缓存:
MemStore和BlockCache
MemStore(写):HBase数据先写入HLog 之中,并同时写入MemStore,待满足一定条件后将MemStore中数据刷到磁盘
BlockCache(读):HBase会将一次文件查找的Block块缓存到Cache中,以便后续同一请求或者相邻数据查找请求,可以直接从内存中获取
BloomFilter:快速的判断一条数据在一个大的数据集合中是否存在
HBase的BloomFilter的相关数据,被保存在HFile中
Phoenix
过滤器 Filter,get/put
优化:Region预设(之后一般不能改,否则数据迁移),RowKey(短),Column family(少),maxversion(可自定义,默认无上限),TTL(默认没有),Table(合理使用WAL,设置write buffer),批量读写,scan(限制行,conf设置缓存,setCaching配置)
不适合存视频
4.Elastic Search
分布式的Restful风格的搜索和数据分析引擎,也可以作为NoSQL数据库使用。支持结构化和非结构化数据。清洗、分词、建立倒排索引等一系列操作,然后提供全文检索的能力
边写边读
检索条件多样化
ELKB(Elasticsearch(持久化与分析)logstach,beats(数据接入),kibana(用户接入))
架构:zookeeper,cluster(esmaster,esnode*n),client
核心概念: index,type,document,mapping
*三种缓存:
Query cache:
一种存储先前查询结果的机制,以便在后续请求中重用这些结果。
Feild cache:
针对文档型数据库或搜索引擎中字段值的缓存机制。
Request cache:
网络请求或服务请求中,用于缓存已处理请求的结果
倒排索引
客户端curl命令
ElasticSearch SQL
Java API(TransportClient)(RestClient)
优化:
索引一旦创建好后,就无法调整分片的数量
分片数不超过节点数的3倍,用较少的分片获得更佳的性能
副本数建议设置为1
分片最大容量不要超过ElasticSearch推荐的最大JVM堆空间32G
ElasticSearch 中**文档(document)**是可以被索引的基本单位。
5.GES
基于HBase和ElasticSearch的分布式图数据库,将数据构建成属性图模型进行存储,提供强大的图查询、分析、遍历能力
Rest接口
Gremlin图遍历功能
架构:
存储层:分布式,KV存储,模糊搜索
计算层:后端存储和索引适配,数据管理,元数据管理
接口层:RESTful,Gremlin图交互式查询语言接口
vertex:对象 vertex label:类
edge:联系(只有单向,双向连两条,没有无向) edge label:关系类型
property:属性(kv) property key:属性类型
6.Gremlin
图遍历语言,对复杂的属性图(property graph)的遍历或查询
客户端和 Java API 调用
Gremlin底层数据存储位置:Elastic Search,HDFS,Hbase
三、数据实时处理
价值会随着时间的推移而迅速减少
1.Flume
Flume是一个分布式、高可靠和高可用的海量日志采集、聚合与传输的系统,支持在系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方 (可定制) 的能力。
功能:
固定目录采集数据到目的地(HDFS,HBase,Kafka)
实时采集日志(tailer)
级联(多个Flume对接)
Event(Header(event属性)(kv),Body(数据)(Byte array))
Source(接受 or 产生event,批量放进channels)
驱动形source:外部主动传给flume
轮询source:Flume周期性获取
至少关联一个channel
channel 作用类似队列,用于临时缓存进来的events,当Sink成功地将events发送到下一跳的Channel或最终目的,events从Channel移除
不同channel水平不一样:
Memory Channel:不会持久化 ,内存中,宕机丢失
File Channel:基于WAL (预写式日志Write-Ahead Log) 实现。需要配置checkpoint目录
JDBC Channel:基于嵌入式Database实现,内置数据库
提供较弱的顺序保证,可以连接任何数量的Source和Sink
sink将events传输到下一跳或最终目的,成功完成后将events从Channel移除
必须作用于一个确切的Channel
Source Interceptors
Channel Selectors
Replicating Channel Selector (default):将source过来的events发往所有channel;
Multiplexing Channel Selector:Multiplexing selector会根据event中某个header对应的value来将event发往不同的channel
Sink Processor
Default是默认类型,不需要配置Sink groups;
Failover是故障转移机制;
Load balance是负载均衡机制。后两个需要定义Sink groups
可以通过定义多个Sink组成一个Sink Group
2.kafka
Kafka是一个高吞吐、分布式、基于发布订阅的消息系统。一个分布式的、可划分的、多订阅者、冗余备份的持久性的日志服务。它主要用于处理活跃的流式数据。(不支持随机读取,而是顺序读取)
组成:producer,consumer,broker(topic partitionn),zookeeper
Broker会将消息暂时buffer起来,当消息的个数达到一定阀值时,再flush到磁盘
一旦Broker宕机,该Broker的消息将都不可用
不保存订阅者的状态
消息保存一定时间(通常为7天)后会被删除
志的清理方式有两种:delete(全删了)(默认)和compact(多条相同key边一条)。
一个Group内的Consumer只能消费不同的partition
不同的Consumer Group之间独立订阅
3.Flink
批处理和流处理结合的统一计算框架,其核心是一个提供了数据分发以及并行化计算的流数据处理引擎,对无界和有界数据流进行状态计算
Flink 架构的设计允许任务在整个集群中并行执行,并在多个节点上存储作业状态和数据,从而降低了单点故障的风险。
优点:容错/延迟下也可得到好结果/大规模高吞吐低延迟
场景:可靠/低延迟/高并发
关键概念:
事件驱动
事件语义:通过事件时间来确定事件创建的时间,并能够结合处理时间进行事件解析
有状态流处理:通过保持现有的计算状态以及依赖关系来进行长期的流式数据计算任务
快照:通过Checkpoint
无界流:无界流的数据必须持续处理,即数据被读取后需要立刻处理。
有界流:有界流可以在读取所有数据后再进行计算。有界流所有数据可以被排序,所以并不需要有序摄取。有界流处理通常被称为批处理。
处理模式类型:
事件事件:小时的时间窗处理将会包含事件时间在该小时内的所有事件,而忽略事件到达的时间和到达的顺序
处理时间:当前机器处理该条事件的时间
Flink窗口:
基于时间:滚动时间窗口、滑动时间窗口、会话窗口
基于数据:滚动计数窗口、滑动计数窗口
滚动窗口(tumbling window)
滑动窗口(sliding window)
会话窗口(session window)
全局窗口(global window)
窗口函数
增量聚合函数(incremental aggregation functions)来一个处理一个
全窗口函数(full window functions)计算时遍历,平时收集
容错机制checkpoint:
保证数据仅被处理一次 (Exactly Once)。另外,也可以选择至少处理一次(At Least Once)
Flink应用程序:
environment->data source->transformations->data sink
Flink 的 DataStream:
代表了一个连续的数据流,并允许开发者对这个流进行转换、操作和计算。
Spark Streaming 中的 DataStream 是通过微批处理(micro-batching)实现的,即将一段时间内的数据收集起来,形成一个小的数据批次,然后对这个批次数据进行处理。它不是针对真正的无限流式数据处理,而是将流数据拆分成一小块一小块进行批处理。
处理:Source
来源:集合中读取/队列读取/文件读取/自定义数据读取
算子:
keyedStrean:逻辑地将一个流拆分成不相交的分区,每个分区包含具有相同key的元素,在内部以hash的形式实现的
滚动聚合算子(Rolling Aggregation):sum/min/max/minBy/maxBy
输出:sink
Flink 程序通常由以下几个主要部分组成:source,transformation,sink,environment setup,job control and Scheduling
4.Structured Streaming
Structured Streaming是构建在Spark SQL引擎上的流式数据处理引擎,使用Scala编写,具有容错功能
微批处理模型(默认)和持续处理模型(牺牲一致性,低延迟下丢失数据)
流式的数据看成一张不断增加的数据库表
可以把静态数据库表的一些查询操作应用在流式计算中
每一条查询的操作都会产生一个结果集Result Table。每一个触发间隔(比如说1秒),当新的数据新增到表中,都会最终更新Result Table。无论何时结果集发生了更新,都能将变化的结果写入一个外部的存储系统(OutPut)
三种Output:
Complete Mode:整个更新的结果集都会写入外部存储
Append Mode:当时间间隔触发时,只有在Result Table中 新增加的数据行会被写入到外部存储。
Update Mode:当时间间隔触发时,只有在Result Table中 被更新*的数据才会被写入到外部存储系统
处理时间(机器的系统)和事件事件(进入Structured Streaming的时间)
5.Redis
一个高性能key-value内存数据库,支持在服务器端计算集合的并、交和补集等,还支持多种排序功能
架构:
无中心自组织的结构,gossip
各节点维护Key->Server的映射关系
不转发,重定向,直到正确
基础数据类型:
String, Hash,list,Set,Sorted Set
生存时间,到时间自动删除
pipeline快速插入数据(无命令行,只有java api)
持久化:
RDB(Redis Database)(save time frequency)当符合一定条件时Redis会自动将内存中的所有数据执行快照操作并存储到硬盘上,默认存储在dump.rdb文件中
AOF(Append only file)通过日志文件的方式(默认关闭)(和RDB双开时自动AOF)