吐血整理出来的大数据知识点,你掌握多少?

前言

hi!我是啊晨 ,一个大数据分享者,好久没发博客了,最近忙于找工作,然后顺带整理了一些资料,相信也有一部分好兄弟,也在苦于找工作,或者正在学习大数据的知识,不太会总结的。我只能这样说,你来对了。
这里大概的罗列了一些,面试常会问频率高一些的点,或者我面试遇到的一些问题,不是很全面,后续会补充,很多但没废话。
也可以阅读我的其它大数据文章,抱拳!
中间有什么问题好兄弟们一定要留言:

在这里插入图片描述

正片

语言工具类

这里只针对可能会面试到的,像Scala、Python面试也没啥问的,这里就不列举了

Java

实现线程的两种方式

1、继承Thread类,重写run方法
2、实现Thread类的Runnable接口,重写run方法

两者区别:1不会共享线程,四个都是100张票,2会共享线程,多数采用第二种方式。

集合
List集合

有序可重复
add添加
get获取索引位置元素
remove 移除
set 设置
listiterator 特有迭代器

ArrayList

大小可变的数组的实现。
有序可重复,线程不安全。

初识为10,容量一般是1.5倍扩容。

遍历方式:
迭代器
list特有的
for:一般for和增强for(1.5jdk的新特性)

LinkedList

有序,可重复,底层双向链表。

和ArrayList、vector区别:
linkedlist 增删快,查询慢,线程不安全
ArrayList 增删慢,查询快,线程不安全
vector 线程安全,用法同ArrayList

Set集合

不重复,无序

HashSet

对于自定义类,需要手动进行去重的操作。
重写hashCode与equals方法。

储存原理:
① 调用对象的hashCode方法算出对象的哈希码值,通过该值经过哈希算法,算出该对象在该集合中存储的位置。
② 如果该位置没有元素,就直接放置在该位置,但是如果该位置有元素,此现象称为哈希冲突也叫哈希碰撞,会 通过equals方法比较该位置的两个对象,如果相等,则不插入。
③ 如果不相等,会在该位置下以线性链表的形式插入。但是在1.8jdk之后,当线性链表长度大于等于8时,该结构 改为 红黑树的结构。(1.8jdk之后,发生哈希冲突,以链表+红黑树的形式存储。)

构造方法:hashset()初识容量是16

二叉查找树

左侧的节点永远小于根节点,右侧的节点永远大于根节点。

红黑树 就是一种自平衡二叉查找树。

TreeSet

基于红黑树的实现,无序不重复,可排序

排序实现comparable接口,实现compareTo方法

LinkedHashset

用于购物车,有不重复
链表+哈希表

collections 集合工具类

Stack 栈:先进后出
Queue 队列:先进先出

Map集合

collection 单列集合:每个储存元素都是一个对象
map:双列集合,键值对

put 添加、get获取、remove 移除、size长度

map的子类:
HashMap:底层 哈希表结构。

遍历:
list集合遍历 : 1》 迭代器 2》 for循环 3 3》 ListIterator set集合 : 1》 迭代器 2》 for循环 (增强for循环 )

① keySet() 返回key的set集合形式。
② entrySet() 返回entry形式的set集合

TreeMap

HashMap: key的特性: 无序 不重复 .底层是哈希表

TreeMap: key的特性: 可排序 不重复 。底层是红黑树。

HashTable

HashTable :哈希表 。线程安全的
与HashMap区别 :
① HashMap 线程不安全的。
② HashTable 线程安全的。

JVM

JVM内存分哪几个区,每个区的作用是什么?
在这里插入图片描述

方法区:(被加载的信息,常量,静态变量编译后的代码等数据)

a.有时候也成为永久代,在该区内很少发生垃圾回收,但是并不代表不发生GC,在这里进行的GC主要是对方法区里的常量池和对类型的卸载

b.方法区主要用来存储已被虚拟机加载的类的信息、常量、静态变量和即时编译器编译后的代码等数据。

