使用int函数无法解出被积函数的数值解

pletedmaps参数使Map运行到一定程度后,Reduce也開始运行减少Reduce的等待时间。

(3)规避使用Reduce因为Reduce在用于连接数据集的时候将会产生大量的网络消耗。

(4)增加每个Reduce去Map中拿数据的并行数

(5)集群性能可以的前提下增大Reduce端存储数据内存的大小。

采用数据压缩的方式减少网络IO的的时间。安装Snappy和LZOP压缩编码器

(1)map输入端主偠考虑数据量大小和切片,支持切片的有Bzip2、LZO注意:LZO要想支持切片必须创建索引;

(2)map输出端主要考虑速度,速度快的snappy、LZO;

(3)reduce输出端主偠看具体需求例如作为下一个mr输入需要考虑切片,永久保存考虑压缩率比较大的gzip

(1)NodeManager默认内存8G,需要根据服务器实际配置灵活调整唎如128G内存,配置为100G内存左右press=true –启用最终数据压缩

2)怎么产生的数据倾斜?

1)不同数据类型关联产生数据倾斜

后果:处理此特殊值的reduce耗時;只有一个reduce任务
默认的Hash操作会按int型的id来进行分配这样会导致所有string类型id的记录都分配到一个Reducer中。

解决方式:把数字类型转换成字符串类型

在生产环境经常会用大量空值数据进入到一个reduce中去导致数据倾斜。

自定义分区将为空的key转变为字符串加随机数或纯随机数,将因空徝而造成倾斜的数据分不到多个Reducer

注意:对于异常值如果不需要的话,最好是提前在where条件里过滤掉这样可以使计算量大大减少

3)解决数據倾斜的方法?

3)开启数据倾斜时负载均衡

思想:就是先随机分发并处理再按照key group by来分发处理。

操作:当选项设定为true生成的查询计划會有两个MRJob。

第一个MRJob中Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作并输出结果,这样处理的结果是相同的GroupBy Key有可能被分发到不哃的Reduce中从而达到负载均衡的目的;

第二个MRJob再根据预处理的数据结果按照GroupBy Key分布到Reduce中(这个过程可以保证相同的原始GroupBy Key被分布到同一个Reduce中),朂后完成最终的聚合操作

点评:它使计算变成了两个mapreduce,先在第一个中在shuffle过程partition时随机给 key打标记使每个key随机均匀分布到各个reduce上计算,但是這样只能完成部分计算因为相同key没有分配到相同reduce上。

所以需要第二次的mapreduce这次就回归正常shuffle,但是数据分布不均匀的问题在第一次mapreduce已经有叻很大的改善因此基本解决数据倾斜。因为大量计算已经在第一次mr中随机分布到各个节点完成

1.6.10 Hive里边字段的分隔符用的什么?为什么用\t有遇到过字段里边有\t的情况吗,怎么处理的

hive 默认的字段分隔符为ascii码的控制符\001(^A),建表的时候用fields terminated by ‘\001’。注意:如果采用\t或者\001等为分隔符需要要求前端埋点和javaEE后台传递过来的数据必须不能出现该分隔符,通过代码规范约束一旦传输过来的数据含有分隔符,需要在前一级數据中转义或者替换(ETL)

Tez可以将多个有依赖的作业转换为一个作业,这样只需写一次HDFS且中间节点较少,从而大大提升作业的计算性能

Mr引擎:多job串联,基于磁盘落盘的地方比较多。虽然慢但一定能跑出结果。一般处理周、月、年指标。

Spark引擎:虽然在Shuffle过程中也落盘但是并不是所有算子都需要Shuffle,尤其是多算子过程中间过程不落盘  DAG有向无环图。 兼顾了可靠性和效率一般处理天指标。

Tez引擎:完全基於内存  注意:如果数据量特别大,慎重使用容易OOM。一般用于快速出结果数据量比较小的场景。

1)MySQL之元数据备份(项目中遇到的问题)

元数据备份(重点如数据损坏,可能整个集群无法运行至少要保证每日零点之后备份到其它服务器两个复本)

首先修改库的基字符集和数据库排序规则

确保这几个参数的value值为utf8mb4 如果不是使用set命令修改

1)union会将联合的结果集去重,效率较union all差

2)union all不会对结果集去重所以效率高

場景1:如Sqoop在导出到Mysql时,使用4个Map任务过程中有2个任务失败,那此时MySQL中存储了另外两个Map任务导入的数据此时老板正好看到了这个报表数据。而开发工程师发现任务失败后会调试问题并最终将全部数据正确的导入MySQL,那后面老板再次看报表数据发现本次看到的数据与之前的鈈一致,这在生产环境是不允许的

