推荐算法的调优内容主要有什么?

这个回答已经被我独立放到了文章

网络能深则深,在保持比较小宽度的时候,要想办法加深网络,变深的过程中网络慢慢变胖。

使用小卷积核,小卷积核有利于网络走向更深,并且有更好的识别鲁棒性,尤其是在分辨率更小的特征图上,因为卷积核的尺寸是相当于特征图的分辨率来说的,大特征图上偏大的卷积核其实也并不大。

下采样在网络前几层的密度大一些,(这样能尽可能用微弱精度损失换取速度提升) 越往后下采样的密度应该更小,最终能够下采样的最大深度,以该层的感受野以及数据集中最大的有意义物体尺寸决定(自然不可能让最大有意义的物体在某一层被下采样到分辨率小于1,但是网络依然可以work,只不过最后几层可能废弃了(要相信cnn的学习能力,因为最大不了它也能学出单位卷积,也就是只有中心元素不为0的卷积核),更准确的说这是最大感受野的极限,最大感受野应该覆盖数据集中最大有意义的物体)。

下采样的时候大卷积核能尽可能保住分辨率,这和插值是类似的,类比于最近邻插值,双线性插值,双三次插值,这其实和感受野理论一致,更远的插值意味着更大的感受野。

前面这段话源于cnn中各个参数的辩证矛盾。

深度决定了网络的表达能力,网络越深学习能力越强。

宽度决定了网络在某一层学到的信息量。

感受野决定了网络在某一层看到多大范围,一般说来最后一层一定至少要能看到最大的有意义的物体,更大的感受野通常是无害的。

在达到相同感受野的情况下,多层小卷积核的性能一定比大卷积核更好。

分辨率很重要,尽量不要损失分辨率,为了保住分辨率,在使用下采样之前要保证在这一层上有足够的感受野,这个感受野是相对感受野,是指这一个下采样层相对于上一个下采样层的感受野,把两个下采样之间看成一个子网络的话,这个子网络必须得有一定的感受野才能将空间信息编码到下面的网络去,而具体需要多大的相对感受野,只能实验,一般说来,靠近输入层的层空间信息冗余度最高,所以越靠近输入层相对感受野应该越小。同时在靠近输入层的层,这里可以合成一个大卷积核来降低计算量。

所以一般做法是前面几层下采样频率高一点,中间层下采样频率降低,并使用不下采样的方法提高深度。

越靠前分辨率降低越快,中间一定要加深

先训一个大模型然后裁剪,也许比直接训一个小模型性能好。

网络最后面完全可以使用不采样的空洞卷积来做,对于分割尤其如此。

最后面不要再下采样了,考虑使用aspp来融合不同尺度的感受野

转置卷积完全可以使用上采样+卷积来替代。

能用可分离卷积替代的卷积一定要替代,一般除了第一个卷积,都能替代,替代完后考虑给替代可分离的通道数乘以2,因为可分离卷积的参数和计算量都是线性增长的,这样做依然有速度增益。同样的道理适用于2+1分离卷积。

计算量线性增长,可以控制通道数和depth multiplier,代价小

感受野也不是越大越好(大感受野意味着更多的语义信息),对于某些low-level的任务而言,比如图像降噪,感受野可能也就局部patch大小,对于low-level而言,下采样的意义更小,尽可能少使用下采样。

对于low-level而言,感受野不用太大,具体指去噪,去马赛克,图像增强,和关键点等任务

对于检测,anchor层不一定要有三层,同一层按照需求可以设定的aspect ratio和size都是可选的,比如blazeface把所有anchor集中在一层,这个要按照需求设计。bifpn真的有用。

batchnorm一定要用,如果你是多机多卡,也可以考虑同步的batchnorm。

metric learning(图像比对)一般说来是batchsize更大会性能更好,因为这样能采样到的正负样本对的范围更大。