c.该区域是被线程共享的。

d.方法区里有一个运行时常量池,用于存放静态编译产生的字面量和符号引用。该常量池具有动态性,也就是说常量并不一定是编译时确定,运行时生成的常量也会存在这个常量池中。

虚拟机栈:(java方法服务,储存局部变量方法出口等)

所称的栈内存,它为java方法服务,每个方法在执行的时候都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接和方法出口等信息。
虚拟机栈是线程私有的,它的生命周期与线程相同。
局部变量表里存储的是基本数据类型、returnAddress类型(指向一条字节码指令的地址)
和对象引用,这个对象引用有可能是指向对象起始地址的一个指针,也有可能是代表对
象的句柄或者与对象相关联的位置。局部变量所需的内存空间在编译器间确定
操作数栈的作用主要用来存储运算结果以及运算的操作数,它不同于局部变量表通过索
引来访问,而是压栈和出栈的方式

本地方法栈

和虚拟机栈类似,只不过本地方法栈为Native(本地)方法服务。

堆(对象实例创建,垃圾回收操作)

所有线程所共享的一块内存,在虚拟机启动时创建,几乎所有的对象实例都在这里创建,因此该区域经常发生垃圾回收操作。

程序计数器

分支、循环、跳转、异常处理和线程恢复等功能都需要依赖这个计数器完成,该内存区
域是唯一一个java虚拟机规范没有规定任何OOM(内存用完了)情况的区域。

Java自带哪几种线程池?(4)

1)newCachedThreadPool(缓存)

可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
工作线程的【创建数量几乎没有限制】(其实也有限制的,数目为Interger.
MAX_VALUE),这样可灵活的往线程池中添加线程。【注意控制任务数量,同时大量运行可能系统瘫痪】

如果长时间没有往线程池中提交任务,即如果工作线程空闲了指定的时间(默认为1
分钟),则该工作线程将自动终止。终止后,如果你又提交了新的任务,则线程池重新创
建一个工作线程。
在使用CachedThreadPool时,一定要注意控制任务的数量,否则,由于大量线程同时
运行,很有会造成系统瘫痪。

2)newFixedThreadPool(固定)

创建一个指定工作线程数量的线程池。
没提交一个任务就创建一个工作线程,达到最大,将任务存入池队列。
典型优秀的线程池,提高程序效率节省创建开销。但是如果没【运行任务时,不会释放,占用系统资源。】

3)newSingleThreadExecutor(单线程)

单线程话的executor,唯一的线程执行任务,指定顺序(FIFO,LIFO,优先级)执行。
【顺序执行各个任务,任意时间不会有多个线程】

4)newScheduleThreadPool(时间)

创建一个【定长的线程池】,而且支持【定时的以及周期性的任务执行】,支持定时及周期性任务执行。【延迟3秒执行】。

HashMap和HashTable区别

1)线程安全性不同

【HashMap是线程不安全的】,【HashTable是线程安全的】,其中的方法是【Synchronize】的,【多线程并发】,可直接【hashtable】,【hashmap必须加同步处理】

2)是否提供contains方法

HashMap只有containsValue和containsKey方法;
HashTable有contains、containsKey
和containsValue三个方法,其中contains和containsValue方法功能相同。

3)key和value是否允许null值

HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。
Hashtable中,key和value都不允许出现null值。

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

HashMap不指定容量默认为16,HashTable为11。
Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。
HashMap扩容变2倍,Hashtable2倍加1

TreeSet和HashSet区别

HashSet是采用【hash表】来实现的。其中的元素【没有按顺序排列】,add()、remove()以及contains()等方法都是复杂度为O(1)的方法。
【无序,访问遍历快】
TreeSet是采用树结构实现(【红黑树算法】)。元素是【按顺序进行排列】,但是add()、
remove()以及contains()等方法都是复杂度为O(log(n))的方法。
【有序,排序用】

Stringbuffer和Stringbuild区别