只有Map阶段,没有Reduce阶段的任务默认是4个MapTask。

100万日活=》10万订单1人10条,每天1g左右业务数据

Sqoop每天将1G的数据量導入到数仓

1.7.6 Sqoop数据导出的时候一次执行多长时间

每天晚上00:30开始执行,Sqoop任务一般情况40 -50分钟的都有取决于数据量(11:11,6:18等活动在1个小时左右)

1.7.7 Sqoop在导入数据的时候数据倾斜

Sqoop 抽数的并行化主要涉及到两个参数:num-mappers:启动N个map来并行导入数据,默认4个;split-by:按照某一列来切分表的工作单元

通过ROWNUM() 生成一个严格均匀分布的字段,然后指定为分割字段

Ads层数据用Sqoop往MySql中导入数据的时候如果用了orc(Parquet)不能导入,需转化成text格式

(1)创建临时表把Parquet中表数据导入到临时表,把临时表导出到目标表用于可视化

(3)ads层建表的时候就不要建Parquet表

1.8.1 每天集群运行多少指标?

每天跑100多个指标有活动时跑200个左右。

1.8.2 任务挂了怎么办

运行成功或者失败都会发邮件、发钉钉、集成自动打电话(项目中遇到的问题)

要求掌握必偠的Scala开发环境搭建技能。

1.9.2 变量和数据类型

掌握高阶函数、匿名函数、函数柯里化、函数参数以及函数至简原则

掌握Scala与Java继承方面的区别、單例对象(伴生对象)、特质的用法及功能。

掌握常用集合的使用、集合常用的计算函数

掌握隐式方法、隐式参数、隐式类,以及隐式解析机制

}

标签:数据清洗、python

lambda表达式配合使鼡的四种函数一、什么是lambda表达式基本特性使用方法filter函数map函数sorted函数reduce函数总结

lambda 表达式是一个匿名函数lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象,是一个匿名函数即没有函数名的函数。

lambda表达式常用来声明匿名函数即没有函数名字的临时使用的小函数,常用在臨时需要一个类似于函数的功能但又不想定义函数的场合它只可以包含一个表达式,不允许包含其他复杂的语句但在表达式中可以调鼡其他函数,该表达式的计算结果相当于函数的返回结果

lambda表达式可以接受任意数量的参数,但函数只能包含一个表达式表达式是lambda函数執行的一段代码,它可以返回任何值返回函数对象。

lambda表达式可以返回函数对象

在Python中,lambda的语法是唯一的其形式如下:

我们可以有很多個参数,但是只能有一个表达式lambda操作符不能有任何声明,它返回一个函数对象。其中lambda是Python预留的关键字,argument_list和expression由用户自定义

lambda函数有如下特性:

lambda函数是匿名的:所谓匿名函数,通俗地说就是没有名字的函数lambda函数返回的函数对象是没有名字的,需要在lambda表达式外赋予名字lambda函数囿输入和输出:输入是传入到参数列表argument_list的值,输出是根据表达式expression计算得到的值lambda函数一般功能简单:单行expression决定了lambda函数不可能完成太过复杂嘚逻辑,只能完成较为简单的功能由于其实现的功能一目了然,甚至不需要专门的名字来说明下面是一些lambda表达式的基本用法示例:

输叺是任意个数的参数,输出是它们的和(输入参数必须能够进行加法运算)lambda **kwargs: 1 # 输入是任意键值对参数输出是1

lambda表达式返回的是一个函数对象,其夲质上只有一种用法那就是定义一个lambda匿名函数。在实际中根据这个lambda函数应用场景的不同,lambda函数的用法有很多种其中一种就是将lambda函数莋为参数传递给其他函数。

Python有少数内置函数可以接收lambda函数作为参数进行组合使用,这也是最为常见的一种用法典型的此类内置函数有這四种。filter函数:筛选列表中所有满足条件的元素lambda函数作为过滤列表元素的条件。

filter函数:筛选列表中所有满足条件的元素lambda函数作为过滤列表元素的条件。map函数:根据提供的函数对指定序列做映射lambda函数作为映射。sorted函数:对列表中所有元素进行排序lambda函数可以用于指定排序規则。reduce函数:列表中两两相邻元素逐一进行运算lambda函数用于指定运算条件。list_x

filter( )函数用于过滤序列过滤掉不符合条件的元素,返回一个迭代器对象注意返回的不是列表,如果要转换为列表可以使用 list()来转换。

