1.大数据技术
1.1 描述一下checkpoint的流程?
Checkpoint其实就是所有任务的状态,在某个时间点的一份拷贝(一份快照),这个时间点应该是所有任务都恰好处理完一个相同的输入数据的时候。
1.2 描述一下两阶段提交?
对于每个checkpoint,sink任务会启动一个事务,并将接下来所有接收的数据添加到事务里,然后将这些数据(流式的)写入外部sink系统,但不提交他们 -- 这时只是预提交(一个个写入),当它收到checkpoint完成的通知时,它才正式提交事务,实现结果的真正写入(一次性确认),这种方式真正实现了exactly-once,它需要一个提供事务支持的外部sink系统,Flink提供了TwoPhaseCommitSinkFunction接口。
两阶段提交保证了flink端到sink端的精确一次语义(exactly-once)
1.3 描述一下Spark的DAG原理?
DAG(Directed Acyclic Graph)有向无环图,Spark中使用DAG对RDD的关系进行建模,描述了RDD的依赖关系,这种关系也被称之为lineage"血统",RDD的依赖关系使用Dependency维护,Dependency分为宽依赖(一个父RDD被多个子RDD分区使用,有shuffle)和窄依赖(一个父RDD只被一个子RDD分区使用),DAG在Spark中对应的实现为DAGScheduler。
用户提交的 Flink Job 会被转化成一个 DAG 任务运行。一个 Flink 任务的 DAG 生成计算图大致经历以下三个过程:
StreamGraph最接近代码所表达的逻辑层面的计算拓扑结构,按照用户代码的执行顺序向 StreamExecutionEnvironment 添加 StreamTransformation 构成流式图。 JobGraph从 StreamGraph 生成,将可以串联合并的节点进行合并,设置节点之间的边,安排资源共享 slot 槽位和放置相关联的节点,上传任务所需的文件,设置检查点配置等。相当于经过部分初始化和优化处理的任务图。 ExecutionGraph由 JobGraph 转换而来,包含了任务具体执行所需的内容,是最贴近底层实现的执行图。
1.4 简述一下spark和flink的区别
技术理念不同:spark使用微批来模拟流的计算,而flink是基于事件驱动的,也就是有状态的流处理应用程序,是真正的流式计算。
1.5 flink如何处理延迟数据?
在处理事件时间时可以使用水印机制处理延迟数据,水印(watermark)就是一个时间戳,Flink可以给数据流添加水印,允许一定延迟的时间戳。watermark=max event time - late threshold,当前窗口的水印=到前一个窗口为止最大的事件时间-允许延迟的阈值
1.6 flink容错机制如何保证?
checkpoint机制
1.7 flink支持哪些时间语义?
(1)处理时间(Processing Time):时间被处理时机器的系统时间。
(2)事件时间(Event Time):事件自身的时间。
(3)摄入时间(Ingestion Time):事件进入Flink的时间。
1.8 spark和flink的action操作有哪些?
Spark:
Spark RDD的缓存和checkpoint是懒加载操作,只有action触发的时候才会真正执行。
Spark的Action操作包括:
(1)获取元素
collect(), first(), take(n), takeSample(withReplacement, num, [seed]), takeOrdered(n, [ordering])
(2)计数元素
count(), countByKey()
(3)迭代元素
reduce(func), foreach(func)
(4)保存元素
saveAsTextFile(path), saveAsSequenceFile(path), saveAsObjectFile(path)
Flink:
flink程序都是通过延迟计算(lazily execute)的方式执行,只有在调用execute()方法时,系统才会触发程序执行。
1.9 hadoop HA高可用?
hadoop高可用有ActiveNameNode和StandbyNameNode,使用zookeeper服务进行主备NameNode的切换。namenode主要是给子节点分配任务。
1.10 spark调优?
1)常用参数的修改,包括driver、executor memory大小、核数设置
2)避免创建重复RDD,尽量复用同一份数据
3)尽量避免使用shuffle类算子,因为shuffle是spark中最消耗性能的地方,reduceByKey、join、distinct、repartition等算子都会触发shuffle操作,尽量使用map类的非shuffle算子
4)用aggregateByKey和reduceByKey替代groupByKey,因为前两个是预聚合操作,会在每个节点本地对相同的key做聚合,等其他节点拉取所有节点上相同的key时,会大大减少磁盘IO以及网络开销。
5)mapPartitions操作替代普通map,foreachPartitions替代foreach
6)尽量避免在一个Transformation中处理所有的逻辑,尽量分解成map、filter之类的操作
1.11 描述一下mapreduce计算模型?
1.12 flink checkpoint和savepoint的区别?
保存点和检查点的工作原理一致,保存点是手动触发的,而检查点是自动触发的。
1.13简述一下HDFS文件读写过程
1.14对HDP和CDH的了解
两者都是Hadoop的第三方发行版,Hortonworks版本(Hortonworks Data Platform,简称“HDP”),Cloudera版本(Cloudera Distribution Hadoop,简称“CDH”),提供了部署、安装、配置工具,大大提高了集群部署的效率,HDP使用开源工具Ambari安装,CDH使用Cloudera Manager工具安装。
2.Java
2.1 对jvm的理解?
在Java SE 7版中可以将jvm分成5个区域,分别是
(1)所有线程共享的数据区:方法区(编译器编译后的代码等数据),堆(对象实例和数组)
(2)线程隔离的数据区:虚拟机栈,本地方法栈,程序计数器
Spark中的RDD实际上是Java对象,所以它被存放在JVM中的堆中,因为堆中存放的是对象与数组实例,所以垃圾回收主要在堆中进行(也有可能在方法区中)
堆和方法区是所有线程共享的资源,其中堆是进程中最大的一块内存,主要用于存放新创建的对象 (所有对象都在这里分配内存),方法区主要用于存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
每个线程都分配一个独享的栈stack,所有线程共享一个堆heap。
2.2 反射可以做到什么?
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取类信息以及动态调用对象方法的功能称为java语言的反射机制。
2.3 多态的理解?
多态是同一个行为具有多个不同的表现形式或形态的能力。
Java普通函数就相当于C++的虚函数,动态绑定是Java的默认行为。
可以分成编译时多态和运行时多态:编译时多态主要指方法的重载;运行时多态指程序中定义的对象引用所指向的具体类型在运行期间才确定。其中运行时多态的三个必要条件:继承、重写、父类引用指向子类对象。
2.4 JUC并发的了解
内存可见性问题:当多个线程操作共享数据时,彼此不可见。也就是两个线程一个修改A,还未同步到主存,另一个就读取A,读取到未修改的A,而主存是不会自动刷新的,所以一直拿到的是未修改的A。
解决1:synchronized
这个关键字修饰的方法或者代码块能保证代码串行化的执行(同一时间只能有一个线程获取执行权限)。当线程释放一个锁时会强制性的将工作内存中之前所有的写操作都刷新到主内存中去,而获取一个锁则会强制性的重新加载可访问到的值到线程工作内存中来。所以可以使用锁来解决内存可见性问题。
解决2:volatile
当多个线程操作共享数据时,可以保证内存中的数据可见以及禁止指令重排。用这个关键字修饰共享数据,就会及时的把线程缓存中的数据刷新到主存中去,也可以理解为,就是直接操作主存中的数据。
volatile和synchronized的区别:
volatile不具备互斥性(当一个线程持有锁时,其他线程进不来,这就是互斥性)。
volatile不具备原子性。
原子性:所谓原子性就是操作不可再细分。JDK 1.5之后,Java提供了原子变量,在java.util.concurrent.atomic包下提供了不同类型的原子操作类型及方法,原理采用了CAS算法。
除了基本类型,在java.util.concurrent包中提供了多种并发容器类来改进同步容器类的性能。其中最主要的就是ConcurrentHashMap。java 8后也使用了CAS算法。
CAS算法是计算机硬件对并发操作共享数据的支持,CAS包含3个操作数:内存值V、预估值A、更新值B。当且仅当V==A时,才会把B的值赋给V,即V = B,否则不做任何操作。
Lock同步锁:通过lock()方法上锁,通过unlock()方法释放锁。为了保证锁能释放,所有unlock方法一般放在finally中去执行。
等待唤醒机制:使用this.wait(),this.notifyAll()等操作进行
ReadWriterLock读写锁:我们在读数据的时候,可以多个线程同时读,不会出现问题,但是写数据的时候,如果多个线程同时写数据,那么到底是写入哪个线程的数据呢?所以,如果有两个线程,写写/读写需要互斥,读读不需要互斥。这个时候可以用读写锁。
线程池:和连接池差不多,连接池是为了避免频繁的创建和释放连接,所以在连接池中就有一定数量的连接,要用时从连接池拿出,用完归还给连接池。线程池也一样。线程池中有一个线程队列,里面保存着所有等待状态的线程。
2.5 java中深拷贝和浅拷贝的区别
1)浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。也就是New了一个拷贝的对象,但拷贝的对象中引用的对象仍是一个引用。
2)深拷贝:深拷贝是一个整个独立的对象拷贝,深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大。简而言之,深拷贝把要复制的对象所引用的对象都复制了一遍。
3.scala
3.1 Trait特征的理解?
特征相当于java的接口,与接口不同的是它可以定义属性和方法的实现(强大),通过trait可以实现scala的多重继承。子类继承特征可以实现未被实现的方法。所以其实 Scala Trait(特征)更像 Java 的抽象类。
3.2 scala和java的区别?
scala不支持接口,采用trait特征;scala提供伴生对象来实现单例;scala支持以函数为参数的方法Java1.7以前不支持,java1.8支持以Lambda表达式作为函数的参数进行传递。
4.算法
4.1 描述一下动态规划的基本思想?
动态规划和分治法类似,都是构造子问题的解来求解原问题,不同的是动态规划是解决重叠子问题的,将子问题求解结果记录在表格中,以空间换取时间。
其次是最优子结构,最优解肯定是有最优的子解转移推导而来,子解必定也是子问题的最优解。
最后是无后效性,也就是求出来的子问题并不会因为后面求出来的改变。
典型动态规划问题:背包问题:01背包问题,完全背包问题。
4.2 理解哪些数据结构?简述一下链表、红黑树等数据结构
队列:单队列、循环队列;集合:HashSet(哈希表结构)、TreeSet(红黑树结构);链表:单链表、双链表、循环链表;树:二叉树、完全二叉树、堆、二叉查找树、平衡二叉树
5.其他
5.1 大数据常用组件和功能?
hdfs是分布式存储系统;yarn是分布式资源管理系统;mapreduce是hadoop的计算框架;zookeeper是分布式协调服务;hbase是hadoop下的分布式数据库;hive是分布式数据仓库,是一个数据分析工具,底层使用mapreduce;Sqoop将传统数据导入hdfs或hbase的一个工具;spark基于内存的分布式处理框架;flink是分布式流处理框架;kafka是一个分不熟流处理平台;Avro是Hadoop的一个数据序列化系统;
5.2 深拷贝和浅拷贝的区别?
深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。深拷贝(实体)浅拷贝(引用)
5.3 队列模型和kafka模型的区别?
队列模型一条消息只能被一个消费者使用,kafka使用发布订阅模型,采用topic发布消息给所有订阅者,也就是可以被多个消费者使用。
5.4 简述一下序列化的作用
序列化(Serialization)是将数据结构或对象状态转换为可以存储(例如,在文件或存储器缓冲区中)或传输(例如,通过网络连接)的格式的过程, 反序列化(Deserialization)则是从一系列字节中提取数据结构的相反操作.
总结三个作用:1)永久性保存对象2)通过序列化以字节流的形式在网络中传递对象3)通过序列化在进程间传递对象
6.linux
6.1 linux进行大数据故障的排错命令你用到哪些?
查看端口占用情况:(1)lsof -i:端口号(2)netstat -tunlp |grep 端口号
查看内存使用情况:(1)实时使用情况"top"(2)free -m
7.操作系统
7.1 死锁产生的四个必要条件
(1)互斥(2)不可剥夺(3)部分分配(4)循环等待
8.消息队列
8.1 为什么使用消息队列?消息队列的好处?
有3点:解耦、异步和削峰
(1)解耦:系统A将数据发送到MQ中,让不同系统BCD自己去消费,而不需要A系统为BCD编写不同接口。
(2)异步:系统A将任务发送给MQ,让BCD自己去消费执行任务,不要A系统调用BCD任务而等待。
(3)削峰:将请求放入MQ中,系统按自身能力去消费执行一定数量的请求。
8.2 为什么大数据实时计算使用Kafka这个消息队列?Kafka对比其他MQ有什么优势?
kafka具有高的吞吐量,内部采用消息的批量处理,zero-copy机制,数据的存储和获取是本地磁盘顺序批量操作,具有O(1)的复杂度,消息处理的效率很高。社区活跃度高。
9.网络
9.1网络故障排查四步:
(1)ping localhost:
localhost的IP地址一般为127.0.0.1, 也称loopback(环回路由);如果此时ping不通,则表示协议栈有问题;ping 该地址不经过网卡,仅仅是软件层面
(2)ping 本机IP:
ping 本机IP其实是从驱动到网卡,然后原路返回;所以如果此时ping不通,则表示网卡驱动有问题,或者NIC硬件有问题;
(3)ping 网关:
所谓网关,就是连接到另外一个网络的“关卡”, 一般为离我们终端最近的路由器;可以使用ipconfig (windows)或ifconfig (Linux)查看;若此时ping不通,则为主机到路由器间的网络故障;
(4)ping 目的IP:
若此步骤不成功,应该就是路由器到目的主机的网络有问题
持续更新。。。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。