JAVA与大数据面试总结(二)

版权声明:本文为IT晓白博主原创文章,转载请附上博文链接! https://blog.csdn.net/qq_38617531/article/details/85238970

Java基础知识

Java中常用算法:冒泡、选择、快速

冒泡:两两比较,每一轮(0~length-i)挑出一个最值,并将其移除,循环遍历1~length

 

选择:外面定义从0~length-1,先选定一个最先面的下目标作为最小下标,将其所对应的值逐一与其他比较,如果有人小于这个值,将其下标交换位置,一轮下来,如果最小下标指向的值不再是刚定义的值,就将其所对应的值交换位置,循环遍历  里面循环是i+1~length

 

快速:先选定一个值作为中间值,如果比这个数值小的放在左边,比这个值大的放在右边,再分别从左、右条一个作为中间值递归遍历

树:二叉树中的中序遍历:顺序就是在地面上的投影

红黑树就是二叉树的一种,treeset就是利用这个原理  去重加排序

链表:写快读慢,随机写,读的时候要从头开始遍历,节点的引用指向下一个节点的对象

数组:写慢读快,写的时候要遍历下标,将其放入,读取的时候直接根据县标找到指定的值

 

Hashmap:

原理:是链表和数组的结合体,对于不同hashcord的key以数组的形式存放,对于hashcord相同的key以链表的形式存放。Hashset基于hashmap

数组的长度是16,装载因子是0.75,对key取hash值,莫以集合长度,如果key的equals相同,则将其value值覆盖,如果不同则追加(放入链表)。

读的时候对key取hash,找到数组中对应的位置,再比较equals方法找到对应的key所对应的value

 

当集合的长度达到0.75*16=12时,进行对集合进行扩容:创建一个新集合是原来数组长度的两倍,并将原来的数据从新取hash移动到新集合中。

 

Stringbuffer:现成安全,stringbuild:现成不安全,String:线程安全,不可变的,String的值会先放在常量池中,如果下一次再创建时,先从常量池中查找是否有对象的值,如果存在将将其索引指向常量池中的值,如果不存在则创建,并将值放在常量池中。 String是被final修饰的不能被继承。String的本质是char类型的数组

 

数组实在内存里一系列连续的存储空间,有下标,查询效率快

List集合的本质是数组,长度不固定,可以扩展

 

集合排序,让集合中的对象实现comparable接口(和别人比较)或者compartor接口(和自己比较)然后调用collections是sort方法

 

阻塞队列:多线程环境下,当队列中没有空间时,生产者暂时停止生产,当队列中没有数据时暂时停止消费,提醒生产。就是作为缓冲区,解耦提高性能。

打比方说,卖电影票,生产者生产的票放在前台卖,消费者从前台买票,当生意不好时,票卖不出去,前台提醒生产者暂时不要生产票,当处于热季时,生产的表不够消费,让其等待,通知生产者生产。

 

线程池:不用创建和销毁线程,提高性能。获取线程

有固定数量的线程池(Fied)、带着缓冲区的线程池(cached)、带着任务调度的线程池(scheduled),可以设置线程执行的优先级。一个线程的线程池(single)

数据库连接池就是获取连接。Druid 性能好,稳定

设计思想都是:减少资源的频繁创建于销毁。、

 

线程join,将线程的并行执行变成串行执行。

在共享变量上加volatile关键字,告诉编译器针对此共享变量,不进行编译。从而保证线程安全

 

进程中可以有多个线程,进程之间没有共享内存。

高并发:好多人同时欧一件事

Web中的高并发出现在HTTPserver与数据库连接:

数据库:

使用缓存、Redis是基于内存的keyvalue形式的菲关系型分布式数据库缓存,策略使用的是lru(最近最少使用,长度固定)

数据库连接池、尽量接受减少数据库连接

表设计、建立合适的索引

SQL优化:避免三表以上关联、两表join小标放前

 

随机读写表:randomAccessFile

序列化:objectOutputstream,不能跨平台、将对象从内存中存入网络\磁盘

反序列化:objectinputstream,把对象从网络、磁盘中读到内存

 

设计者模式:

单例模式,保证只能有一个实例,懒汉式:当第一次调用是实例化。饿汉:在类初始化时,就已经自动的实例化自己。---防止频繁创建对象导致oom(没存溢出)

适用于:创建对象时,消耗大量资源

工厂模式:我们在创建对象时,直接从工厂中取对象。屏蔽了底层实现。解耦

适用于:Spring框架

动态代理:当我们项调用一个接口,我们把调用接口的方法和参数通过一个代理传递对方,代理通过反射来实例化这个接口的实例,并且invoke这个接口实例。

构建者模式

对象的参数有很多,调用的参数个数又不固定。使用构建者模式就不用再过多的构造方法,防止代码冗余。

 

Web服务器:Tomcat、NGINX:静态代理服务器,不处理业务逻辑,负载均衡、地址分发支持高并发、

Spring IOC:依赖注入,也叫做控制反转,

Aop:面向切面编程

 

事物:一些业务的一次操作作为一个事物,要么同时成功,要么同时失败。

ACID:原子性、一致性、隔离性、持久性