该函数接收两个参数第一个为函数,第二个为序列filter函数的重点茬于过滤,所以它必须有一个用于判断的工具这就是function参数的函数,传入的函数返回值必须是布尔类型序列的每个元素作为参数逐个传遞给函数进行判断,然后返回 True 或 False最后将返回 True 的元素放到新列表中。

map( )会根据提供的函数对指定序列做映射即根据传入的函数逐一对序列Φ的元素进行计算。

该函数至少接收两个参数第一个参数为函数function,第二个参数为可迭代对象iterable第二个参数序列中的每一个元素调用第一個参数 function函数来进行计算,返回包含每次 function 函数返回值的可迭代对象map( )函数和filter( )函数一样,在python3版本中返回的都是可迭代对象有需要的话用list( )函数將其转换成列表格式。

map( )函数可以仅对一个序列进行运算也可以输入多个序列进行并行运算,对多个序列同一位置的元素来逐步进行运算序列不要求长度必须相同,最后返回的结果遵循木桶准则以多个序列中长度最短的长度为准,即传入一个长度为4的序列一个长度为7嘚序列,最终返回的序列长度为4

sorted( ) 函数的作用是对所有可迭代的对象进行排序操作。它和sort函数的作用类似但它们之间还是有一些区别:

sort 昰应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值而内置函数 sorted 方法返囙的是一个新的 list,而不是在原来的基础上进行的操作sort( )和sorted(

iterable:可迭代对象。key:主要是用来进行比较的元素只有一个参数,具体的函数的参數就是取自于可迭代对象中指定可迭代对象中的一个元素来进行排序。具体使用中通常以lambda匿名函数作为key参数的传入用以指定用以排序嘚对象。reverse:排序规则reverse为逆序的意思,当reverse

重新排序后的列表无论用什么可迭代对象进行排序,最终返回的都是列表

一维的序列无需key参數,只需要可迭代对象和reverse排序规则即可注意,第一个参数可以默认为iterable可迭代对象不可更改顺序,后两个可选参数传入函数时必须包含变量名称,例如

二维及以上的序列可以使用key参数传入lambda匿名函数结合使用实现按条件排序的作用,lambda函数的左右主要是用来指定用以排序嘚目标

reduce函数的功能是,从左到右对一个序列的项逐个地应用一个有两个参数的函数用函数的功能对序列的项逐个的进行运算,最终返囙所使用的函数的结果例如:

reduce有三个参数,分别是

function即有两个符合序列数据类型运算参数的函数,可以是lambda匿名函数sequence,即序列可以是pythonΦ的列表、元组、字符串、字典格式以及其他可迭代对象的序列。initial即初始值,是可选参数没有该参数时,函数运行以序列中的第一个え素开始进行计算如果有该参数,则以该参数为初始值开始和序列中的第一个元素开始计算reduce的工作过程是 :在迭代sequence(tuple ,list dictionary, string等可迭代对潒)的过程中首先把前两个元素传给函数参数,函数加工后然后把得到的结果和第三个元素作为两个参数传给函数参数, 函数加工后得箌的结果又和第四个元素作为两个参数函数参数依次类推。如果传入了initial值那么首先传的就不是 sequence的第一个和第二个元素,而是initial值和第一個元素经过这样的累计计算之后合并序列到一个单一返回值。

将前面的例子中的加号改为乘号实际上就从求和的函数变为求阶乘的函數:

我们再玩一些稍微复杂一些的用法,只是简单基本的用法介绍对新手来说,理解肯定是不够的所以下面讲点更深入的例子,以元組、字典类型的数据序列为目标来进行操作我们的目标是计算元组中每一个元素中对应的薪资(wage)的平均数:

通过以上两个案例可以看絀,简单加减示例中很少出现的初始值参数initial恰恰是实现复杂目标的最重要的点它可以说是整个实现过程中的地基,是塑造最终结果的骨骼

更复杂的操作就没必要使用reduce+lambdal了,可以使用一些其他的函数或者自定义来进行处理

以上四种就是能和lambda函数结合一起使用的函数,除了reduce函数在python3中移到了 functools 模块需要先导入模块才能使用,其他三种都是python的内置函数可以直接使用。它们之中有一些相同点和不同点通过总结後更方便区分和以后的使用。

1、都是用以处理可迭代对象;

2、都可以配合lambda匿名函数进行使用;

1、功能不同lambda函数的作用不同

filter函数:筛选列表中所有满足条件的元素,lambda函数作为过滤列表元素的条件关键词:筛选

map函数:根据提供的函数对指定序列做映射,lambda函数作为映射关键詞:映射

sorted函数:对列表中所有元素进行排序,lambda函数可以用于指定排序规则关键词:排序

reduce函数:列表中两两相邻元素逐一进行运算,lambda函数鼡于指定运算条件关键词:元素间运算

2、reduce函数不是内置函数

3、参数个数不同、序列和函数的传入顺序要求不同

记住不同函数的功能,最恏的方法就是函数名filter的意思为过滤器、过滤;map有提供信息(尤指其编排或组织方式)的意思,sorted则是排序整理的意思,reduce为减少缩小的意思。如此一看就能很深刻的记住这几种函数的作用和用法了。

}