如果你的一阶段检测模型得不到好的分类结果,考虑两阶段,先检测再分类。

检测模型里的预训练模型是有用的,至少能提升前景背景的检测区分度。

如果你的分类精度不够是因为有两类或者多类太相近造成的,考虑使用其他softmax,比如amsoftmax。

各种魔改的softmax能更好的增大类间差距

如果你的分类精度不够是样本不均衡造成的,考虑使用focal loss。

不要只看精度,考虑其他metrics,并始终以上线后的可视化效果为最终评判标准。

尽可能使用全卷积网络来做landmark,不要直接用fc回归,回归真的不太稳定。另外,数学意义上的cnn是平移不变的,位置信息是通过padding泄露出来,所以fc直接回归landmark相当于用padding去拟合位置信息。

一定要做图像亮度变换增强,亮度鲁棒性会更好,但是要结合你的数据的亮度分布自适应的调整。

最后,在不改动网络backbone的基础上,多尝试一些新的loss,工程上的代价并不大。


所有疑惑,请参见我的文章,并参考其他论文。

}

由于是批量发送,数据并非真正的实时;

对于mqtt协议不支持;

不支持物联网传感数据直接接入;

仅支持统一分区内消息有序,无法实现全局消息有序;

监控不完善,需要安装插件;

依赖zookeeper进行元数据管理;

旧的 Kafka 消费者 API 主要包括:SimpleConsumer(简单消费者) 和 ZookeeperConsumerConnectir(高级消费者)。SimpleConsumer 名字看起来是简单消费者,但是其实用起来很不简单,可以使用它从特定的分区和偏移量开始读取消息。高级消费者和现在新的消费者有点像,有消费者群组,有分区再均衡,不过它使用 ZK 来管理消费者群组,并不具备偏移量和再均衡的可操控性。

现在的消费者同时支持以上两种行为,所以为啥还用旧消费者 API 呢?

54.Kafka 分区数可以增加或减少吗?为什么?

我们可以使用 bin/kafka-topics.sh 命令对 Kafka 增加 Kafka 的分区数据,但是 Kafka 不支持减少分区数。Kafka 分区数据不支持减少是由很多原因的,比如减少的分区其数据放到哪里去?是删除,还是保留?删除的话,那么这些没消费的消息不就丢了。如果保留这些消息如何放到其他分区里面?追加到其他分区后面的话那么就破坏了 Kafka 单个分区的有序性。如果要保证删除分区数据插入到其他分区保证有序性,那么实现起来逻辑就会非常复杂。

 kafka通过 topic来分主题存放数据,主题内有分区,分区可以有多个副本,分区的内部还细分为若干个 segment。都是持久化到磁盘,采用零拷贝技术。

分区下面,会进行分段操作,每个分段都会有对应的素引,这样就可以根据 offset二分查找定位到消息在哪一段,根据段的索引文件,定位具体的 mle ssage