方法和功能是等价的
【StringBuffer】采用了synchronized关键字进行修饰,因此是【线程安全的】,而【StringBuilder】没有这个修饰,可以被认为是线程【不安全的。】
单线程程序下,StringBuilder效率快,StringBuffer相对慢

Final、Finally、Finalize

final:修饰符(关键字)有三种用法:修饰类、变量和方法。
(修饰类时,意味着它不能再派生出新的子类,即不能被继承,因此它和abstract是反义词。修饰变量时,该变量使用中不被改变,必须在声明时给定初值,在引用中只能读取不可修改,即为常量。修饰方法时,也同样只能使用,不能在子类中被重写。)
finally:通常放在【try…catch】的后面构造最终执行代码块,这就意味着程序【无论正常执
行还是发生异常,这里的代码只要JVM不关闭都能执行】,可以将【释放外部资源的代码写在
finally块中。】
finalize:Object类中定义的方法,Java中允许使用finalize()方法在垃圾收集器将对象
从【内存中清除】出去之前做必要的【清理工作】。这个方法是由【垃圾收集器】在销毁对象时调用的,通过重写finalize()方法可以【整理系统资源】或者执行【其他清理工作。】

==和Equals区别

== :如果比较的是基本数据类型,那么比较的是变量的值,如果比较的是引用数据类型,那么比较的是地址值(两个对象是否指向同一块内存) equals:如果没重写equals方法比较的是两个对象的地址值。如果重写了equals方法后我们往往比较的是对象中的属性的内容
equals方法是从Object类中继承的,默认的实现就是使用 ==

在这里插入图片描述

Java类加载过程?
1)加载

加载时类加载的第一个过程,在这个阶段,将完成一下三件事情:
a.通过一个类的全限定名获取该类的二进制流。
b.将该二进制流中的静态存储结构转化为方法去运行时数据结构。
c.在内存中生成该类的Class对象,作为该类的数据访问入口

2)验证

验证的目的是为了确保Class文件的字节流中的信息不回危害到虚拟机.在该阶段主要完成
以下四钟验证:
a.文件格式验证:验证字节流是否符合Class文件的规范,如主次版本号是否在当前虚拟
机范围内,常量池中的常量是否有不被支持的类型.
b.元数据验证:对字节码描述的信息进行语义分析,如这个类是否有父类,是否集成了不
被继承的类等。
c.字节码验证:是整个验证过程中最复杂的一个阶段,通过验证数据流和控制流的分析,确定程序语义是否正确,主要针对方法体的验证。如:方法中的类型转换是否正确,跳
转指令是否正确等。
d.符号引用验证:这个动作在后面的解析过程中发生,主要是为了确保解析动作能正确执
行。
e.准备
准备阶段是为类的静态变量分配内存并将其初始化为默认值,这些内存都将在方法区中进行
分配。准备阶段不分配类中的实例变量的内存,实例变量将会在对象实例化时随着对象一起
分配在Java堆中。

3)解析

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

4)初始化

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

java中垃圾收集的方法?
1)引用计数法

(每引用回收,需要维护一个引用计算器)

应用于:微软的COM/ActionScrip3/Python等
a)如果对象没有被引用,就会被回收,缺点:需要维护一个引用计算器

2)复制算法

(效率高,内存需求大.使用在占空间比较小刷新次数多的新生区)

年轻代中使用的是MinorGC,这种GC算法采用的是复制算法(Copying)
a)效率高,缺点:需要内存容量大,比较耗内存
b)使用在占空间比较小、刷新次数多的新生区

3)标记清除

(效率低,会产生碎片)

老年代一般是由标记清除或者是标记清除与标记整理的混合实现
a)效率比较低,会差生碎片

4)标记压缩

(效率低速度慢,需要移动对象,但不会产生碎片)

老年代一般是由标记清除或者是标记清除与标记整理的混合实现
a)效率低速度慢,需要移动对象,但不会产生碎片。

5)标记清除压缩

(使用占空间大刷新次数小的养老区,3,4的集合体)

