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使用的是一个Dataflow图。
1.4 简述一下spark和flink的区别
技术理念不同:spark使用微批来模拟流的计算,而flink是基于事件驱动的,也就是有状态的流处理应用程序,是真正的流式计算。
1.5 flink如何处理延迟数据?
在处理事件时间时可以使用水印机制处理延迟数据,水印(watermark)就是一个时间戳,Flink可以给数据流添加水印,允许一定延迟的时间戳。
1.6 flink容错机制如何保证?
checkpoint机制
1.7 flink支持哪些时间语义?
(1)处理时间(Processing Time):时间被处理时机器的系统时间。
(2)事件时间(Event Time):事件自身的时间。
(3)摄入时间(Ingestion Time):事件进入Flink的时间。
1.8 spark和flink的action操作有哪些?
Spark:
(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:
似乎没有action操作这概念,一定要说就是execute()执行方法。flink程序都是通过延迟计算(lazily execute)的方式执行,只有在调用execute()方法时,系统才会触发程序执行。
1.9 hadoop HA高可用?
hadoop高可用有ActiveNameNode和StandbyNameNode,使用zookeeper服务进行主备NN的切换。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)线程隔离的数据区:虚拟机栈,本地方法栈,程序计数器
除了基本类型,在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支持以函数为参数的方法Java不支持
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编写不同接口。
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:
若此步骤不成功,应该就是路由器到目的主机的网络有问题
持续更新。。。