Orm:对象关系映射。

Jpa:java持久层的api,是一种接口、规范,使用注解的方式来配置数据库操作,不用自己实现service只需要继承接口,屏蔽了底层实现,节省代码量。

 

Mvc:model---view----controller

 

注解本身不做任何事情,只是像xml文件一样起到配置作用。注解代表着某种业务意义,注解背后的工作原理类似于源码实现。

 

数据库:MySQL、Oracle

MySQL:存储数据量不大,支持事物,主键可以自增长

Oracle:存储数据量比较大,支持高并发,主键自增要使用序列sequence

 

Union all:直接连接,获取所有值

Union:取唯一值,union all+去重

 

数据库优化:

索引优化:尽可能将经常查询的两件做为索引

SQL语句:

尽可能避免select *

Where代替having,where执行速度快

Where执行的循序是,从下至上的

尽可能命中索引,

避免三表关联。

Union、in代替or

使用exists代替in

 

数据库引擎:Innodb支持事物

 

数据库事物隔离级别:

未提交读:数据还没有提交到内存中

提交读:出现幻读,两次读取的结果不一样,加了行锁-在读的时候在中间写入数据了

可重复读:乐观锁=行锁加区间锁,可以并行读,串行写

串行:悲观锁:顺序读写—串行读、串行写

 

Hadoop

组件:mr、hdfs、yarn

Hdfs 进程:

Namenode:保存元数据,元数据包括namespace(目录结构)、blockmap:文件所在的机器地址  资源管理、任务调度。

Datanode:任务的具体执行者,存放数据

Secondaryname:用于存放于增量数据合并成一个新文件发送给namenode

减少hdfs开启时间。

 

Yarn:

ResourceManage:监控节点状态、分配任务、控制整个系统

NodeManage:

负责执行计算任务

 

APPmaster:管理一个任务、具体任务调度者

 

Hadoop集群的搭建:

在一台机器上下载安装jdk、hadoop,编写配置文件制定各个进程所在位置,以及制定namenode、dataname,节点之间配置免密登录,通过scp发送jdk、hadoop,以及配置文件。在主节点上执行hdfs-format namenode 命令格式化,start-hdfs.sh 开启集群,通过jsp测试查看。

 

资源调度算法:

FIFO,先进先出—hdfs

公平调度:每个任务执行一段时间,交替执行

能力调度:基于时间片轮回,根据每个任务需要的资源,分配相应的任务。---yarn

 

MapReduce的流程:

input---->split---->map------>shuffer------>reduce

 

Mr数据倾斜:部分reduce节点上的key过多,执行数据过慢,导致整个任务执行的慢。

随机数+key

 

Hadoop rpc通信:

 

Hdfs读写原理:

客户端项namenode发出请求,namenode查看数据存放的快信息,将地址发送给客户端,客户端根据地址找到数据的指定位置读取数据。读取完成之后DataNode向namenode汇报情况。

 

客户端项namenode发送写请求,namenode读取快信息,开始分配块地址,并将理想的状态的节点位置返回给客户端,客户端通过rpc向DataNode串行写数据。写完之后,会把存储信息反馈给namenode。

 

Ha:通过ookeeper故障切换

 

Hadoop优化:

通过优化算法Gzip算法、合并小文件,减少namenode的内存、机架感知、本地读。

 

Mr优化:

减少reduce任务数,减少rpc通信

自定义分区。

 

Hive的原理:

Hive屏蔽的底层的mr实现。元数据存放在其他数据库,数据存放在hdfs。

 

Hive优化:

大小表join时,小表放在前面,hive会将小表放入内存,提高效率

在map端进行join,

减少job数

Hive自定义函数,

实现udf重写evaluate方法,maven打包上传,add jar 将java中的类映射到hive函数自定义中。

Hive内外表:

外表:数据并没有移动到自己的数据仓库中,也就是所外表的数据并不由自己来管理。只有使用权。

内部表:具有数据的所有权。

Hive数据倾斜:

配置项,还是解决mr的数据倾斜。

大小表join时,将小表放在前面,加载到内存中,减少资源内存

合并小文件,尽可能在map端join---减少reduce数

 

Hive中的sort By 不是全局的,数据进入reduce端之前进行排序

OrderBy:全局有序,只有一个reduce

 

分区:分区依据的字段不是表中的,有这些维度—地区、时间;查询是按区查询,优化查询

分桶:创表时,桶的个数就固定,对表中的字段进行分桶,桶内按字典排序,提高计算性能,防止数据倾斜。

数据厂库:

复制层:表示的是将数据复制过来,不改变数据结构

原子层:3NF,维度表----字段少=id+内容

汇总层:提高性能

展示层:计算结果

好处-----方便,好维护,便于管理

 

Hbase原理:

数据节点Regionserver下面有多个region,每个region存放hbase表里若干个列簇的数据,最终数据按照hfile方式存储在hdfs上。Hbase自身存储的有元数据表mate(region存放在那台机器上)和root(里面是一个表有哪些region),这两张表的元数据存放在zookeeper上,各个节点时间同步。

 