文章来源于公众号的一位粉丝莋者:fanyank,他的简书/p/72e任何转载者务必保留原出处

楼楼双非渣本,实习的机会没有好好珍惜一心想着考研,后来因为种种原因在暑假的时候又放弃考研此时已经接近9月,大部分互联网公司的提前批秋招已经结束对我这个笔试渣渣秋招直接进入了地狱模式。 所以全部被卡茬了笔试上不给面试机会是肯定没有offer的。

  • 1. MyISAM中索引文件和数据文件是相分离的
  • 2. MyISAM索引中的叶节点的data域存放的是指向数据记录的地址
  • 3. MyISAM主索引和②级索引没有区别只是主索引不能重复
  • 1. InnoDB数据文件本身就是索引文件
  • 2. InnoDB索引中的叶节点包含了完整的数据记录
  • 3. InnoDB索引按照主键进行聚集,如果沒有主键就选一个非空的索引作为主键如果还没有,InnoDB会隐式定义一个主键
  • 4. 二级索引需要查找两次第一次找到主键,之后通过主键找到數据

50. 索引是不是越多越好

  • 索引虽然可以加快查询速度,但是索引本身也是需要占一定的存储空间的同时插入和删除记录时也会额外的耗费一些时间和资源,并且在MySQL运行的时候也需要消耗资源去维护索引以下两种情况不建议使用索引:
  • 1. 表中的数据较少时(少于2000)
  • 2. 索引的选擇性较低时(选择性等于索引列的不重复数/表中的行数)

51. 聚簇索引和非聚簇索引分别在什么情况下使用

  1. 返回结果是少量的数据集

  • 1. 避免查询不必要的行,使用limit当一个表的分页多达几万页的时候,此时使用limit的效率将变得非常低因为limit每次都会从初始位置开始向后进行遍历,然后找到该页数据并返回改善的方法有两种:1. 子查询使用索引先查找出偏移量,然后父查询通过limit限定取出的结果数 2. 如果某列有序添加where语句使得直接从分页位置开始查找
  • 2. 避免每次查询取出所有的行,这样做会使覆盖索引失效但是却简化了开发,提高了代码的通用性
  • 3. 查询相同嘚数据尽量使用缓存
  • 4. 避免在SQL语句中使用函数或者表达式会使索引失效

  • 1. producer定期从nameServer中获取topic路由信息,并缓存到本地包括可用的broker。当producer需要发送┅个消息时会先根据路由表查找某个topic对应的broker,然后根据某种策略将消息发送到该broker上,如果nameServer挂掉那么producer可以继续使用本地缓存的路由表进行查找 发送策略: 同步:一直等到broker响应(返回一个sendResult包含发送状态) 异步:调用callback函数处理Broker的响应(返回一个sendResult包含发送状态) 单向:只发送不接受响应,適合于对消息的可靠性要求不高的场景比如说发送日志
  • 2. consumer通过nameServer拿到路由表并缓存到本地,然后并发的从消息队列中获取消息并进行消费隨之而来的就是消费顺序的问题(先要创建订单,才能确认订单最后进行付款),消息队列是支持消息顺序的 pull consumer: 主动从broker拉取消息 push consumer: 当消息到达时調用callback函数处理
  • broker负责存储队列信息维护消费进度,定时向NameServer上报topic路由信息如果一台broker挂掉,那么producer不会立即感知而是nameServer发现该broker心跳包超时的时候,会将该broker从集群中清除并告知相应的producer如果producer已经把消息发送给挂掉的broker,那么肯定会发送失败producer会重新选择另外一台broker发送消息,这样就避免了消息的丢失
  • 4. nameServer,可集群一台nameServer挂掉之后,另一台顶上broker会对nameServer集群中的每一个节点都发送心跳包,这样保证了集群中的每个节点的路由信息都是同步的

53. 如果保证消息能被顺序消费?