2、分区副本可用性(1 eader选举,zk来协调

如果1eader宕机,选出了新的1eader,而新的 leader并不能保证已经完全同步了之前1eader的所有数据,只能保证HW(高水位设置)之前的数据是同步过的,此时所有的 follower都要将数据截断到W的位置,再和新的 leader同步数据,来保证数据一致。

当宕机的 leader恢复,发现新的1eader中的数据和自己持有的数据不一致,此时宕机的1 eader会将自己的数据截断到宕机之前的hw位置,然后同步新1 eader的数据。宕机的1eader活过来也像 follower一样同步数据,来保证数据的一致性。

56.相比较于传统消息队列,kafka的区别

1、分区性:存储不会受单一服务器存储空间的限制

3、消息有序性:一个分区内是有序的。

4、负载均衡性:分区内的一条消息,只会被消费组中的一个消费者消费,主题中的消息,会均衡的发送给消费者组中的所有消费者进行消费。

57.消息丢失和消息重复

同步:这个生产者写一条消息的时候,它就立马发送到某个分区去。

异步:这个生产者写一条消息的时候,先是写到某个缓冲区,这个缓冲区里的数据还没写到 broker集群里的某个分区的时候,它就返回到 client去了

针对消息丢失:同步模式下,确认机制设置为-1,即让消息写入 Leader和 Fol lower之后再确认消息发送成功:

异步模式下,为防止缓冲区满,可以在配置文件设置不限制阻塞超时时间,当缓冲区满时让生产者一直处于阻塞状态

针对消息重复,将消息的唯一标识保存到外部介质中,每次消费时判断是否处理过即可

在HBase中Hmaster负责监控RegionServer的生命周期,均衡RegionServer的负载,如果Hmaster挂掉了,那么整个HBase集群将陷入不健康的状态,并且此时的工作状态并不会维持太久。所以HBase支持对Hmaster的高可用配置。

HBase操作过程中需要大量的内存开销,毕竟Table是可以缓存在内存中的,一般会分配整个可用内存的70%给HBase的Java堆。但是不建议分配非常大的堆内存,因为GC过程持续太久会导致RegionServer处于长期不可用状态,一般16~48G内存就可以了,如果因为框架占用内存过高导致系统内存不足,框架一样会被系统服务拖死。

2.hbase的rowkey怎么创建好?列族怎么创建比较好?

hbase存储时,数据按照Row key的字典序(byte order)排序存储。设计key时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。(位置相关性)

一个列族在数据底层是一个文件,所以将经常一起查询的列放到一个列族中,列族尽量少,减少文件的寻址时间。

1)生成随机数、hash、散列值

增强hbase查询数据的功能

减少服务端返回给客户端的数据量

答:宕机分为HMaster宕机和HRegisoner宕机,如果是HRegisoner宕机,HMaster会将其所管理的region重新分布到其他活动的RegionServer上,由于数据和日志都持久在HDFS中,该操作不会导致数据丢失。所以数据的一致性和安全性是有保障的。

2.Hive是建立在Hadoop之上为了减少MapReduce jobs编写工作的批处理系统,HBase是为了支持弥补Hadoop对实时操作的缺陷的项目 。

5.Hive本身不存储和计算数据,它完全依赖于HDFS和MapReduce,Hive中的表纯逻辑。

7.hbase是物理表,不是逻辑表,提供一个超大的内存hash表,搜索引擎通过它来存储索引,方便查询操作。

9.hdfs作为底层存储,hdfs是存放文件的系统,而Hbase负责组织文件。

5/ regionserver接收到客户端发来的请求之后,就会将数据写入到region中

如果是从StoreFile里面读取的数据,不是直接返回给客户端,而是先写入BlockCache,再返回给客户端。)

1)当MemStore数据达到阈值(默认是128M,老版本是64M),将数据刷到硬盘,将内存中的数据删除,同时删除HLog中的历史数据;

2)并将数据存储到HDFS中;

3)在HLog中做标记点。

当数据块达到4块,hmaster将数据块加载到本地,进行合并

当合并的数据超过256M,进行拆分,将拆分后的region分配给不同的hregionserver管理

1、管理用户对Table的增、删、改、查操作;

HRegion Server主要负责响应用户I/O请求,向HDFS文件系统中读写数据,是HBASE中最核心的模块。

HBase有多个RegionServer,每个RegionServer里有多个Region,一个Region中存放着若干行的行键以及所对应的数据,一个列族是一个文件夹,如果经常要搜索整个一条数据,列族越少越好,如果只有一部分的数据需要经常被搜索,那么将经常搜索的建立一个列族,其他不常搜索的建立列族检索较快。

12.请简述Hbase的物理模型是什么

13.请问如果使用Hbase做即席查询,如何设计二级索引

14.如何避免读、写HBaes时访问热点问题?