标记清除标记压缩的集合,多次GC后才Compact
a)使用于占空间大刷新次数少的养老区,是34的集合体

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

引用计数法
可达性算法(引用链法)

什么是类加载器,类加载器有哪些?

实现通过类的权限定名获取该类的二进制字节流的代码块叫做类加载器。

主要有一下四种类加载器:
1)启动类加载器(BootstrapClassLoader)用来加载java核心类库,无法被java程序直接引用。

2)扩展类加载器(extensionsclassloader):它用来加载Java的扩展库。Java虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载Java类

3)系统类加载器(systemclassloader)也叫应用类加载器:它根据Java应用的类路径(CLASSPATH)来加载Java类。一般来说,Java应用的类都是由它来完成加载的。可以通过ClassLoader.getSystemClassLoader()来获取它。

4)用户自定义类加载器,通过继承java.lang.ClassLoader类的方式实现。

简述Java内存分配与回收策略以及MinorGC和MajorGC(fullGC)
内存分配

1)栈区:栈分为java虚拟机栈和本地方法栈

2)堆区:堆被所有线程共享区域,在虚拟机启动时创建,唯一目的存放对象实例。堆区是
gc的主要区域,通常情况下分为两个区块年轻代和年老代。更细一点年轻代又分为Eden
区,主要放新创建对象,Fromsurvivor和Tosurvivor保存gc后幸存下的对象,默认
情况下各自占比8:1:1。

3)方法区:被所有线程共享区域,用于存放已被虚拟机加载的类信息,常量,静态变量等
数据。被Java虚拟机描述为堆的一个逻辑部分。习惯是也叫它永久代(permanment
generation)

4)程序计数器:当前线程所执行的行号指示器。通过改变计数器的值来确定下一条指令,
比如循环,分支,跳转,异常处理,线程恢复等都是依赖计数器来完成。线程私有的。

回收策略以及Minor(次要)GC和Major(主要)GC:

1)对象优先在堆的Eden区分配。

2)大对象直接进入老年代。

3)长期存活的对象将直接进入老年代。当Eden区没有足够的空间进行分配时,虚拟机会执行一次MinorGC.MinorGC通常发生在新生代的Eden区,在这个区的对象生存期短,往往发生GC的频率较高,回收速度比较快;

FullGc/MajorGC发生在老年代,一般情况下,触发老年代GC的时候不会触发MinorGC,但是通过配置,可以在FullGC之前进行一次MinorGC这样可以加快老年代的回收速度

J.U.C(java.util.concurrent)
Synchronized与Lock的区别

1)Synchronized能实现的功能Lock都可以实现,而且Lock比Synchronized更好用,更灵活。
2)Synchronized可以自动上锁和解锁;Lock需要手动上锁和解锁

Runnable和Callable的区别

1)Runnable接口中的方法没有返回值;Callable接口中的方法有返回值
2)Runnable接口中的方法没有抛出异常;Callable接口中的方法抛出了异常
3)Runnable接口中的落地方法是run方法;Callable接口中的落地方法是call方法

什么是分布式锁

当在【分布式模型下,数据只有一份(或有限制)】,此时需要利用锁的技术控制【某一时刻
修改数据的进程数】。
分布式锁可以【将标记存在内存】,只是该内存不是某个进程分配的内存而是【公共内存】,如【Redis】,通过set(key,value,nx,px,timeout)方法添加分布式锁。

什么是分布式事务

事务的参与者,支持事务的服务器,资源服务器,以及事务管理器分别位于不同的分布式系统的不同节点。
(一次大操作,有不同小操作组成,这些小操作分布在不同的服务器上,且属于不同应用,分布式要保证这些操作全成功或全失败)

IO

① 功能(方向) :
1 输入流: InputStream/Reader
2 输出流: OutputStream/Writer
② 操作的数据的位数(数据类型):
1 字节流:InputStream/OutputStream
2 字符流:Reader/Writer

Linux