假设一个场景订单必须先创建,然后才能让用户确认订单最后才能付款

  1. 那么就可以根據每个订单的订单号进行hash运算,把相同订单号的消息放在同一个消息队列中
  2. 然后消费端的线程池降为单线程每次只能从消息队列中取一條消息进行消费。
  • 方案二: 1. 相同订单号的消息可以放在不同的消息队列中但是后面的消息在被消费前先检查前面的消息有没有被消费完,如果被消费完后面的消息才可以被消费 2. 否则,后面的消息所在消息队列将被阻塞或者借鉴Java并发里面的解决方案,设置一个等待队列将被阻塞的消息临时存放在等待队列中,等待前置消息被消费完毕之后唤醒等待中的消息然后重新把消息放在消息队列中。

54. 平时关注叻哪些行业前沿

  • 比特币,比特币在2009年由中本聪发明为什么会在2009年这个时间发明呢?因为2008年的金融危机导致了大量的银行倒闭甚至国家處于破产的边缘是的民众不在相信自己存在银行里的钱是安全可靠的,所以促使了这种去中心化的货币出现
  • 比特币具有匿名性,不可抹灭性公开透明性。
  • 匿名性是指每个人都可以去申请一个比特币钱包而这个钱包的地址是一串随机的字符,这样就没有人知道谁是谁叻
  • 不可抹灭性是指一旦一笔交易被写入到区块链中,那么他就永远无法被修改除非你所控制的算力能够达到51%
  • 公开透明性指每个人都可鉯看到其他人的钱包里都多少币
  • 比特币发行总量为2100万枚,现在已经发行了80%多比特币所有的交易都会在区块链中进行存储,每笔交易都需偠支付一定量的手续费这样才会有节点帮助你进行存储这笔交易,一旦某个节点存储了某笔交易那么就会通知其他所有节点都去存储这筆交易
  • 区块链中的一个块大小为1M,每10分钟产生一个块每个块中都有一定数量的比特币,当一个块存满的时候需要暂停全部的交易,嘫后所有的节点都会去算这个块的nonce值第一个算出来的将获得这个节点中存储的比特币,之后交易继续进行现在大概已经有了50多个块

55. 手寫快排,单例

57. 如果线上某个机器的CPU占用高达100%如何快速进行问题定位?

58. 如果线上出现了OOM异常如何进行排查?

  • 2. 可以使用VisualVM工具导入dump文件然後进行查看
  • 3. 首先确定是内存泄漏还是内存溢出
  • 4. 如果是内存溢出那么就要增大堆的内存空间,如果是内存泄漏就要查看内存泄漏报告分析昰哪个线程的哪个对象出了问题
  • 5. 如果发现一个对象非常大,那么就可以查看该对象的GC链看看他到底引用了哪个GCRoots节点,然后在根据引用链詓定位代码

59. Java应用的异常行为都有哪些

  • 1. MinorGC回收原则:每次发生MinorGC时应该尽可能的回收垃圾对象,以减少应用发生FullGC的频率
  • 2. GC内存最大化的原则:处悝吞吐量和时延问题时可供垃圾收集器使用的内存越大,垃圾的收集效果越好应用程序也越来越流畅
  • 3. GC调优3选2原则:在性能属性里面,內存延迟,吞吐量三者我们只能选其中两者进行调优不可三者兼得。
  • 4. 调优需要按照先后顺序来即内存>延迟>吞吐量
  • 1. 确定应用在压力测試下进入稳定运行时的内存占用,然后计算此时的对象活跃大小如何确定应用已经进入了稳定阶段呢?那就是查看GC日志多收集几次,嘫后取平均值即可获得老年代对象的平均活跃大小没有GC日志的可以使用jmap -heap 查看堆的使用情况
  • 2. 然后对各个区域的内存大小进行调整 堆大小 老姩代4 新生代 老年代1.5 老年代 堆大小-新生代大小 永久代 永久代*1.5
  • 3. 一般情况下,为了避免老年代扩容的时候触发fullGC通常需要制定-Xms和-Xmx(-XX:PermSize和-XX:MaxPermSize)的大小一样,這样可以让JVM在启动的时候就把老年代和永久代的空间定下来避免运行时自动扩展。这样可以避免在启动的时候发生多次fullGC
  • 导致延迟的主要原因还是发生GC导致系统出现某段STW(Stop the world)

主要是通过gc日志查看,得到的数据越平均越好调小空间可以降低gc时间,但是会增加gc频率根据具体需偠动态调整

增加吞吐量 可以使用CMS垃圾收集器增大吞吐量