这里所说的加盐不是密码学中的加盐,而是在rowkey的前面增加随机数,具体就是给rowkey分配一个随机前缀以使得它和之前的rowkey的开头不同。给多少个前缀?这个数量应该和我们想要分散数据到不同的region的数量一致(类似hive里面的分桶)。

( 自己理解:即region数量是一个范围,我们给rowkey分配一个随机数,前缀(随机数)的范围是region的数量)

加盐之后的rowkey就会根据随机生成的前缀分散到各个region上,以避免热点。

哈希会使同一行永远用一个前缀加盐。哈希也可以使负载分散到整个集群,但是读却是可以预测的。使用确定的哈希可以让客户端重构完整的rowkey,可以使用get操作准确获取某一个行数据。

第三种防止热点的方法是反转固定长度或者数字格式的rowkey。这样可以使得rowkey中经常改变的部分(最没有意义的部分)放在前面。这样可以有效的随机rowkey,但是牺牲了rowkey的有序性。反转rowkey的例子:以手机号为rowkey,可以将手机号反转后的字符串作为rowkey,从而避免诸如139、158之类的固定号码开头导 致的热点问题。

一个常见的数据处理问题是快速获取数据的最近版本,使用反转的时间戳作为rowkey的一部分对这个问题十分有用,可以用Long.Max_Value – timestamp追加到key的末尾,例如[key][reverse_timestamp] ,[key] 的最新值可以通过scan [key]获得[key]的第一条记录,因为HBase中rowkey是有序的,第一条记录是最后录入的数据。

(5)尽量减少行和列的大小

在HBase中,value永远和它的key一起传输的。当具体的值在系统间传输时,它的rowkey,列名,时间戳也会一起传输。如果你的rowkey和列名很大,HBase storefiles中的索引(有助于随机访问)会占据HBase分配的大量内存,因为具体的值和它的key很大。可以增加block大小使得storefiles索引再更大的时间间隔增加,或者修改表的模式以减小rowkey和列名的大小。压缩也有助于更大的索引。

列族名的长度尽可能小,最好是只有一个字符。冗长的属性名虽然可读性好,但是更短的属性名存储在HBase中会更好。也可以在建表时预估数据规模,预留region数量,例如create ‘myspace:mytable’, SPLITS => [01,02,03,,…99]

15.布隆过滤器在HBASE中的应用

16.Hbase是用来干嘛的?什么样的数据会放到hbase

18.Hbase在建表时的设计原则(注意事项)

 Hbase默认建表时有一个 region,这个 region的 rowkey是没有边界的,即没有 startkey和 endkey在数据写入时,所有数据都会写入这个默认的 region,随着数据量的不断增加,会进行 split,分成2个 region在此过程中,会产生两个问题:

1.数据往一个 region写,会有写热点问题。2. region split会消耗宝贵的集群I/0资源。我们可以控制在建表的时候,创建多个空 region,并确定每个 region的 startkey和 endkey,这样只要我们的 rowkey设计能均匀的命中各个 region,就不会存在写热点问题。自然 split的几率也会大大降低。

(1) rowkey长度越短越好。数据的持久化文件 Hfile中是按照 Keyvalue存储的,如果 rowkey过长会极大影响File的存储效率; Memstore将缓存部分数据到内存,如果 rowk-ey字段过长,内存的有效利用率就会降低,系统不能缓存更多的数据,这样会降低检索效率。

2) rowkey尽量散列。建议将 rowkey的高位作为散列字段,将提高数据均衡分布在每个 Regionserver以实现负载均衡的几率。(哈希、反转等也可以避免热点问题

(1)建表至少指定一个列族,但一般不超过三个,一般一个,因为 flush和 compact是以 region为单位,所以,某个 column family在 flush的时候,它邻近的 column family也会因关联效应被触发f1ush,最终导致系统产生更多的1/0

2)列族名字不宜过长,会冗余存储。

