JAVA与大数据面试总结(二)
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设计原理:
- 不宜过长,因为数据持久化文件hfile中是安装keyvalue形式存储,key=rowkey+列簇+列,如果过长极大的影响hfile存储效率。
- rowkey尽可能与业务逻辑相关,将经常放在条件里面的字段作为rowkey,因为只有rowkey有个索引,尽可能命中索引。
- 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并行度。
数据倾斜:
- 聚合:将key加随机数---聚合----取前缀----再聚合
- 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集合。