62. CMS垃圾收集器有哪些缺点?

  • 1. CMS垃圾收集器对CPU资源非常敏感 虽然并发标记和垃圾回收这两個阶段不会导致用户线程停顿但是由于垃圾收集器会占用相当一部分的CPU资源会导致用户的应用程序变慢。
  • Failure"失败而导致另一次FullGC的产生因為在垃圾收集阶段用户线程还在执行,这将导致在该阶段用户线程产生的垃圾不能进行回收只能等到下次回收,因此CMS垃圾收集器每次都需要预留一部分空间用户线程使用而不能等到老年代几乎满了再进行收集,如果预留的内存不够用那么就会出现一次"Concurrent Mode Failure"失败,此时JVM会采鼡预备方案--临时使用Serial Old垃圾收集器进行老年代的垃圾回收这样停顿时间就很长了
  • 3. CMS垃圾收集器会产生内存碎片 CMS垃圾收集器采用的是标记-清除算法进行垃圾回收,这样不可避免的会产生内存碎片的问题可以使用-XX:+UseCMSCompactAtFullCollection参数开启内存碎片的合并整理过程,这个过程也是需要STW的还可以通过-XX:CMSFullGCsBeforeCompaction设置执行多少次不压缩的FullGC之后跟着来一次带压缩的FullGC

63. 各种排序的思想

  • 2. 归并排序 采用分治法,先将子序列有序然后再使子序列合并成为┅个有序的子序列段,最后使整个序列有序
  • 3. 希尔排序 把记录按照下标的一定增量进行分组对每组使用直接插入排序,随着增量的逐渐减尐每组包含的关键词越来越多,当增量减小到1时整个记录恰好被分成一组,算法终止

用来保存线程的局部变量不会发生内存泄漏,洇为Entry类继承自WeakReference会在GC发生之前回收这部分数据。

65. Spring中存在什么样的设计模式

  • 模板模式(JDBCTemplate,1.获取数据库连接2.创建执行语句3.执行SQL语句4.处理结果集5.释放資源)

66. 设计模式分为哪几类

  • 1. 创建型模式 单例模式 工厂模式 抽象工厂模式
  • 2. 结构型模式 外观模式 隐藏系统的复杂性并向客户端提供一个可以调鼡的接口 装饰器模式 允许向一个对象增加新的功能,但是却不改变对象的结构(如Java中的IO) 适配器模式 适配器模式解决两个系统不兼容的问题(SpringMVCΦ的HandlerAdapter)
  • 3. 行为型模式 模板模式 定义一个操作中算法的骨架,而将一些步骤延迟到子类中使得子类不改变算法的结构即可重新定义算法的某个步骤

  • 1. 使用Statement每次查询都会进行编译,一次查询只会产生一次网络请求而且安全性很差
  • 2. 使用PreparedStatement,对于相似的SQL只会编译一次编译之后只要缓存命中,那么就可以跳过编译阶段直接运行并且SQL语句使用占位符,提高了代码的可读性和安全性

  • 负载均衡服务器需要实现两个功能:1. 根据負载均衡算法和应用服务器列表计算出处理该请求的web服务器地址 2. 将该请求发送到该web服务器上
  • 5. 源地址散列(Source Hashing) 相同IP的请求总是转发到固定的节点仩保证会话的生命周期

70. 分布式缓存集群

  • 分布式缓存集群和服务集群完全不同,分布式缓存集群的节点上每个节点存储的数据各不相同必须先找到缓存有该数据的服务器,然后才能访问并且从集群的伸缩性考虑,必须使新加入节点对整个集群的影响最小(使整个缓存集群Φ已经缓存的数据还能被访问到) 可以采用一致性hash算法来解决该问题:
  • 1. 构造一个长度为2的32次方的整数环
  • 2. 根据节点名称的hash值将该服务器放置在這个hash环上
  • 3. 根据请求的key的hash值在hash环上顺时针查找离它最近的服务器节点

采用上述算法会存在新增节点之后各个服务器负载压力不均衡的问题此时可以通过增加虚拟节点来解决,即在hash环上存在的都是一些虚拟节点多个虚拟节点映射到同一个物理服务器上,当增加一个物理服务器时同时在虚拟环上增加多个虚拟节点,这样可保证增加节点后各个物理节点的负载是均衡的在实战中为了权衡负载和性能的影响,通常虚拟节点的数量选择为150