3)不同列族的记录的数量级不易相差太大,比如A,B两个列族,A为100万条,B为100亿条,则A会被分散到多个 region(可能会跨 reglon server),导致对A的扫描效率低下

根据你的 Rowkey设计来进行预建分区,减少 region的动态分裂。

2)给HFi1设定合适大小

 Hfile是数据底层存储文件,在每个 memstore进行刷新时会生成一 Hfile,当 Hfile增加到一定程度时,会将属于一个 region的HFi1e进行合并,这个步骤会带来开销但不可避免,但是合并后 reglon大小如果大于设定的值,那么 region会进行分裂。为了减少这样的无谓的1/0开销,建议估计项目数据量大小,给 Hfile设定一个合适的值

 Hbase中也存在频繁开启关闭帯来的问题。

(1)开启过滤,提高查询速度,可以减少网络102)使用压缩:一般推荐使用 Snappy和LZ0压缩。

4、合理设计(建表注意事项)

分区、 Rowkey设计、列族的设计

Region进行分组,切分到每个 regionserver中,因此在回放之前首先需要将og按照 Region进行分组,每个 Region的日志数据放在一起,方便后面按照 Region进行回放。这个分组的过程就称为HLog切分。然后再对 region重新分配,并对其中的Hog进行回放将数据写入 memstore刷写到磁盘,完成最终数据恢复。

1.维表和宽表的考查(主要考察维表的使用及维度退化手法)

维表数据一般根据ods层数据加工生成,在设计宽表的时候,可以适当的用一些维度退化手法,将维度退化到事实表中,减少事实表和维表的关联

4.一亿条数据查的很慢,怎么查快一点

时间维表,用户维表,医院维表等

日志数据:ng日志,埋点日志

7.你们最大的表是什么表,数据量多少

ng日志表,三端(app,web,h5)中app端日志量最大,清洗入库后的数据一天大概xxxxW

9.数据平台是怎样的,用到了阿里的那一套吗?

没用到阿里那一套,数据平台为自研产品

10.你了解的调度系统有那些?,你们公司用的是哪种调度系统

11.你们公司数仓底层是怎么抽数据的?

业务数据用的是datax

13.埋点数据你们是怎样接入的

14.如果你们业务库的表有更新,你们数仓怎么处理的?

15.能独立搭建数仓吗

17.说一下你们公司的大数据平台架构?你有参与吗?

18.介绍一下你自己的项目和所用的技术

19.对目前的流和批处理的认识?就是谈谈自己的感受

20.你了解那些OLAP 引擎,MPP 知道一些吗?clickHouse 了解一些吗?你自己做过测试性能吗?

21.Kylin 有了解吗?介绍一下原理

23.你们数仓的APP 层是怎么对外提供服务的?

1.直接存入mysql业务库,业务方直接读取

2.数据存入mysql,以接口的形式提供数据

3.数据存入kylin,需求方通过jdbc读取数据

24.数据接入进来,你们是怎样规划的,有考虑数据的膨胀问题吗

25.简述拉链表,流水表以及快照表的含义和特点

27.你们公司的数仓分层,每一层是怎么处理数据的

28.什么是事实表,什么是维表

29.星型模型和雪花模型

30.缓慢变化维如何处理,几种方式

33.工作中碰到什么困难,怎么解决的

34.如何用数据给公司带来收益

35.需求驱动和业务驱动,数据开发和ETL开发,实战型和博客型

36.如何用数据实现业务增长,黑客增长?

37.什么是大数据?千万级别的数据完全可以用传统的关系型数据库集群解决,为什么要用到大数据平台。

38.数据质量,元数据管理,指标体系建设,数据驱动

39.什么是数仓,建设数仓时碰到过什么问题

41.维度建模和范式建模的区别;

42.埋点的码表如何设计;

43.集市层和公共层的区别;

44.缓慢变化维的处理方式

46.说说你从0-1搭建数仓都做了什么?你觉得最有挑战的是什么?