Rowkey设计原理:

  1. 不宜过长,因为数据持久化文件hfile中是安装keyvalue形式存储,key=rowkey+列簇+列,如果过长极大的影响hfile存储效率。
  2. rowkey尽可能与业务逻辑相关,将经常放在条件里面的字段作为rowkey,因为只有rowkey有个索引,尽可能命中索引。
  3. rowkey散列,负载均衡,防止写热点,取hash、反向rowkey

hbase优化:

1.预分区,创建表时,先指定若干分区,防止写热点

2.创建二级索引,1.利用Phoenix直接创建二级索引,2.使用协处理器observer,在写入数据之前,创建二级索引-----索引的索引,把rowkey与列簇数据的反向映射创建索引,检索时线检索这个索引,找到对应的rowkey,再根据rowkey查询数据。

3.分页,指定一次查询数量,批量查询

4.Redis缓存,将一些常用的数据放到缓冲,先查缓存,再查hbase。

 

Hbase优点:

查询和写入数据快以顺序读写还随机读写。将文件先缓存到menstore中在里面排序,再并将其记录日志保存到hdfs中。

 

Kafka:分布式消息队列,组成部分有producer用来获取数据,并发送topic主题、broker(服务器)、consumer消费之前将消息存放在中间服务器中,

Kafka分区:

Kafka将topic从物理上把broker划分成一个或多个分区,默认是hash分区算法。

创建分区,相当于增大了并行度。

为了更好的负载均衡、消息的顺序性。可以发送时指定分区。

日志保存策略配置:由于写入了海量数据之后,占用大量磁盘空间,如果不定时清理,可能磁盘空间不够用。Kafka默认保存7天。

Kafka数据丢失与数据重复

Produce:

设置ack=all,设置幂等—多次重复操作的效果与一次操作的效果一样。

幂等,数据发送给每个分区时,将数据做一下标记,当再次发送数据时,如果该分区有此标记数据则不再发送。

Consumer:业务逻辑与偏移量不是一个原子操作。

将业务逻辑与偏移量的提交写在同一事物中,保证他们要么同时成功,要么同时失败。并且保存的结果与偏移量在同一个地方,保证能够回滚。

Sparkstreaming与kafka整合,如何保证数据不丢失。

Sparkstreaming里面使用direct,并手动提交偏移量。

Zookeeper在kafka中起到的作用:每个topic又可以划分多个分区,没每个分区存储在一个独立的broker上,所有这些topic与broker的对应关系都有zookeeper来维护。分区的leader 与follower的故障切换。

Kafka的特点:吞吐量大,主要用于大量数据的处理。

Flume:一个分布式的日志采集工具

Sqoop:一个关系型数据库与大数据集群之间的数据迁移工具

Redis:一个基于内存的菲关系型数据库,一般讲热点数据写在Redis中用来提升性能

Java:面向对象编程,Scala是面向对象编程又是面向函数式编程。

Scala中的函数是一个对象,可以作为参数传递。

 

Spark

Sparkcore sparkstreaming sparkSQL

Rdd:弹性分布式数据集。

本质上是一个可容错的之都的分区记录集合。

每一个计算的阶段设置一个stage,然后所有的stage会生成逻辑的有向五环图,当触发action的时候,才会按照DAG进行计算。

每个分区的每次transformation称为一个task。

窄依赖:子rdd的一个分区依赖于父rd的一个分区,本地执行,不经过网络通信。

宽依赖:子rdd的一个分区依赖于父rd的多个分区,shuffle操作,需要网络通信。

Transformation:表示rdd的一次计算,生成的也是rdd,只记录不操作。Rdd与rdd之间的转换关系称为血缘(linkage)。

Action:将rdd转化成飞rdd保存到hdfs,触发job的执行。Collect,saveastaxtFile

Rdd常用函数:

Sc.parallelize

Reduce 、reducebykey、groupbykey

 

Spark优化

1.使用kyro序列化

2.高性能算子:mappartition—transformation

                    Foreachpartition---action

3.共享广播变量:broadcost

4.增大shuffle并行度。

 

数据倾斜:

  1. 聚合:将key加随机数---聚合----取前缀----再聚合
  2. Join操作:左表加前缀,右表扩充n倍。

将相同的key放在一个节点上。

Rdd是基于内存的数据集合

Mr:是将数据雷击写到磁盘上,完了再统一进行reduce

 

Rdd转化成datafrom---自定义case class ,加隐士转换todf

普通的rdd里面没有元数据。

Df是一种特殊的rdd,主要用来操作关系型数据库数据,每个字段都有字段属性和字段描述。

Dataset是rdd+schema提供了面向对象的方式来操作数据。

 

窗口计算:sparkstreaming中将多批数据化成一个区间,区间按照约定好的时间滑动,通常用来计算一段时间的数据。

 

有状态计算:updatastatusbykey

设置checkpoint,实现updatestatebykey

Acc:可变的,累加器

用于统计处理的条数,进程间的

Broadcast:广播变量,不可变的,提高性能。

不能广播rdd其他都能广播。

 

Rdd的本质就是一个list集合。

猜你喜欢

转载自blog.csdn.net/qq_38617531/article/details/85238970
今日推荐