WebSocket
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。
现在,很多网站为了实现推送技术,所用的技术都是 Ajax 轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。
HTML5 定义的 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。
初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处?
答案很简单,因为 HTTP 协议有一个缺陷:通信只能由客户端发起,HTTP 协议做不到服务器主动向客户端推送信息。
cap原则
...
Hbase和Hive的区别
Hive和Hbase是两种基于Hadoop的不同技术–Hive是一种类SQL的引擎,并且运行MapReduce任务,Hbase是一种在Hadoop之上的NoSQL 的Key/vale数据库。当然,这两种工具是可以同时使用的。就像用Google来搜索,用FaceBook进行社交一样.
Hive适合用来对一段时间内的数据进行分析查询,例如,用来计算趋势或者网站的日志。Hive不应该用来进行实时的查询。因为它需要很长时间才可以返回结果。
Hbase非常适合用来进行大数据的实时查询。Facebook用Hbase进行消息和实时的分析。它也可以用来统计Facebook的连接数。
为了运行Hbase,Zookeeper是必须的,zookeeper是一个用来进行分布式协调的服务,这些服务包括配置服务,维护元信息和命名空间服务。
Hbase支持增删改查,Hive只支持导入和查询
Hbase只需要预先定义列族,不需要具体到列可以动态修改,Hive需要预先定义表格
Hive与Hbase的数据一般都存储在HDFS上。Hadoop HDFS为他们提供了高可靠性的底层存储支持。
ETL都有些什么
线程池
消费者压缩
redis的发布与订阅
hashset底层实现
springcloud和dubbo的区别
说下docker
说下k8s
开发前后端协同开发,前后端bug交互问题
session共享
String类能否被继承?
不能被继承,因为String类有final修饰符,而final修饰的类是不能被继承的。
final修饰符可以修饰什么?
final是Java关键字 final所标记的成分具有终态的特征,表示最终的意思
Java中final修饰符既可以修饰类、方法,也可以修饰变量
用final修饰的类不能被继承
用final修饰的方法不可重写
用final修饰的变量最多只能赋值一次 值不可变
Hbase基于列存储有什么好处?跟行存储的数据结构比较有什么好处?
1)行存储的写入是一次性完成,消耗的时间比列存储少,并且能够保证数据的完整性,缺点是数据读取过程中会产生冗余数据,如果只有少量数据,此影响可以忽略;数量大可能会影响到数据的处理效率。
2)列存储在写入效率、保证数据完整性上都不如行存储,它的优势是在读取过程,不会产生冗余数据,这对数据完整性要求不高的大数据处理领域,比如互联网,犹为重要。
Hbase的底层数据结构
Hbase的实现是用了一种LSM 树的结构!
LSM树是由B+树改进
Hbase存储数据的几种方式
单条put
最简单基础的写入hbase,一般应用场景是线上业务运行时,记录单条插入,如报文记录,处理记录,写入后htable对象即释放。每次提交就是一次rpc请求。
批量put
有了单条的put自然就想到这种方式其实是低效的,每次只能提交一条记录,有没有上面方法可以一次提交多条记录呢?减少请求次数, 最简单的方式使用List<Put>,这种方式操作时和单条put没有区别,将put对象add到list中,然后调用put(List<Put>)方法,过程和单条put基本一致,应用场景一般在数据量稍多的环境下,通过批量提交减少请求次数
使用Mapreduce
以上两种方式一般用来处理小批量的数据,那么在面对数据量多的时候应该如何处理呢,常见的做法使用多线程来并行向hbase中写入,不过这需要我们自己来控制任务的划分,比较麻烦,另外值得注意的时HTable对象是线程不安全的,因此在多线程写入时需要格外注意。而更加常见的做法是使用Mapreduce。HBase本身就是运行在hdfs上的数据库,因此和Mapreduce有很好的融合。
使用mapreduce来向hbase中写入数据时,将输入文件拆分成一个个的块,然后交给集群,分布式的去读取块,然后数据写入到hbase中,而根据具体业务情况的不同,在使用Mapreduce中也有略微的不同,先介绍一下最常见的处理过程,使用hbase官方提供的hbase和mapreduce整合的工具类TableMapReduceUtil,具体使用细节可以参考HBase官方手册 这里只贴一下在map端读入数据,然后直接写hbase的情景,这种方式一般用于hive或者文件数据入hbase,不需要业务逻辑处理,保持原有的数据入库,rowkey一般时某个字段或者若干个字段拼接而成,比如卡号信息入库,使用卡号作为rowkey(需要对卡号做散列处理,卡号一般为62或者40开头,会造成数据热点问题)
bulkload
如果在写入hbase的上述的方式还是不能满足需求的话,就可以考虑使用bulkload的方式了。上述几种方式虽然实现的方式涉及到的东西不同,但是本质是一样的,都是使用HTable对象调用put方法,然后HTable通过rpc提交到reginserver上,然后通过LSM过程之后最终写入到磁盘上。HBase的数据最终会变成hfile文件落到磁盘上,那么有没有一种方式可以绕过前面的这些过程,直接生成最终的hfile文件呢。答案是有的,bulkload写入hbase的原理正是基于此。使用mapreduce来生成hbase的hfile文件,然后将文件塞到hbase存储数据的目录下,这样做可以减少了海量的数据请求时间,也完全避免了regionserver的处理数据的压力。由于涉及到hbase存储架构的原理,只大概讲一下过程,在map端生成put对象,reduce使用hbase提供的KeyValueSortReducer即可,reduce端会将数据按照rowkey做排序,生成hfile文件,然后按照region的分布对hfile做分割,将分割的hfile文件放到相应的region目录下
git/svn
git:全量数据
svn:增量数据
Sqoop 数据抽取—优化
sqoop作为一个跨平台抽取和输出数据的工具,在关系型数据库(oralce,mysql等)和大数据平台之间常用。而目前的项目使用的hadoop平台,上游数据库是Oracle。
作为ETL的一环,加载作业的性能也是需要关注和优化的。如果使用Sqoop命令,则可以从以下几点进行优化:
1.允许并行抽数:
-m n:这个参数代表的是允许n个MapReduce任务运行抽数据。对于大表,n>1是最好的,同时需要设定 -split by的字段和表达式(注,只能用单个字段或表达式)。split by 的字段代表了按哪个字段的值来划分并行区间。
但是这样有个隐患,就是当所选字段或表达式的值分布不均时候(有1条记录值为A, 1000条记录值为B),会造成数据倾斜且性能无提升(hadoop中,一个作业的所有MP任务完成后,这作业才会结束)。所以还需要对split 字段或表达式的数据分布进行价差。看到很多篇说可以使用PK字段,但是个人发现PK字段的值也有分布不均的,其他非PK字段也可以使用。例如一个工厂的原料采购数据,可以使用采购年份进行并行,因为每年的采购数据量相差不大。
2. 在源数据中过滤不必要的记录和字段: 可以在上游数据库中建立物化视图或者表,过滤掉不需要的记录和字段,减少耗时。
3. 在上游数据库增加缓存:在并行抽数时,如果无数据倾斜发生,则需要检查上游数据库的缓存空间的大小。增加缓存,能够减少sqoop命令的运行时长。
HTable和HTablePool的区别
在使用HTable时需要注意:
1.创建HTable对象耗时较高,耗时较高的主要原因是hBase客户端在创建好HTable对象后会进行一些列的校验,包括表 是否存在,是否有效等等;
2.在构造多个HTable对象时,hBase推荐多个HTable对象共享Configuration,这样,HTable之间便可共享 HConnection对象,zookeeper信息以及Region地址的缓存信息;
3. HTable线程不安全,在多线程的场景下,线程一定不能共用HTable,一定要给每一个线程都创建一个HTable。
HTable的这些问题,HTablePool可以解决,它为HBase集群提供了客户端连接池。
HTablePool
跟ThreadPoolExecutor一样:
1. HTablePool屏蔽了HTable创建过程,避免了多线程间数据并发修改问题;
2. 维护固定数量的HTable对象,能够在程序运行期间复用这些HTable资源对象,减少了不断创建HTable对象带来的性能消耗;
3. HTablePool中的HTable对象之间是公用Configuration连接的,能够可以减少网络开销。
注:HTablePool是hBase连接池的老用法,该类在0.94、0.95和0.96版本中已不建议使用,并且在0.98.1版本以后已移除。本文选择HTablePool方案也是因为项目使用的hBase客户端版本较低。至于为什么要废弃掉HTablePool将会在后文做详细分析~
准确而言不是被弃用 是不建议client用 都成了developers api所有client端被弃用的api都有相对应的interface 用那个就好这样做的好处是 将具体实现隔离 留给开发者更大的开发空间 以后随意抽换更好的实现 而不影响client端代码说白了就是bridge pattern
MapReduce调优
# 一、调优的目的
充分的利用机器的性能,更快的完成mr程序的计算任务。甚至是在有限的机器条件下,能够支持运行足够多的mr程序。
# 二、调优的总体概述
从mr程序的内部运行机制,我们可以了解到一个mr程序由mapper和reducer两个阶段组成,
其中mapper阶段包括:
(1)数据的读取、
(2)map处理以及写出操作(排序和合并/sort&merge),
而reducer阶段包含:
(1)对mapper端输出数据的获取、
(2)数据合并(sort&merge)、
(3)reduce处理以及写出操作。
那么在这七个子阶段中,能够进行较大力度的进行调优的就是 map端的输出、reducer端的数据合并以及reducer的个数这三个方面的调优操作。
也就是说虽然性能调优包括cpu、内存、磁盘io以及网络这四个大方面,但是从mr程序的执行流程中,我们可以知道主要有调优的是内存、磁盘io以及网络。在mr程序中调优,主要考虑的就是减少网络传输和减少磁盘IO操作,故本次课程的mr调优主要包括服务器调优、代码调优、mapper调优、reducer调优以及runner调优这五个方面。
# 三、我们可以设置一些配置文件中的参数来实现部分调优功能。
mapreduce调优
1. mapreduce.task.io.sort.factor --->mr程序进行合并排序的时候,打开的文件数量,默认为10个.
2. mapreduce.task.io.sort.mb ---> mr程序进行合并排序操作的时候或者mapper写数据的时候,内存大小,默认100M
3. mapreduce.map.sort.spill.percent ---> mr程序进行flush操作的阀值,默认0.80。
4. mapreduce.reduce.shuffle.parallelcopies --->mr程序reducer copy数据的线程数,默认5。
5. mapreduce.reduce.shuffle.input.buffer.percent --->reduce复制map数据的时候指定的内存堆大小百分比,默认为0.70,适当的增加该值可以减少map数据的磁盘溢出,能够提高系统能。
6. mapreduce.reduce.shuffle.merge.percent --->reduce进行shuffle的时候,用于启动合并输出和磁盘溢写的过程的阀值,默认为0.66。如果允许,适当增大其比例能够减少磁盘溢写次数,提
高系统性能。同mapreduce.reduce.shuffle.input.buffer.percent一起使用。
7. mapreduce.task.timeout --->mr程序的task执行情况汇报过期时间,默认600000(10分钟),设置为0表示不进行该值的判断。
Uber模式也是一种优化:
1、概念:Uber模式是Hadoop2.0中实现的一种针对MR小作业的优化机制。
即如果作业足够小,则所有task在一个jvm(mrappmaster)中完成要比为每个task启动一个container更划算。
2.下面是该机制的相关参数,这些参数均为客户端配置。
在hadoop2.X版本中新增加了Uber模式运行MR
Hadoop中对Uber模式的定义:
1:mapreduce.job.ubertask.enable=true,首先开启Uber模式,默认是false
2:mapreduce.job.ubertask.maxmaps map任务数的阀值 9
mapreduce.job.ubertask.maxreduces reduce任务数的阀值 1
map的数量<=9, reduce<=1
3:所有的输入文件的总长度<=默认的块的大小(128M)
4:mapreduce.map.memory.mb(默认是1024)<=内存需求(内存需求的大小由yarn.app.mapreduce.am.resource.mb来决定,默认1536M)
5:cpu<=yarn.app.mapreduce.am.resource.cpu-vcores(默认1)
6:采用非链式方式运行MR
Uber模式优点:
针对多个小作业,开启uber模式,mapreduce会将所有的task任务放在一个JVM中完成,就需要
ReduceByKey和GroupByKey的区别
reduceByKey用于对每个key对应的多个value进行merge操作,最重要的是它能够在本地先进行merge操作,并且merge操作可以通过函数自定义。
groupByKey也是对每个key进行操作,但只生成一个sequence。需要特别注意“Note”中的话,它告诉我们:如果需要对sequence进行aggregation操作(注意,groupByKey本身不能自定义操作函数),那么,选择reduceByKey/aggregateByKey更好。这是因为groupByKey不能自定义函数,我们需要先用groupByKey生成RDD,然后才能对此RDD通过map进行自定义函数操作。
数据清洗
数据清洗是将重复、多余的数据筛选清除,将缺失的数据补充完整,将错误的数据纠正或者删除,最后整理成为我们可以进一步加工、使用的数据。
所谓的数据清洗,也就是ETL处理,包含抽取Extract、转换Transform、加载load这三大法宝。在大数据挖掘过程中,面对的至少是G级别的数据量,包括用户基本数据、行为数据、交易数据、资金流数据以及第三方的数据等等。选择正确的方式来清洗特征数据极为重要,除了让你能够事半功倍,还至少能够保证在方案上是可行的。
数据清洗的一般步骤:分析数据、缺失值处理、异常值处理、去重处理、噪音数据处理。在大数据生态圈,有很多来源的数据ETL工具,但是对于公司内部来说,稳定性、安全性和成本都是必须考虑的。
对于数据值缺失的处理,通常使用的方法有下面几种:
1、删除缺失值
当样本数很多的时候,并且出现缺失值的样本在整个的样本的比例相对较小,这种情况下,我们可以使用最简单有效的方法处理缺失值的情况。那就是将出现有缺失值的样本直接丢弃。这是一种很常用的策略。
2、均值填补法
根据缺失值的属性相关系数最大的那个属性把数据分成几个组,然后分别计算每个组的均值,把这些均值放入到缺失的数值里面就可以了。
3、热卡填补法
对于一个包含缺失值的变量,热卡填充法的做法是:在数据库中找到一个与它最相似的对象,然后用这个相似对象的值来进行填充。不同的问题可能会选用不同的标准来对相似进行判定。最常见的是使用相关系数矩阵来确定哪个变量(如变量Y)与缺失值所在变量(如变量X)最相关。然后把所有变量按Y的取值大小进行排序。那么变量X的缺失值就可以用排在缺失值前的那个个案的数据来代替了。
还有类似于最近距离决定填补法、回归填补法、多重填补方法、K-最近邻法、有序最近邻法、基于贝叶斯的方法等。
异常值通常被称为“离群点”,对于异常值的处理,通常使用的方法有下面几种:
1、简单的统计分析
拿到数据后可以对数据进行一个简单的描述性统计分析,譬如最大最小值可以用来判断这个变量的取值是否超过了合理的范围,如客户的年龄为-20岁或200岁,显然是不合常理的,为异常值。
2、3∂原则
如果数据服从正态分布,在3∂原则下,异常值为一组测定值中与平均值的偏差超过3倍标准差的值。如果数据服从正态分布,距离平均值3∂之外的值出现的概率为P(|x-u| > 3∂) <= 0.003,属于极个别的小概率事件。如果数据不服从正态分布,也可以用远离平均值的多少倍标准差来描述。
3、箱型图分析
箱型图提供了识别异常值的一个标准:如果一个值小于QL01.5IQR或大于OU-1.5IQR的值,则被称为异常值。QL为下四分位数,表示全部观察值中有四分之一的数据取值比它小;QU为上四分位数,表示全部观察值中有四分之一的数据取值比它大;IQR为四分位数间距,是上四分位数QU与下四分位数QL的差值,包含了全部观察值的一半。箱型图判断异常值的方法以四分位数和四分位距为基础,四分位数具有鲁棒性:25%的数据可以变得任意远并且不会干扰四分位数,所以异常值不能对这个标准施加影响。因此箱型图识别异常值比较客观,在识别异常值时有一定的优越性。
4、基于模型检测
首先建立一个数据模型,异常是那些同模型不能完美拟合的对象;如果模型是簇的集合,则异常是不显著属于任何簇的对象;在使用回归模型时,异常是相对远离预测值的对象
优缺点:1.有坚实的统计学理论基础,当存在充分的数据和所用的检验类型的知识时,这些检验可能非常有效;2.对于多元数据,可用的选择少一些,并且对于高维数据,这些检测可能性很差。
5、基于距离
通常可以在对象之间定义邻近性度量,异常对象是那些远离其他对象的对象
优缺点:1.简单;2.缺点:基于邻近度的方法需要O(m2)时间,大数据集不适用;3.该方法对参数的选择也是敏感的;4.不能处理具有不同密度区域的数据集,因为它使用全局阈值,不能考虑这种密度的变化。
6、基于密度
当一个点的局部密度显著低于它的大部分近邻时才将其分类为离群点。适合非均匀分布的数据。
优缺点:1.给出了对象是离群点的定量度量,并且即使数据具有不同的区域也能够很好的处理;2.与基于距离的方法一样,这些方法必然具有O(m2)的时间复杂度。对于低维数据使用特定的数据结构可以达到O(mlogm);3.参数选择困难。虽然算法通过观察不同的k值,取得最大离群点得分来处理该问题,但是,仍然需要选择这些值的上下界。
7、基于聚类:
基于聚类的离群点:一个对象是基于聚类的离群点,如果该对象不强属于任何簇。离群点对初始聚类的影响:如果通过聚类检测离群点,则由于离群点影响聚类,存在一个问题:结构是否有效。为了处理该问题,可以使用如下方法:对象聚类,删除离群点,对象再次聚类(这个不能保证产生最优结果)。
优缺点:1.基于线性和接近线性复杂度(k均值)的聚类技术来发现离群点可能是高度有效的;2.簇的定义通常是离群点的补,因此可能同时发现簇和离群点;3.产生的离群点集和它们的得分可能非常依赖所用的簇的个数和数据中离群点的存在性;4.聚类算法产生的簇的质量对该算法产生的离群点的质量影响非常大。
噪音,是被测量变量的随机误差或方差。对于噪音的处理,通常有下面的两种方法:
1、分箱法
分箱方法通过考察数据的“近邻”(即,周围的值)来光滑有序数据值。这些有序的值被分布到一些“桶”或箱中。由于分箱方法考察近邻的值,因此它进行局部光滑。
用箱均值光滑:箱中每一个值被箱中的平均值替换。
用箱中位数平滑:箱中的每一个值被箱中的中位数替换。
用箱边界平滑:箱中的最大和最小值同样被视为边界。箱中的每一个值被最近的边界值替换。
一般而言,宽度越大,光滑效果越明显。箱也可以是等宽的,其中每个箱值的区间范围是个常量。分箱也可以作为一种离散化技术使用.
2、回归法
可以用一个函数拟合数据来光滑数据。线性回归涉及找出拟合两个属性(或变量)的“最佳”直线,使得一个属性能够预测另一个。多线性回归是线性回归的扩展,它涉及多于两个属性,并且数据拟合到一个多维面。使用回归,找出适合数据的数学方程式,能够帮助消除噪声。
SparkStreaming的底层
DStream中的RDD