47.数据模型如何构建,星型、雪花、星座的区别和工作中如何使用;

48.如何优化整个数仓的执行时长,比如7点所有任务跑完,如何优化到5点;

49.数据倾斜,遇到哪些倾斜,怎么发现的?怎么处理的?;

50.如何保证数据质量;

51.如何保证指标一致性;

52.了解onedata吗,说说你的理解;

53.数据漂移如何解决;

54.实时场景如何解决的;

55.拉链表如何设计,拉链表出现数据回滚的需求怎么解决。

57.数仓分层、模型、每层都是做什么的?为什么这么做?

58.交叉维度的解决方案?

59.数据质量如何保证(DQC)?

60.任务延迟如何优化(SLA)?

61.聊一下数据资产。

62.如果让你设计实时数仓你会如何设计,为什么?

64.sql问题:连续活跃n天用户的获取;

65.数据倾斜的sql如何优化;数据量大的sql如何优化?

66.数据仓库主题的划分,参考Teradata的LDM模型;

68.数据质量管理、数据治理有什么好的方案?知识库管理有什么好的思路?血缘关系图。

69.元数据管理相关问题,集群存储不够了,需要清理不需要的任务和数据该怎么做?

70.业务库2亿数据入仓的策略,一次全量,之后每次增量;

73.聊一下技术架构,整个项目每个环节用的什么技术这个样子;

74.hive、hbase、spark。。。。这些大数据组件,熟悉哪个或者哪些?我说hive和hbase,对方就问hive和hbase的原理,差异等问题;

75.有没有实时数仓的经验,数据实时入仓思路,canal;

76.你对当前的项目组有没有什么自己的看法、意见或者需要改进的地方,这个改进对你有没有什么影响

77.ods的增量能否做成通用的?

78.公共层和数据集市层的区别和特点?

79.从原理上说一下mpp和mr的区别

80.对了中间还有问数仓数据的输出主要是哪些还有数仓的分层;

82.数据库和数据仓库有什么区别

1、数据库是面向事务的,数据是由日常的业务产生的,常更新:

     数据仓库是面向主题的,数据来源于数据库或文件,经过一定的规则转换得到,用来分析的。

2、数据库一般是用来存储当前交易数据,

3、数据库的设计一般是符合三范式的,有最大的精确度和最小的冗余度,有利于数据的插入;

1.Flink实时计算时落磁盘吗

2.日活DAU的统计需要注意什么

4.Flink的容错是怎么做的

5.Parquet格式的好处?什么时候读的快什么时候读的慢

开启checkpoint可以容错,程序自动重启的时候可以从checkpoint中恢复数据

3.sink支持事务,可以分2次提交,如kafka;或者sink支持幂等,可以覆盖之前写入的数据,如redis

8.flink的时间形式和窗口形式有几种?有什么区别,你们用在什么场景下的?

10.flink的watermark机制说下,以及怎么解决数据乱序的问题?

2.写出你用过的设计模式,并举例说明解决的实际问题

3.Java创建线程的几种方式

4.请简述操作系统的线程和进程的区别

6.采用java或自己熟悉的任何语言分别实现简单版本的线性表和链表,只需实现add,remove方法即可

8.JVM 内存分哪几个区,每个区的作用是什么?

9.Java中迭代器和集合的区别?

集合是将所有数据加载到内存,然后通过集合的方法去内存中获取,而迭代器是一个对象,实现了Iterator接口,实现了接口的hasNext和Next方法。

在多线程并发的情况下,可以直接使用 HashTabl,但是使用 HashMap 时必须自己增加同步

样的键只有一个;可以有一个或多个键所对应的值为 null。

4) 数组初始化和扩容机制

要求底层数组的容量一定要为 2 的整数次幂,而 HashMap 则要求一定为 2 的整数次幂。

Hashtable 扩容时,将容量变为原来的 2 倍加 1,而 HashMap 扩容时,将容量变为原