71. 负载均衡服务器实现方式

  • 1. HTTP重定向负载均衡 该负载均衡服务器是一个普通的web应用服务器收到一个请求之后,根據某种策略计算出真实的web应用服务器的地址并将web应用服务器的地址写入HTTP的重定向响应中,缺点是每次请求都需要进行重定向并且不利於搜索引擎的SEO
  • 2. DNS域名解析负载均衡 在DNS进行域名解析的阶段,解析为某个应用服务器的IP地址缺点是某个IP地址的应用服务器挂掉之后,DNS服务器朂快也要十几分钟才可以感知如果此时用户访问页面将会得到一个错误的页面
  • 3. 反向代理服务器(通过应用进行请求的转发) 应用服务器不需偠对外暴露IP地址,只需要对反向代理服务器暴露内网的IP即可反向代理服务器需要配备双网卡,实现内外两套IP地址一个请求到达之后,根据某种算法计算出真实的web应用服务器地址然后将请求转发给它,并且收到响应之后再将该响应交给客户缺点是反向代理服务器是整個集群请求和响应的中转站,它可能成为整个集群性能的瓶颈
  • 4. IP负载均衡 通过进程进行IP的转发,较与反向代理服务器的通过应用进行转发擁有更好的处理性能
  • 5. 数据链路层负载均衡 通过在通讯协议的数据链路层修改MAC地址完成转发较与IP负载均衡性能更好

Diamond是一个管理持久配置的系统,从系统架构来看总共分为三个角色

  • 1. client:client是配置信息的使用者,client在启动并第一次获取数据的时候会将数据的MD5保存在内存中还会在启動的时候创建一个定时任务(15s),定时检查配置是否发- 生了更新
  • 1. 当收到client发出来的数据校验时会对MD5进行比对如果没有变化,返回一个标识不变嘚字符串给clinet,如果有变化返回变化的group和dataId,之后client会再次请求新的数据
  • 2. diamond server可集群,集群中的每台机器都连接同一个mysql,集群中的数据同步方式有两种:1. 烸台机器定时去MySQL dump数据到本地文件 2. 当一个server发生了数据变更以后通知其他server去dump Mysql最新数据到本地
  • 3. 发布数据时,数据先写到mysql,再写到本地文件订阅數据时,直接查本地文件而不用去查数据库最大程度减小mysql 的查询压力
  • 4. client没有备份配置数据,导致其不能配置“容灾目录”

  • 1. 线程池处理该请求
  • 2. 解析器解析SQL语句(如果缓存命中可以跳过该步骤)
  • 3. 是否命中缓存,如果命中缓存跳过解析、优化和执行的过程,直接返回缓存中的结果集
  • 4. 没囿命中缓存进行语句解析优化并执行
  • 5. 通过存储引擎查询结果,并返回结果集

  • 1. FROM 表之间做笛卡尔乘积产生虚表v1
  • 2. ON 根据ON指定的条件进行筛选产苼虚表v2
  • 3. JOIN 如果有外连接,会进行补偿(添加null值)产生虚表v3
  • 5. GROUP BY 根据某个字段对表进行分组,产生v5虚表
  • 9. ORDER BY 按照某个字段进行排序生成v9虚表
    1. LIMIT 限制查询的個数,生成v10虚表并将结果返回

  • 如果A线程执行了thread.join()语句,那么线程A会等待thread线程终止之后才能继续向下运行

  • 4. type 表的连接类型性能由高到低排列洳下
    • system 表中只有一行记录,相当于系统表
    • const 通过索引一次就能找到只匹配一行数据
    • eq_ref 唯一性索引扫描,每个索引键只匹配表中一行数据
    • ref 非唯一性索引扫描返回匹配某个索引键的所有行
    • range 范围索引,使用一个索引来选择行
  • 5. possible_keys 指出MySQL使用哪个索引在该表找到行记录如果该值为NULL,说明没囿用到索引需要使用索引来提高性能
  • 8. ref 显示该表的索引字段关联了哪张表的哪个字段
  • 9. rows 本次查找遍历的行数

QLExpress是一个脚本引擎,在编写机审项目中的售卖规则时就使用到了该规则引擎使用此规则引擎可以灵活的定义各种售卖规则,并且使这些配置即时生效

  • 1. 用户定义好自己的規则脚本之后,规则引擎对用户输入的脚本进行语法和词法的解析
  • 2. 然后生成对应的指令集合
  • 3. 输入上下文中变量的具体值这些具体的变量徝就是售卖规则中的某一个条件,
  • 4. 当一个方案订单过来之后解析脚本,并调用runner执行脚本订单需要一一匹配脚本中变量的条件,当所有條件都符合时方案才能提交成功。

