赞
踩
冒泡排序:冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
选择排序:选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
二分查找的前提是数据有序排列。以升序数列为例,首先比较一个元素与数列中间位置的元素的大小,如果比中间位置的元素大,则继续在后半部分的数列中进行二分查找,如果比中间位置的元素小,则在数列的前半部分继续比较,如果相等,则找到了元素的位置。每次比较的数列长度都是上一次比较的数列长度的一半,直到找到相等元素的位置或最终没有找到要找的元素。
① 数据结构不同 ArrayList是动态数组,LinkedList是双向链表;
② 效率不同 ArrayList查询添加快,插入慢;LinkedList查询添加慢,删除插入快(LinkedList是线性的数据存储方式,所以需要移动指针从前往后,依次根据头结点或者是尾节点遍历查询);
③ 自由性不同 ArrayList自由性较低,需要扩容,每次扩容是之前的1.5倍,但是使用比较方便;而LinkedList自由性较高,能够动态的随数据量的变化而变化,但是它不便于使用。
1.线程安全性:Hashtable是线程安全的,而HashMap不是。这是因为Hashtable的方法都是同步的,而HashMap的方法则没有同步。
2.关于null值:HashMap允许key和value均为null,而Hashtable不允许。
3.继承关系:HashMap继承了AbstractMap类,而Hashtable则直接实现了Map接口。
4.初始容量及扩容方式:Hashtable默认初始容量为11,增量为0.75倍;而HashMap默认初始容量为16,增量为2倍。
5.底层数据结构:Hashtable底层采用的是数组+链表的结构,当链表长度大于阈值(8)时,将链表转换为红黑树以提高查找效率。而HashMap底层采用的也是数组+链表(或红黑树)的结构,但没有阈值的概念
hashmap实现原理
什么是hash(哈希或散列)
哈希可以是一种数据结构,也可以是一种函数概念。就是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是哈希值。通过函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。哈希方法中使用的转换函数称为哈希函数,构造出来的结构称为哈希表(Hash Table)(或者称散列表)。
StringBuffer(JDK1.0):可变字符序列、效率低、线程安全
StringBuilder(JDK 5.0):可变字符序列、效率高、线程不安全
在开发中,线程安全问题出现的概率是要小于非安全的,在大多数场景下使用的是StringBuilder
封装 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作,访问
继承 子类拥有父类的所有属性和方法,从而实现了实现代码的复用
多态 父类引用指向子类对象,从而产生多种形态
① 继承Thread类(子类中重写Thread类中的run方法,start方法启动线程调用run方法);
② 实现Runnable接口(子类中重写Runnable接口中的run方法,将Runnable接口的子类对象作为实际参数传递给Thread类的构造器中);
③ 使用Callable和FutureTask实现有返回值的多线程(FutureTask同时实现了Runnable、Future接口,既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值)
定义:程序运行时,在java虚拟机中只存在该类的一个实例对象
饿汉式单例:在该类初始化的时候就创建实例对象,线程是安全的
懒汉式单例:首次使用单例实例的时候创建,之后使用时再判断单例实例是否已创建,如果没有则创建实例。有可能多个线程在同一时间同时调用创建实例的方法,存在线程安全问题
访问修饰符权限大小顺序
public(都可以访问,可修饰所有) -->
protected(同一类、同一包中的类、子类包含不同包中的子类都可以访问,可修饰变量与方法) -->
default(同一类、同一包中的类可以访问,可修饰所有) -->
private(同一类可以访问,可修饰变量与方法)
gc机制(垃圾回收机制):
回收不再使用的内存空间,Java提供一种系统级线程,跟踪存储空间的分配情况,并在JVM空闲时,检查并释放那些可被释放的存储空间。垃圾回收是自动进行的,程序员无法精确控制和干预。
在大数据应用领域,java是非常重要的基础知识,很多大数据框架都是java语言编写的,所以我对于java的基础使用是没有问题的。例如大数据中很常用的Hbase,MR等,都需要使用对应的javaAPI。当然,不仅仅是Java语言,我也经常使用Python或scala进行相关数据分析工作。
jps是jdk提供的一个查看当前java进程的工具,jps 命令类似于 linux 的 ps 命令,但是它只列出系统中所有的 Java 应用程序。 通过 jps 命令可以方便地查看 Java 进程的启动类、传入参数和 Java 虚拟机参数等信息。
① 集群启动,分发脚本
② 数仓与mysql的导⼊导出
③ 数仓层级内部的导⼊
④ Spark任务启动脚本
变量值替换:$变量名 替换为变量的值(区别于$0… 9 ,代表 s h e l l 文件的参数)在正则表达式中, 9,代表shell文件的参数) 在正则表达式中, 9,代表shell文件的参数)在正则表达式中,是行尾的意思,如"a$"代表以a为行尾的行
date + %Y%m%d 或 date + %F 或 $(date + %y%m%d)获取今天时期
date -d yesterday + %Y%m%d 获取昨天时期
date -d -2day + %Y%m%d 获取前天日期
date -d -nday + %Y%m%d 获取n天前的日期
date -d tomorrow + %Y%m%d 获取明天日期
日期函数
get_date 返回当前日期,格式为YYYYMMDD
check_date 检查日期,参数格式YYYYMMDD
get_before_date 返回昨天日期
get_next_date 返回明天日期
get_diffdays 返回两个日期的天数
事务是一种机制、一个操作序列、是一个不可分割的工作逻辑单元,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交。事务存在ACID特点,及原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持久性(Durability)。原子性指一个事务中的多组操作,要么全部成功,要么全部失败。一致性指一个事务执行之前和执行之后数据库都必须处于一致性状态。隔离性指事务在执行过程中,是与外界完全隔离的,即使数据库发生了变更,事务中也获取不到。持久性则是说事务一旦提交,对数据库的变更就会持久化到磁盘,即使数据库发生异常重启,数据也不会丢失。
1.SQL语句和索引的优化
2.数据库表结构的优化
3.系统配置的优化
4.硬件的优化
大数据技术流程中ETL是不可或缺的一步,而MySQL是最常见的ETL工具,所以也经常使用MySQL进行数据同步以及作为结果数据的存放。日常使用的增删改查操作是非常熟练的。
hadoop是一个适合海量数据的分布式存储和分布式计算的平台。
其包含三大组件:
第一hdfs,负责数据的分布式存储,它是主从结构,由一个NameNode和多个DataNode组成。主节点namenode可以存储元数据信息,例如文件名、文件大小、文件权限等,但并不直接存储文件内容。子节点datanode负责存储文件的内容,每个DataNode都会存储一部分数据块。
第二是MapReduce,MapReduce分为三个阶段,分别是Map阶段、Shuffle阶段和Reduce阶段。
Map阶段的主要任务是处理输入数据,进行数据切分,分配Map任务。在Map任务中,输入数据被读入并转换为键值对然后对这些键值对进行指定的操作。在Map阶段之后是Shuffle阶段,Shuffle阶段会对Map任务输出的键值对进行排序、分组和筛选,以便在Reduce阶段进行处理。在Shuffle阶段之后,Reduce任务会接收到按键排序后的键值对,Reduce任务会对每个键的所有键值对进行一些聚合操作,并将结果输出。这个阶段的主要目的是对Map阶段的结果进行汇总和计算。
第三个组件是yarn。YARN是Hadoop集群中的资源管理系统,它也是采用主从结构。主节点是ResourceManager,主要负责集群资源的分配和管理,监控资源的空闲和使用情况,以及监控任务的执行情况。NodeManager是YARN的从节点,主要负责管理当前机器的资源,如CPU、内存等。当NodeManager启动时,会自动向ResourceManager注册,将当前节点上的可用CPU和内存信息注册上去。然后,ResourceManager会将资源分配给NodeManager,NodeManager则负责管理这些分配给它的资源,并运行任务。
用户将编写好的MapReduce程序提交给Master节点。Master节点首先检查输入数据的存在性,然后通过元数据信息计算切片,并将切片的结果上传到HDFS。然后Master节点根据系统中可用的Map节点和Reduce节点,将计算任务分配给这些节点。分配到的Map节点会启动Map任务,读取相应的输入数据,对数据进行映射操作,并生成中间结果。
之后Shuffle阶段会对Map任务输出的键值对进行排序、分组和筛选,最后Reduce节点对每个键的所有键值对进行一些聚合操作,并将结果输出到一个文件中,可以是本地文件系统也可以是HDFS分布式文件系统。
可以在配置参数中设置,也可以在作业提交时,在作业中进行配置。
**读流程:**客户端向nameNode发送请求,nameNode收到请求之后会检查用户权限以及是否有这个文件,如果都符合,则会视情况返回部分或全部的block列表。Client选取排序靠前的DataNode来读取block,如果客户端本身就是DataNode,那么将从本地直接获取数据;读取完一个block都会进行checksum验证,如果读取dataNode时出现错误,客户端会通知元数据节点,然后再从下一个拥有该block副本的dataNode 继续读;最终读取来所有的block会合并成一个完整的最终文件返回给客户端 。
写流程: Client客户端发送上传请求,和元数据节点(nameNode)建立通信,NameNode检查该用户是否有上传权限,以及上传的文件是否在HDFS对应的目录下重名,如果这两者有任意一个不满足,则直接报错,如果两者都满足,则返回给客户端一个可以上传的信息;客户端根据文件的大小进行切分,默认128M一块,切分完成之后给nameNode发送请求询问block块上传到哪些服务器上;nameNode收到请求之后,返回可用的DataNode的地址(根据网络拓扑和机架感知以及副本机制进行文件分配);客户端收到地址之后与dataNode的地址列表建立管道通讯(本质上就是RPC调用,建立pipeline,A收到请求后会继续调用B,B在调用C,将整个pipeline建立完成,逐级返回Client)
客户端向dataNode发送block,直到数据写入成功。
Yarn有三种资源调度的模型,第一是FIFO调度器,把应用按提交的顺序排成单个队列,这是一个先进先出队列,再生产环境下不会使用。第二个是容量调度器,它以队列为单位划分资源,支持多队列,每个队列可设定一定比例的资源最低保证和使用上限,同时保证先进入的任务优先执行;第三个是公平调度器,它也支持多队列,当一个队列的资源有剩余时,可暂时将剩余资源共享给其他队列,保证了每个任务公平享有队列资源。
Apache版本的Hadoop默认的资源调度器是容量调度器,CDH版本的Hadoop默认使用公平调度器。
Yarn的调度器默认只有一个default队列,不能满足生产要求,在实际生产环境下,一般按照业务模块进行多队列的设置,例如登录注册、购物车、业务部门1、业务部门2 的任务分别放入不同的队列中;另外,还可以按照框架进行设置,例如Hive、Spark、Flink等每个框架的任务放入指定队列。
(1)合并小文件:在执行mr任务前将小文件进行合并,大量的小文件会产生大量的map任务;
(2)合理设置map和reduce数:两个都不能设置太少,也不能设置太多。太少,会导致task等待,延长处理时间;太多,会导致 map、reduce任务间竞争资源,造成处理超时等错误。
(3)如果是数据倾斜问题,可以提前在Map端进行combine,减少传输的数据量。但是如果导致数据倾斜的key大量分布在不同的Mapper的时候,这种方法就不是很有效了。这种情况下,可以进行局部聚合加全局聚合或者增加Reducer,提升并行度。
Hive是建立在Hadoop上的数据仓库工具,用于处理和查询大规模数据。hive的元数据存储在MySQL中,数据存储在HDFS中,使用MapReduce作为计算引擎,使用的SQL解析引擎也是MySQL的。
Hive分区是指按照数据表的某列或者某些列分为多个区,相当于一个管理单位,从物理层面看:hive的一个表就是hdfs中的一个目录,分区就是子目录。优点是便于管理、适当的分区在查询的时候可以避免全表扫描,提高查询效率。分区数量太多时,会出现无数据倾斜,但查询依然非常缓慢的问题。分区过多,可能会出现小文件太多,导致切片过多,map任务增加,反而查询会非常慢。
分区针对的是数据的存储路径;分桶针对的是数据文件。
分区提供一个隔离数据和优化查询的便利方式。不过,并非所有的数据集都可形成合理的分区,分桶是将数据集分解成更容易管理的若干部分的另一个技术。
分桶对数据的处理比分区更加的细化,分区针对的时数据的存储路径,分桶针对的是数据文件
分桶是按照hash值进行切分的,相对来说比较公平;分区是按照列的值划分,容易造成数据倾斜
分桶、分区不干扰,分区表可以再划分为分桶表
内部表和外部表的区别在于元数据和原始数据,删除数据时,内部表的元数据和原始数据会全部被删除,而外部表只删除元数据,在生产环境下,绝大多数场景都是创建外部表,自己使用的临时表才会创建内部表。
1、TextFile
默认格式,存储方式为行存储,数据不做压缩,磁盘开销大,数据解析开销大。
2、SequenceFile
SequenceFile是Hadoop API提供的一种二进制文件支持,存储方式为行存储,其具有使用方便、可分割、可压缩的特点。
3、RCFile
存储方式:数据按行分块,每块按列存储。结合了行存储和列存储的优点:
4、ORCFile
存储方式:数据按行分块 每块按照列存储。压缩快、快速列存取。效率比rcfile高,是rcfile的改良版本。
相比TEXTFILE和SEQUENCEFILE,RCFILE由于列式存储方式,数据加载时性能消耗较大,但是具有较好的压缩比和查询响应。数据仓库的特点是一次写入、多次读取,因此,整体来看,RCFILE相比其余两种格式具有较明显的优势。
行转列
① concat()函数把多列聚合成一列,根据聚合后的列进行分组
② 通过collect_set将同组多行数据根据某一字段聚合成一个数组
③ 通过concat_ws对数组进行拆分拼接
列转行
① 用split将需要展开的字段切分成数组,用explode函数将数组展开
② 用lateral view函数对原表的其他字段对展开表进行侧写
在SQL处理中,窗口函数都是最后一步执行,仅位于order by之前
over():指定分析函数工作的数据窗口大小随行变化(跟在聚合函数 [wh2]后面,只对聚合函数有效)
current row 当前行
n preceding 往前n行数据
n following 往后n行数据
unbounded:
unbounded preceding 从前面开始 |————>
unbounded following 直到终点 ————>|
lag(col,n) 往前第n行数据
lead(col,n) 往后第n行数据
都有对数据进行排序的功能
row_number():根据查询结果的顺序计算排序,多用于分页查询
rank():排序相同时序号重复,总序数不变
dense_rank():排序相同时序号重复时,总序数减少
用途:UDF函数解析公共字段,UDTF函数解析事件字段
udf创建的方法和步骤:
程序设计(将处理逻辑封装在代码中==>
打jar包 上传到hive资源库 ==>
创建连接指定jar主类 调用 ==>
调用使用
udf在java中继承的是UDF类,重写evaluate方法;udtf继承⾃GenericUDTF,重写3个⽅法:initialize(⾃定义输出的列名和类型)、process(将结果返回forward(result))、close。
定义udf、udtf的意义:自己埋点Log打印⽇志,查看出错或者数据异常,⽅便调试;有些需求SQL⽆法直接处理,可以使⽤代码辅助解决
hive不是数据库,只是使用方式是很像数据库,hive是一个hadoop的客户端工具,相当于navicat与MySQL的关系。hive是当前大数据领域、离线数仓的数仓主流工具。
① 数据的存储位置
Hive存储在HDFS上,MySQL将数据保存在块设备或者本地文件系统中
② 数据更新
Hive默认不支持update、delete操作,需要开启事务配置
MySQL支持更新删除操作。如果在hive中需要update,可以insert into一个新表select字段if(更 新条件,返回,否则返回) from旧表
③ 执行延迟
Hive执行延迟较高,MySQL的执行延迟较低。但当数据规模大到超过MySQL的处理能力的时候,Hive的并行计算就体现出优势
④ 数据规模
Hive支持很大规模的数据计算,MySQL可以支持的数据规模较小
⑤ SQL语法的区别
hive不支持where后面跟子查询
hive支持建表分区操作,MySQL不支持
hive-sql中select中的维度字段必须出现在group by后面,MySQL语法中可以不用
MySQL没有mapjoin
① mapjoin:一般在join的时,如果不指定MapJoin或者不符合MapJoin的条件,Hive解析器会将Join操作转换成Common Join,在reduce阶段完成join,容易发生数据倾斜。当出现一张很大的表join一张很小的表(一般不超过512M),可以⽤MapJoin把小表全部加载到内存在map端进行join,避免reduce处理。如果是left join,大表在左边(小表可以加载到内存,能够分散到每个节点);right join,大表在右边
② 行列过滤(重点)
列处理:在select中,只拿需要的列,如果有分区,尽量使⽤分区过滤,少⽤select *
行处理:在分区裁剪中,当使用外关联时,如果将副表的过滤条件写在where后面,那么就会先全表关联,之后再过滤。
能过滤的先过滤,再join。
③ 列式存储:使Hive在读数据的时候,可以只查询所需要用到的列
④ 使用分区:避免全表扫描,提高查询效率。面对数据量比较大的表,一般使用日期字段建立分区
⑤ 合理设置Map数量:通过调整mapred.max.split.size(数据的最大分割单元大小)参数调整map数量,减小max可以增大map数,增大max可以减小map数
⑥ 合理设置Reduce数量:reduce数量不是越多越好,过多的启动和初始化reduce会消耗时间和资源(处理大数据量利用合适的reduce数,使单个的reduce任务处理数据量大小更合适);reduce数量越多,产生的小文件也会越多
⑦ 解决小文件
小文件的产生:动态分区插入数据,产生大量小文件,导致map数量剧增;reduce数量越多,小文件会越多
解决方案:
使用CombineHiveInputFormat在Map执行前合并小文件,减少Map数
对hive.merge参数进行配置
开启jvm重用
⑧ 开启map端的combiner,减少reduce拉取的数据量
⑨ 压缩:设置map端输出、中间结果压缩(不完全是解决数据倾斜的问题,但是减少了IO读写和⽹络传输,能提⾼很多效率)
⑩ 解决数据倾斜
本质原因:key分布不均匀,key重复的⽐较多
导火索:group by、join导致笛卡尔积膨胀、distinct去重
现象:单个reduce执行出现长尾现象,发现单个reduce执行完成度一直在99%或者100+%
解决方法:
业务层面进行优化,查看数据源头能否对数据进行过滤,比如key为null的;
优化sql:采⽤ sum() group by 的⽅式替换 count(distinct) 完成计算;
使用mapjoin;
开关配置:开启数据倾斜时负载均衡。
OneData(数据标准化):数据规范定义从业务源头标准化
OneId:从孤岛变化到⾼质量数据进化到⾼价值数据。OneID技术在业务中主要应⽤于消除数据孤岛、提⾼营销触达、精确⼈群圈选以及360°客户特征分析四⼤主要场景
OneService:主题逻辑表屏蔽复杂物理表;屏蔽多种异构数据源
数据仓库(Data Warehouse)是⼀个⾯向主题的、集成的、相对稳定的、反应历史变化的数据集合,⽤于⽀持管理决策。
ODS基础数据层:最接近数据源中数据的⼀层,数据源中的数据,经过抽取、洗净、传输,装⼊本层。本层数据⼤多是按照源头业务系统的分类⽅式⽽分类的
DWD明细数据层:该层⼀般保持和ODS层⼀样的数据粒度,并且提供⼀定的数据质量保证。在该层也会做⼀部分的数据聚合,将相同主题的数据汇集到⼀张表中,提⾼数据的可⽤性
DWS数据汇总层:又称数据集市或数据库宽表。按照业务划分,⽣成字段⽐较多的宽表,⽤于提供后续的业务查询。⼀般该层的数据表会相对⽐较少,⼀张表会涵盖⽐较多的业务内容。⼀般在DWM层先计算出多个⼩的中间表,然后再拼接成⼀张DWS的宽表。由于宽和窄的界限不易界定,也可以去掉DWM这⼀层,只留DWS层。
DIM维表层:主要包含两部分数据。⾼基数维度数据(⼀般是维度表,数据量可能是千万上亿级)、低基数维度数据(⼀般是配置表,⽐如枚举值对应的中⽂含义,或者⽇期维表。数据量可能是个位或千级万级)。
ods层和dw层再hive作为工具的时候,在hive仓库做的,
ads层一般使用关系型数据库做,一般结果数据比较小,放在MySQL或者redis中等;如果结果比较大,一般可以放在hbase中等。
事实表是指存储有实时记录的表,比如系统日志、销售记录等。用来存储主题的主干内容,事实表一般是没有主键的,基本都是外键,一些外键指向维度表。事实表的记录在不断地动态增长,所以表体积通常远远大于其他表。
事实表的三种类型:
事务事实表:也称为原子事实表,描述业务过程,跟踪控件或时间上某点的度量事件,保存的是最原子的数据;
周期快照事实表:是以一个周期为时间间隔,来记录实时,一般周期可以是每天、每周、每月、每年等;
累计快照事实表:用来描述过程开始和技术之间的关键步骤事件,覆盖过程的整个生命周期,通常具有多个日期字段来记录关键时间点;当过程随着生命周期不断变化时,记录也会随着过程的变化而被修改。
维度表:是与事实表相对应的一种表,保存了维度的属性值,可以跟事实表做关联,相当于将事实表上经常重复出现的属性抽取、规范出来用一张表进行管理。常见维表:日期表、地点表
宽表:从字面意思上就是字段比较多的表,很多维度糅杂在一起,没有规范但是放便查询。
拉链表:用于储存历史数据和分析时间维度的数据,就是记录一个事物从开始,一直到当前状态的所有变化的信息。一般用于解决历史版本查询的问题,也可用于解决数值区间问题,查询效率高,占用空间小。
事实表
① 选择业务:明确了业务过程后,根据具体业务需求来选择与维度建模有关的业务过程。(比如淘宝的订单流转的业务过程有四个:创建订单,买家付款,卖家发货,买家确认收货)
② 声明粒度:尽量选择最细级别的原子粒度,以确保事实表的应用具有最大的灵活性
③ 确定维度:完成粒度声明意味着声明了主键,对应的维度组合就可以确定了,应该选择能够清楚描述业务过程的维度信息
④ 确定事实:应该选择与业务过程有关的所有事实,且事实的粒度要与所声明的事实表的粒度⼀致
⑤ 冗余维度:大数据的事实表设计中,冗余尽可能多的维度让下游方便使用,减少连表数量
维度表:
星型模型
星型模型是以⼀个事实表和⼀组维度表组合⽽成,并且以事实表为中⼼,所有的维度表直接与事实表相连。
雪花模型
是对星型模型的扩展,雪花模型的维度表可以拥有其他的维度表,并且维度表与维度表之间是相互关联的,所以雪花模型相⽐星型模型更规范⼀些。但由于雪花模型需要关联多层的维度表,所以性能⽐星型模型要低,⼀般不常⽤。
星座模型
维表是共享状态的,可以被多个事实表关联使⽤,这种模式可以看做星型模式的汇集,所以称作星系模式或者事实星座模式。
数据集成工具:kettle、ogg(oracle专用)、flume(数据采集)
离线同步:datax、sqoop(这两者的区别与联系)、flinkx(离线、实时)
实时同步:canal、flinkx(离线、实时)
增量同步:datax、canal
全量同步:datax
① sqoop采用MR计算框架进行导入导出,而datax只是在运行datax的单台机器上进行数据的抽取与加载,速度慢了很多
② sqoop只可以用来处理关系型数据库和hadoop组件之间的数据迁移,而在hadoop组件之间和关系型数据库之间就无法使用;相反,datax适用于各种异构数据源之间数据同步
③ sqoop是专门为hadoop而生的,对hadoop支持度好,而datax可能会出现不支持高版本hadoop的现象
Flume是一个可分布式日志收集系统,为hadoop相关组件之一。Flume可以收集例如日志,事件等数据资源,并将这些数量庞大的数据从各项数据源中集中起来存储。Flume可以采集文件,socket数据包(网络端口)、文件夹、kafka、mysql数据库等各种形式源数据,又可以将采集到的数据(下沉sink)输出到HDFS、hbase、hive、kafka等众多外部存储系统中。
Flume是一个分布式、可靠、和高可用的海量日志采集、汇聚和传输的系统。Flume针对特殊场景也具备良好的自定义扩展能力,因此,Flume可以适用于大部分的日常数据采集场景。
agent
Flume中最核心的角色是agent,Flume采集系统就是由一个个agent连接起来所形成的一个或简单或复杂的数据传输通道。对于每一个Agent来说,它就是一个独立的守护进程(JVM),它负责从数据源接收数据,并发往下一个目的地。
每一个agent相当于一个数据(被封装成Event对象)传递员,内部有3个核心组件:
Source:采集组件,用于跟数据源对接,以获取数据;它有各种各样的内置实现;
Sink:下沉组件,用于往下一级agent传递数据或者向最终存储系统传递数据;
Channel:传输通道组件,用于从source将数据传递到sink。
channel
FileChannel:数据存储于磁盘,优势:可靠性⾼;劣势:传输速度低。
memory channel:数据存储于内存,优势:传输速度快;劣势:可靠性差。
kafka channel:数据存储于Kafka,基于磁盘,优势:可靠性⾼。
传输速度:
kafka channel > memory channel+kafka sink 原因省去了sink
生产环境下的选择:
如果下⼀级是kafka,优先选择kafka channel;
如果是⾦融、对钱要求准确的公司,选择file channel;
如果就是普通的⽇志,通常可以选择memory channel。
HBase是一个高可靠、高性能、面向列、可伸缩、实时读写的分布式非关系型数据库,是hadoop的数据库。主要用来存储非结构化和半结构化的松散数据。利用HDFS作为文件存储系统,利用MR来处理HBase中的海量数据,利Zookeeper作为分布式协同服务,可以利用多节点搭建起大规模存储集群。高可靠是因为HDFS为HBase提供了高可靠的底层存储支持和Zookeeper为提供了稳定服务和容错机制。高性能是MR为HBase提供了高性能的计算能力。
rowkey的设计遵循三个原则:⻓度原则、散列原则、唯⼀原则
对于HBase⽽⾔,如果想精确地定位到某⾏记录,唯⼀的办法是通过rowkey来查询。如果需要从多个⻆度查询数据,就只能通过设计HBase二级索引来解决这个问题,二级索引本质上是建⽴⾏键与列值的映射关系。
Hash:哈希会使同一行永远用一个前缀加盐。使用确定的哈希可以重构完整的rowkey,用get操作即可准确获取某行数据
时间戳反转:用Long.Max_Value-timestamp追加到key的末尾,按照操作时间倒序排序
加盐:在rowkey的前面增加随机数,使得和之前的随机数不同
① 连接zookeeper查询mate表(mate中保存了数据表region的位置)region的位置
② 连接mate表region所在的regionServer查询数据,根据数据表的表名和rowkey查询数据表region的位置
③ 连接数据表region所在的regionServer读写数据
④ 先在内存中查询数据
⑤ 如果内存中没有再查询磁盘
map,flatMap,flter,Union,join,groupBy,groupByKey,reudceByKey,sortByKey,foreach,foreachPartition
① RDD由一组分区组成,默认一个block块对应一个分区
② 算⼦实际上是作⽤在每⼀个分区上,默认一个分区对应一个task
③ RDD之间有依赖关系,宽依赖和窄依赖,⽤于切分Stage
④ Spark默认是hash分区,分区类的算⼦(groupByKey、reduceByKey)只能作⽤在KV格式的RDD上
⑥ Spark为task的计算提供了最佳的计算位置,移动计算⽽不是移动数据
① reduceByKey会在map端做预聚合,可以减少shuffle过程中传输的数据量,提⾼执⾏效率,groupByKey不能做预聚合
② 在某些业务场景reduceByKey没办法实现,需要使⽤groupByKey
③ 尽量使⽤reduceByKey代替groupByKey
血统(RDD) 是弹性分布式数据集,是Spark中最基本的数据抽象,代表一个不可变、可分区、内部元素可并行计算的集合。
窄依赖 是指子RDD的分区依赖于父RDD的多个分区或所有分区。表现为存在一个父RDD的一个分区对应一个子RDD的多个分区。
宽依赖 是指父RDD的每一个分区最多被一个子RDD的分区所用。表现为一个父RDD的分区对应于一个子RDD的分区或多个父RDD的分区对应于一个子RDD的分区。
Local:运⾏在⼀台机器上,测试使⽤
Standalone:构建⼀个基于Master+Slaves的资源调度集群,Spark任务提交给Master运⾏。是Spark⾃身的⼀个调度系统
On Yarn:Spark客户端直接连接Yarn,不需要额外构建Spark集群。有yarn-client和yarn-cluster两种模式,主要区别在于Driver程序的运⾏节点。yarn-clientDriver在本地启动,在本地可以看到详细⽇志,如果在本地启动太多Spark任务会导致本地⽹卡流量剧增,不适合上线使⽤
代码层面优化
① 避免创建重复的RDD
② 尽可能复⽤同⼀个RDD
③ 对多次使⽤的RDD进⾏持久化
④ 使⽤⾼性能的算⼦:使⽤reduceByKey/aggregateByKey替代groupByKey,使⽤foreachPartitions替代foreach Action
⑤ ⼴播⼤变量
⑥ 将reduce jon转化成map join
参数优化
① executor的数量、核数、内存
② driver的内存
③ spark sql shuffle之后的分区数
④ ⽤于缓存的内存占⽐
⑤ ⽤于shuffle的内存占⽐
⑥ task在executor中执⾏之前的等待时间,默认3秒
⑦ 堆外内存
⑧ spark⽹络连接的超时时间
Flink是⼀个框架和分布式处理引擎,⽤于对⽆界和有界数据流进⾏有状态计算。并且Flink提供了数据分布、容错机制以及资源管理等核⼼功能。
Flink框架主要包括三个核心组件:
JobManager(作业管理器) 是整个集群的协调者,控制一个应用程序执行的主进程,每个应用程序都会被一个不同的JobManager所控制执行。负责接收Flink Job,协调检查点,Failover故障恢复等,同时管理Flink集群中从节点TaskManager。
TaskManager(任务管理器) 是实际负责执⾏计算的Worker,在其上执⾏Flink Job的⼀组Task,每个TaskManager负责管理其所在节点上的资源信息,如内存、磁盘、⽹络,在启动的时候将资源的状态向JobManager汇报。
Client(作业客户端) 是Flink程序提交的客户端,当⽤户提交⼀个Flink程序时,会⾸先创建⼀个Client,该Client⾸先会对⽤户提交的Flink程序进⾏预处理,并提交到Flink集群中处理,所以Client需要从⽤户提交的Flink程序配置中获取JobManager的地址,并建⽴到JobManager的连接,将Flink Job提交给JobManager
窗口(window)就是将无线流切割为有限流的一种方式,它会将流数据分发到有限大小的桶中进行分析
滚动窗口:滚动窗⼝能将数据切分成不重叠的⼤⼩固定的窗口,每一个事件只能属于一个窗口。
滑动窗口:滑动窗口是固定窗口的更广义的一种形式,滑动窗口由固定的窗口长度和滑动间隔组成。滑动窗⼝需要⼀个额外的滑动距离参数来控制⽣成新窗⼝的频率(如设置了⼤⼩为10分钟,滑动距离5分钟的窗⼝,将会在每5分钟得到⼀个新的窗⼝,⾥⾯包含之前10分钟到达的数据)。
会话窗口:会话窗⼝会把数据按活跃的会话分组,在⼀段时间没有收到数据之后会关闭。会话窗⼝不会相互重叠,且没有固定的开始或结束时间。由一系列事件组合指定时间长度的timeout间隙组成,一段时间没有接收到新数据就会生成新的窗口。
全局窗口:全局窗⼝将拥有相同key的所有数据分发到⼀个全局窗⼝。这样的窗⼝只有指定了自己定义的触发器时有⽤,否则计算不会发⽣,因为全局窗⼝没有天然的终点去触发其中积累的数据。
时间(time)和其他流式计算系统的时间⼀样分为三类:事件时间,摄⼊时间,处理时间。
水位线(watermark)是为了处理EventTime窗⼝计算提出的⼀种机制,本质上是⼀种时间戳。⼀般来讲Watermark经常和Window⼀起被⽤来处理乱序事件。⽔位线默认等于最新数据的时间戳,⽔位线只能增⻓不能降低。由于数据在传输的过程中可能会乱序,为了解决乱序问题,可以将⽔位线前移,延迟窗⼝的计算,避免数据丢失。
Flink是标准的实时处理引擎,基于事件驱动,⽽Spark Streaming是微批(MicroBatch)的模型
① 运行中角色不一样:Spark Streaming在运⾏时有Master、Worker、Driver、Executor;Flink在运⾏时有Jobmanager、Taskmanager和Slot。
② 任务调度不同:Spark Streaming连续不断的⽣成微⼩的数据批次,构建有向⽆环图DAG,SparkStreaming会依次创建 DStreamGraph、JobGenerator、JobScheduler。Flink根据⽤户提交的代码⽣成StreamGraph,经过优化⽣成JobGraph,然后提交给JobManager进⾏处理,JobManager会根据JobGraph⽣成ExecutionGraph,ExecutionGraph是Flink调度最核⼼的数据结构,JobManager根据ExecutionGraph对Job进⾏调度。
③ 时间机制不同:Spark Streaming⽀持的时间机制有限,只⽀持处理时间;Flink⽀持了流处理程序在时间上的三个定义:处理时间、事件时间、注⼊时间,同时也⽀持watermark机制来处理滞后数据。
④ 容错机制不同:对于Spark Streaming任务,可以设置checkpoint,假如发⽣故障并重启,可以从上次checkpoint之处恢复,但是这个⾏为只能使得数据不丢失,可能会重复处理,不能做到恰好⼀次处理;Flink则使⽤两阶段提交协议来解决这个问题。
Kafka本身是分布式集群,同时采⽤分区技术,并发度⾼。
顺序写磁盘,Kafka的producer⽣产数据,要写⼊到log⽂件中,写的过程是⼀直追加到⽂件末端,为顺序写。
批量读写
零拷⻉技术
Zookeeper是一个高效的分布式协调服务,可以提供配置信息管理、命名、分布式同步、集群管理、数据库切换等服务。它不适合用来存储大量信息,可以用来存储一些配置、发布与订阅等少量信息。Hadoop、Storm、消息中间件、RPC服务框架、分布式数据库同步系统,这些都是Zookeeper的应用场景。
Zookeeper集群中节点个数一般为奇数个(>=3),若集群中Master挂掉,剩余节点个数在半数以上时,就可以推举新的主节点,继续对外提供服务。
基于云上提供的近乎⽆限计算和存储资源,结合云原⽣数据仓库MaxCompute、实时计算Flink版、交互式分析MC-Hologres以及数据开发与治理DataWorks,打造⼀体化的新⼀代数据仓库架构,同时满⾜离线和实时分析需求。
整合阿⾥云实时计算Flink版+交互式分析MC-Hologres两⼤⻜天⼤数据实时计算+分析引擎利器,实现新⼀代实时分析数据仓库架构。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。