11.线程池使用注意哪些方面?

线程池分为单线程线程池,固定大小线程池,可缓冲的线程池

14.使用递归算法求n的阶乘:n! ,语言不限

TreeSet 是采用树结构实现(红黑树算法)。元素是按顺序进行排列,但是 add()、

安全的,而 StringBuilder 没有这个修饰,可以被认为是线程不安全的。

3、在单线程程序下,StringBuilder 效率更快,因为它不需要加锁,不具备多线程安全

而 StringBuffer 则每次都需要判断锁,效率相对更低

final:修饰符(关键字)有三种用法:修饰类、变量和方法。修饰类时,意味着它不

能再派生出新的子类,即不能被继承,因此它和 abstract 是反义词。修饰变量时,该变量

使用中不被改变,必须在声明时给定初值,在引用中只能读取不可修改,即为常量。修饰

方法时,也同样只能使用,不能在子类中被重写。

finally:通常放在 try…catch 的后面构造最终执行代码块,这就意味着程序无论正常执

行还是发生异常,这里的代码只要 JVM 不关闭都能执行,可以将释放外部资源的代码写在

从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用

的,通过重写 finalize() 方法可以整理系统资源或者执行其他清理工作。

== : 如果比较的是基本数据类型,那么比较的是变量的值

如果比较的是引用数据类型,那么比较的是地址值(两个对象是否指向同一块内

equals:如果没重写 equals 方法比较的是两个对象的地址值。

如果重写了 equals 方法后我们往往比较的是对象中的属性的内容

equals 方法是从 Object 类中继承的,默认的实现就是使用==

Java类加载需要经历一下几个过程:

加载时类加载的第一个过程,在这个阶段,将完成一下三件事情:

通过一个类的全限定名获取该类的二进制流。

将该二进制流中的静态存储结构转化为方法去运行时数据结构。 

在内存中生成该类的Class对象,作为该类的数据访问入口。

验证的目的是为了确保Class文件的字节流中的信息不回危害到虚拟机.在该阶段主要完成以下四钟验证: 

文件格式验证:验证字节流是否符合Class文件的规范,如主次版本号是否在当前虚拟机范围内,常量池中的常量是否有不被支持的类型.

元数据验证:对字节码描述的信息进行语义分析,如这个类是否有父类,是否集成了不被继承的类等。

字节码验证:是整个验证过程中最复杂的一个阶段,通过验证数据流和控制流的分析,确定程序语义是否正确,主要针对方法体的验证。如:方法中的类型转换是否正确,跳转指令是否正确等。

符号引用验证:这个动作在后面的解析过程中发生,主要是为了确保解析动作能正确执行。

准备阶段是为类的静态变量分配内存并将其初始化为默认值,这些内存都将在方法区中进行分配。准备阶段不分配类中的实例变量的内存,实例变量将会在对象实例化时随着对象一起分配在Java堆中。

该阶段主要完成符号引用到直接引用的转换动作。解析动作并不一定在初始化动作完成之前,也有可能在初始化之后。

初始化时类加载的最后一步,前面的类加载过程,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余动作完全由虚拟机主导和控制。到了初始化阶段,才真正开始执行类中定义的Java程序代码。

22.java中垃圾收集的方法有哪些?

23.如何判断一个对象是否存活?(或者GC对象的判定方法)

判断一个对象是否存活有两种方法: 

可达性算法(引用链法)

1.为什么要用es?存进es的数据是什么格式的,怎么查询

a.Flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。

b.Flume可以采集文件,socket数据包等各种形式源数据,又可以将采集到的数据输出到HDFS、hbase、hive、kafka等众多外部存储系统中

c.一般的采集需求,通过对flume的简单配置即可实现

d.ume针对特殊场景也具备良好的自定义扩展能力,因此,flume可以适用于大部分的日常数据采集场景

Flume分布式系统中最核心的角色是agent,flume采集系统就是由一个个agent所连接起来形成

每一个agent相当于一个数据传递员,内部有三个组件:

Source:采集源,用于跟数据源对接,以获取数据

Sink:下沉地,采集数据的传送目的,用于往下一级agent传递数据或者往最终存储系统传递数据

1.Sqoop底层运行的任务是什么

只有Map阶段,没有Reduce阶段的任务。

2.sqoop的迁移数据的原理

5.Sqoop数据导出一致性问题

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

2)场景2:设置map数量为1个(不推荐,面试官想要的答案不只这个)