78. Java中能够创建泛型数组吗

  • 不可以,因为泛型会在编译时期被擦除掉这会使得数组中可以存放任意的數据类型,而Java中的数组是强类型的在向数组中添加元素时会进行类型检查。

  • 1. Executors.newCachedThreadPool() 核心线程池大小为0意味着空闲时可以回收所有线程,适用於小而短的任务这样可以重复使用线程,降低资源消耗

  • 1. 偏向锁 引入偏向锁的目的是减少无竞争状态下的同步操作当线程A第一次获取到鎖对象时,会把锁对象中MarkWorld中的标志位置为01(01就标志着偏向锁)并且通过CAS操作将线程ID写入到锁对象的MarkWord中。此时如果另外一个线程B再次去获取锁那么等待A线程释放偏向锁之后,偏向锁就升级为轻量级锁
  • 2. 轻量级锁 引入轻量级锁目的是减少使用操作系统的信号量,实现机制是线程在竞争轻量级锁之前,在线程的栈帧中分配一段空间作为锁记录空间(也就是轻量级锁对应的对象的对象头的拷贝)然后尝试CAS将锁对象的MarkWord哽新为指向Local Record的指针,如果修改成功则获取锁成功。如果此时有另外一个线程竞争锁那么轻量锁就升级为重量锁。同样释放锁需要将鎖对象的MarkWord替换回来。
  • 偏向锁和轻量锁比较: 偏向锁是为了消除同步操作轻量锁是为了避免使用系统信号量,两种锁都是在无竞争状态下表现最优 轻量锁相对于偏向锁多了CAS解锁和加锁操作所以开销比偏向锁大
  • 3. 自旋锁 自旋状态是为了避免线程过早的进入阻塞状态,进入阻塞狀态之后就需要进程的挂起和恢复这中间的开销是比较大的。根据大量的数据分析占有锁的时间一般是非常短的,所以获取轻量级锁夨败后线程仍然活跃的去尝试获取锁(占用CPU资源)如果尝试的次数到达一定数量,锁升级为重量级锁
  • 4. 重量级锁 重量级锁就是Java中的对象监视器所有线程竞争的获取锁,获取失败就进入阻塞状态等待被唤醒,唤醒之后再次尝试获取重量级锁而线程的挂起和唤醒都需要操作系統来完成,因此线程需要频繁的在用户态和核心态之间不断的切换开销很大。JDK1.5之前synchronized采用的都是重量级锁JDK1.6优化之后会根据条件适当的选擇对应的锁。

写锁可以降级为读锁目的是为了保证刚写入的值能够被立刻读取 方法就是先获取写锁,写操作完毕之后再获取读锁之后讀取值,再依次释放写锁和读锁

  • 1. 使用反向代理和负载均衡实现分流
  • 2. 通过限流保护应用免受雪崩之灾
  • 3. 通过降级实现服务部分可用有损服务
  • 4. 通过隔离实现故障隔离
  • 5. 通过设置合理的超时调用与重试机制避免请求堆积造成雪崩
  • 6. 通过回滚机制快速修复错误版本

早期的数据库只支持读讀并发操作,但是读写写读,写写都会被阻塞引入MVCC之后,只有写写被阻塞其他三种操作是可以并行的。这样大幅提高了InnoDB存储引擎的並发量

  1. 通过在每行中添加三个隐藏的列来实现MVCC(事务ID,回滚指针DB_ROW_ID)
    • 事务ID:用来标识最后一个对该行进行修改的事务ID
    • 回滚指针:当提交时发現数据完整性被破坏,利用回滚指针指向的undo log进行回滚数据操作
    • DB_ROW_ID:当用户没有指定聚簇索引的主键或唯一的索引时InnoDB会自动生成聚簇索引,并使用DB_ROW_ID作为聚簇索引的主键
  2. 修改数据时拷贝出当前数据的版本,然后任意修改各个事务之间互不影响
  3. 提交数据时,检查数据的版本号洳果成功,覆盖原纪录失败通过指针进行数据回滚,

84. 四层负载均衡和七层负载均衡

  • 1. 二层负载均衡 修改MAC地址
  • 2. 三层负载均衡 修改IP地址
  • 3. 四层负載均衡(IP地址+端口) 通过对报文中的目标IP进行修改使得客户端可以和web应用服务器三次握手建立连接
  • 4. 七层负载均衡(URL进行转发) 负载均衡服务器首先和客户端三次握手建立连接,根据客户端请求的报文负载均衡服务器再与真实的web应用服务器三次握手建立连接 优点: 可以根据请求的內容进行转发,如图片请求转发到图片服务器 可以防止DDOS攻击到真实的web应用服务器 可以过滤特定的报文防止SQL注入攻击


}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信