zoukankan      html  css  js  c++  java
  • 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设计原理:

    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集合。

  • 相关阅读:
    python之新手一看就懂的小说爬虫
    Mysql与Oracle区别
    Java面试2018常考题目汇总(一)(转)
    单例式的优缺点和使用场景
    设计模式之单例模式通俗理解
    IntelliJ Idea 最常用快捷键
    sql语句基础和提升
    Tomcat 安装配置
    Git基本常用命令
    Java练手题
  • 原文地址:https://www.cnblogs.com/pigdata/p/10305547.html
Copyright © 2011-2022 走看看