多个Map任务时,采用–staging-table方式,仍然可以解决数据一致性问题。

6.通过sqoop把数据加载到mysql中,如何设置主键?

1.缓存穿透、缓存雪崩、缓存击穿

1)缓存穿透是指查询一个一定不存在的数据。由于缓存命不中时会去查询数据库,查不到

数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿

① 是将空对象也缓存起来,并给它设置一个很短的过期时间,最长不超过 5 分钟

② 采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定

不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力

2)如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,

尽量让失效的时间点不分布在同一个时间点

3)缓存击穿,是指一个 key 非常热点,在不停的扛着大并发,当这个 key 在失效的瞬间,

持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。

可以设置 key 永不过期

① 在指定的时间间隔内持久化

2)AOF : 以日志形式记录每个更新操作

Redis 重新启动时读取这个文件,重新执行新建、修改数据的命令恢复数据。

推荐(并且也是默认)的措施为每秒持久化一次,这种策略可以兼顾速度和安全性。

1 比起 RDB 占用更多的磁盘空间

3 每次读写都同步的话,有一定的性能压力

4 存在个别 Bug,造成恢复不能

如果对数据不敏感,可以选单独用 RDB;不建议单独用 AOF,因为可能出现 Bug;如果只是做纯内存缓存,可以都不用

悲观锁:执行操作前假设当前的操作肯定(或有很大几率)会被打断(悲观)。基于这个假设,我们在做操作前就会把相关资源锁定,不允许自己执行期间有其他操作干扰。

乐观锁:执行操作前假设当前操作不会被打断(乐观)。基于这个假设,我们在做操作前不会锁定资源,万一发生了其他操作的干扰,那么本次操作将被放弃。Redis 使用的就是乐观锁。

5.redis 是单线程的,为什么那么快

1)完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。

2)数据结构简单,对数据操作也简单,Redis 中的数据结构是专门进行设计的

3)采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗

4)使用多路 I/O 复用模型,非阻塞 IO

5)使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,

Redis 直接自己构建了 VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求

6.redis的热键问题?怎么解决?

2.为什么MySQL的索引要使用B+树而不是其它树形结构?比如B树?

       B树不管叶子节点还是非叶子节点,都会保存数据,这样导致在非叶子节点中能保存的指针数量变少(有些资料也称为扇出)

指针少的情况下要保存大量数据,只能增加树的高度,导致IO操作变多,查询性能变低;

1.单一节点存储更多的元素,使得查询的IO次数更少。

2.所有查询都要查找到叶子节点,查询性能稳定。

3.所有叶子节点形成有序链表,便于范围查询,远远高于B-树

B树(B-树)是一种适合外查找的搜索树,是一种平衡的多叉树 

B树的每个结点包含着结点的值和结点所处的位置

7.动态规划 最大连续子序列和

8.二叉树概念,特点及代码实现

二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成。

每个结点最多有两颗子树,所以二叉树中不存在度大于2的结点。

左子树和右子树是有顺序的,次序不能任意颠倒。

即使树中某结点只有一棵子树,也要区分它是左子树还是右子树。

4.怎么修改文本文件第一行字符

8.直接查看比较高的磁盘读写程序

10.查看报告系统运行时长及平均负载

}

我要回帖

更多关于 四种调度算法的优缺点 的文章

更多推荐

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

点击添加站长微信