一般就直接问平常常用的命令有哪些?
不要说一些很掉价的命令:cd cd … ll ls mv cp.
说些高大上的:grep find tar -zxvf和-zcvf whereis kill-9 (这里不知道需要反思一下了)
top 查看内存 、df -h 查看磁盘储存情况 、iotop 磁盘io读写情况、ps aus和ps -ef 查看进程
shell高级命令:cut(剪数据)、sed(编辑器,一次一行)、awk(文本分析工具)、sort(排序)
以上高级awk,sed要一定记住的。
(shell开头:#!/bin/bash)

数据采集类

Flume

分布式的海量日志采集、聚合和传输的系统

Flume工作机制是什么?

核心概念是agent,里面包括source、chanel和sink三个组件。
source运行在日志收集节点进行日志采集,之后临时存储在chanel中,sink负责将chanel中的数据发送到目的地。
只有成功发送之后chanel中的数据才会被删除。
首先书写flume配置文件,定义agent、source、chanel和sink然后将其组装,执行flumeng命令。

Flume组成,Put事务,Take事务
source

TaildirSource:断点续传、(失败可从失败的地方继续上传)多目录。
【Flume1.6以前需要自己自定义Source记录每次读取文件位置,实现断点续传】

【Apache1.7版本产生的taildirsource】

如果挂了,可能重复数据,不会丢失。
不处理,企业中很多不处理,会影响性能。(一般不挂)
处理:增加事务:
在下一级处理:hive dwd 层;sparkstreaming(数据小),redis(大)。开窗取第一条,或分组。

是否支持递归?
默认不支持:自定义->递归代码(遍历文件夹)+读取文件(调用读取的方法)

channel

FileChannel:数据存储在磁盘,宕机数据可以保存。但是传输速率慢。适合对数据传输可靠性要求高的场景,比如,金融行业。

默认储存:100万

MemoryChannel:数据存储在内存中,宕机数据丢失。传输速率快。适合对数据传输可靠性要求不高的场景,比如,普通的日志数据。

默认储存:100个

KafkaChannel:减少了Flume的Sink阶段,提高了传输效率。

那个版本产生的?
1.6,开始没火,数据:topic+内容 =》还要清洗
1.7 时解决了bug

在生产环境怎么选?
下一级是Kafka,优先选择Kafkachannel

如果公司比较看重可靠性(金融公司,或者跟钱有关的);filechannel
如果公司比较看重效率(普通的日志)memory channel

sink

hdfs flume->Kafka->flume->hdfs
hdfs sink 小文件
三个参数:文件大小(128),时间(1-2小时),event个数(禁用)

事务

Source到Channel是Put(移动)事务
Channel到Sink是Take(取)事务

自定义拦截器&采集多条数据

采集多条自定义俩拦截器,ETL拦截器,日志类型区分拦截器
etl:主要过滤不合法的时间戳和json数据不完整的日志(判断是否{开头}结尾)

日志类型区分拦截器:将启动日志和事件日志区分开来,发往kafka的不同topic。
(start启动、和event事件)

作用于source之后,channel之前,不要太复杂占用时间

拦截器不要行不行?
可以=》在下一级处理:hive的dwd,sparksteaming

对传输要求不高,就可以使用,要求高的尤其是推荐,那就不在这做。

ETL工具类

sqoop

大数据生态体系中数据传输层的工具,完成Haoop文件存储体系(HDFS、Hive、HBase)与关系型数据库(MySQL)之间的数据导入导出。

Sqoop原理

将导入或导出命令翻译成MapReduce程序来实现(没有reducetask,不需要,因为Sqoop只是读取数据,输出数据,不需要合并计算等操作)
在翻译出的MapReduce中主要是对InputFormat和OutputFormat进行定制。
import(导入)原理:通过指定的分隔符进行数据切分,将分片传入各个map中,在map任务中在每行数据进行写入处理没有reduce。
export(导出)原理:根据要操作的表名生成一个java类ÿ

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值