请问这个二叉树遍历问题如何解决?


运行到一定程度后,Reduce 也开始运行,减少 Reduce 的等待时间。

3)规避使用 Reduce,因为 Reduce 在用于连接数据集的时候将会产生大量的网络消耗。

4)增加每个 Reduce Map 中拿数据的并行数

5)集群性能可以的前提下,增大 Reduce 端存储数据内存的大小。

1)采用数据压缩的方式,减少网络 IO 的的时间。安装 Snappy LZOP 压缩编码器。

// 如果你的程序出现垃圾回收时间过程,可以设置一下java的垃圾回收参数 // 批次时间 >= 批次处理的总时间 (批次数据量,集群的计算节点数量和配置)

map是对每一个元素进行操作,flatmap是对每一个元素操作后并压平

13.计算曝光数和点击数

15.按照需求使用spark编写以下程序,要求使用scala语言

当前文件a.txt的格式,请统计每个单词出现的次数

16.spark应用程序的执行命令是什么?

17.Spark应用执行有哪些模式,其中哪几种是集群模式

18.请说明spark中广播变量的用途

使用广播变量,每个 Executor 的内存中,只驻留一份变量副本,而不是对 每个 task 都传输一次大变量,省了很多的网络传输, 对性能提升具有很大帮助, 而且会通过高效的广播算法来减少传输代价。

20.写出你用过的spark中的算子,其中哪些会产生shuffle过程

编译时就能检查出类型错误

直接通过类名点的方式来操作数据

序列化和反序列化的性能开销

无论是集群间的通信, 还是 IO 操作都需要对对象的结构和数据进行序列化和反序列化。

GC 的性能开销,频繁的创建和销毁对象, 势必会增加 GC

schema : RDD 每一行的数据, 结构都是一样的,这个结构就存储在 schema 中。 Spark 通过 schema 就能够读懂数据, 因此在通信和 IO 时就只需要序列化和反序列化数据, 而结构的部分就可以省略了。

当序列化数据时,Encoder 产生字节码与 off-heap 进行交互,能够达到按需访问数据的效果,而不用反序列化整个对象。Spark 还没有提供自定义 Encoder 的 API,但是未来会加入。

26.通常来说,Spark与MapReduce相比,Spark运行效率更高。请说明效率更高来源于Spark内置的哪些机制?并请列举常见spark的运行模式?

27.RDD中的数据在哪?

RDD中的数据在数据源,RDD只是一个抽象的数据集,我们通过对RDD的操作就相当于对数据进行操作。

28.如果对RDD进行cache操作后,数据在哪里?

数据在第一执行cache算子时会被加载到各个Executor进程的内存中,第二次就会直接从内存中读取而不会区磁盘。

和Mr一样,但是Spark默认最少有两个分区。

30.Scala里面的函数和方法有什么区别

 父RDD的一个分区中的数据有可能被分配到子RDD的多个分区中

33.Scala有没有多继承?可以实现多继承么?

40.数据倾斜可能会导致哪些问题,如何监控和排查,在设计之初,要考虑哪些来避免

41.有一千万条短信,有重复,以文本文件的形式保存,一行一条数据,请用五分钟时间,找出重复出现最多的前10条

42.现有一文件,格式如下,请用spark统计每个单词出现的次数

43.共享变量和累加器

累加器(accumulator)是 Spark 中提供的一种分布式的变量机制,其原理类似于mapreduce,即分布式的改变,然后聚合这些改变。累加器的一个常见用途是在调试时对作业执行过程中的事件进行计数。而广播变量用来高效分发较大的对象。

传条件时,可以使用驱动器程序中定义的变量,但是集群中运行的每个任务都会得到这些变量的一份新的副本,更新这些副本的值也不会影响驱动器中的对应变量。

Spark 的两个共享变量,累加器与广播变量,分别为结果聚合与广播这两种常见的通信模式突破了这一限制。

运行中的数据库连接数?

1.Kafka名词解释和工作方式

    :咋们可以理解为一个队列。(CG):这是kafka用来实现一个topic消息的广播(发给所有的consumer)和单播(发给任意一个consumer)的手段。一个topic可以有多个CG。topic的消息会复制(不是真的复制,是概念上的)到所有的CG,但每个partion只会把消息发给该CG中的一个consumer。如果需要实现广播,只要每个consumer有一个独立的CG就可以了。要实现单播只要所有的consumer在同一个CG。用CG还可以将consumer进行自由的分组而不需要多次发送消息到不同的topic。
  1. Partition:为了实现扩展性,一个非常大的topic可以分布到多个broker(即服务器)上,一个topic可以分为多个partition,每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id(offset)。kafka只保证按一个partition中的顺序将消息发给consumer,不保证一个topic的整体(多个partition间)的顺序。

通常情况下,一个group中会包含多个consumer,这样不仅可以提高topic中消息的并发消费能力,而且还能提高"故障容错"性,如果group中的某个consumer失效那么其消费的partitions将会有其他consumer自动接管。

对于Topic中的一条特定的消息,只会被订阅此Topic的每个group中的其中一个consumer消费,此消息不会发送给一个group的多个consumer;

那么一个group中所有的consumer将会交错的消费整个Topic,每个group中consumer消息消费互相独立,我们可以认为一个group是一个"订阅"者。

kafka的设计原理决定,对于一个topic,同一个group中不能有多于partitions个数的consumer同时消费,否则将意味着某些consumer将无法得到消息。

kafka只能保证一个partition中的消息被某个consumer消费时是顺序的;事实上,从Topic角度来说,当有多个partitions时,消息仍不是全局有序的。

3.kafka消息发送的应答机制

设置发送数据是否需要服务端的反馈,有三个值0,1,-1

4.如何保证kafka消费者消费数据是全局有序的

如果要全局有序的,必须保证生产有序,存储有序,消费有序。

由于生产可以做集群,存储可以分片,消费可以设置为一个consumerGroup,要保证全局有序,就需要保证每个环节都有序。

只有一个可能,就是一个生产者,一个partition,一个消费者。这种场景和大数据应用场景相悖。

5.有两个数据源,一个记录的是广告投放给用户的日志,一个记录用户访问日志,另外还有一个固定的用户基础表记录用户基本信息(比如学历,年龄等等)。现在要分析广告投放对与哪类用户更有效,请采用熟悉的技术描述解决思路。另外如果两个数据源都是实时数据源(比如来自kafka),他们数据在时间上相差5分钟,需要哪些调整来解决实时分析问题?

7.列举Kafka的优点,简述Kafka为什么可以做到每秒数十万甚至上百万消息的高效分发?

8.为什么离线分析要用kafka?

Kafka的作用是解耦,如果直接从日志服务器上采集的话,实时离线都要采集,等于要采集两份数据,而使用了kafka的话,只需要从日志服务器上采集一份数据,然后在kafka中使用不同的两个组读取就行了

10.Kafka与传统的消息队列服务有很么不同

进行hbase集群的调优:见hbase调优

2.hbase的rowkey怎么创建好?列族怎么创建比较好?

hbase存储时,数据按照Row key的字典序(byte order)排序存储。设计key时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。(位置相关性)

一个列族在数据底层是一个文件,所以将经常一起查询的列放到一个列族中,列族尽量少,减少文件的寻址时间。

1)生成随机数、hash、散列值

增强hbase查询数据的功能

减少服务端返回给客户端的数据量

答:宕机分为HMaster宕机和HRegisoner宕机,如果是HRegisoner宕机,HMaster会将其所管理的region重新分布到其他活动的RegionServer上,由于数据和日志都持久在HDFS中,该操作不会导致数据丢失。所以数据的一致性和安全性是有保障的。

2.Hive是建立在Hadoop之上为了减少MapReduce jobs编写工作的批处理系统,HBase是为了支持弥补Hadoop对实时操作的缺陷的项目 。
5.Hive本身不存储和计算数据,它完全依赖于HDFS和MapReduce,Hive中的表纯逻辑。
7.hbase是物理表,不是逻辑表,提供一个超大的内存hash表,搜索引擎通过它来存储索引,方便查询操作。
9.hdfs作为底层存储,hdfs是存放文件的系统,而Hbase负责组织文件。

  1. 数据从内存和硬盘合并后返回给client
  1. 当memstore数据达到阈值(默认是64M),将数据刷到硬盘,将内存中的数据删除,同时删除Hlog中的历史数据。
  2. 并将数据存储到hdfs中。

在hlog中做标记点。

  1. 当数据块达到4块,hmaster将数据块加载到本地,进行合并
  2. 当合并的数据超过256M,进行拆分,将拆分后的region分配给不同的hregionserver管理

1、管理用户对Table的增、删、改、查操作;

HRegion Server主要负责响应用户I/O请求,向HDFS文件系统中读写数据,是HBASE中最核心的模块。

HBase有多个RegionServer,每个RegionServer里有多个Region,一个Region中存放着若干行的行键以及所对应的数据,一个列族是一个文件夹,如果经常要搜索整个一条数据,列族越少越好,如果只有一部分的数据需要经常被搜索,那么将经常搜索的建立一个列族,其他不常搜索的建立列族检索较快。

12.请简述Hbase的物理模型是什么

13.请问如果使用Hbase做即席查询,如何设计二级索引

1.Flink实时计算时落磁盘吗

2.日活DAU的统计需要注意什么

4.Flink的容错是怎么做的

5.Parquet格式的好处?什么时候读的快什么时候读的慢

2.写出你用过的设计模式,并举例说明解决的实际问题

3.Java创建线程的几种方式

4.请简述操作系统的线程和进程的区别

6.采用java或自己熟悉的任何语言分别实现简单版本的线性表和链表,只需实现add,remove方法即可

a) 如果对象没有被引用,就会被回收,缺点:需要维护一个引用计算器

2)复制算法 年轻代中使用的是 Minor GC,这种 GC 算法采用的是复制算法(Copying)

a) 效率高,缺点:需要内存容量大,比较耗内存

b) 使用在占空间比较小、刷新次数多的新生区

3)标记清除 老年代一般是由标记清除或者是标记清除与标记整理的混合实现

a) 效率比较低,会差生碎片。

4)标记压缩 老年代一般是由标记清除或者是标记清除与标记整理的混合实现

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

5)标记清除压缩标记清除-标记压缩的集合,多次 GC 后才 Compact 

a) 使用于占空间大刷新次数少的养老区,是 3 4 的集合体

9.Java中迭代器和集合的区别?

集合是将所有数据加载到内存,然后通过集合的方法去内存中获取,而迭代器是一个对象,实现了Iterator接口,实现了接口的hasNext和Next方法。

在多线程并发的情况下,可以直接使用 HashTabl,但是使用 HashMap 时必须自己增加同步

样的键只有一个;可以有一个或多个键所对应的值为 null

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

要求底层数组的容量一定要为 2 的整数次幂,而 HashMap 则要求一定为 2 的整数次幂。

Hashtable 扩容时,将容量变为原来的 2 倍加 1,而 HashMap 扩容时,将容量变为原

11.线程池使用注意哪些方面?

线程池分为单线程线程池,固定大小线程池,可缓冲的线程池

14.使用递归算法求n的阶乘:n! ,语言不限

TreeSet 是采用树结构实现(红黑树算法)。元素是按顺序进行排列,但是 add()

安全的,而 StringBuilder 没有这个修饰,可以被认为是线程不安全的。

3、在单线程程序下,StringBuilder 效率更快,因为它不需要加锁,不具备多线程安全

StringBuffer 则每次都需要判断锁,效率相对更低

final:修饰符(关键字)有三种用法:修饰类、变量和方法。修饰类时,意味着它不

能再派生出新的子类,即不能被继承,因此它和 abstract 是反义词。修饰变量时,该变量

使用中不被改变,必须在声明时给定初值,在引用中只能读取不可修改,即为常量。修饰

方法时,也同样只能使用,不能在子类中被重写。

finally:通常放在 try…catch 的后面构造最终执行代码块,这就意味着程序无论正常执

行还是发生异常,这里的代码只要 JVM 不关闭都能执行,可以将释放外部资源的代码写在

从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用

的,通过重写 finalize() 方法可以整理系统资源或者执行其他清理工作。

== : 如果比较的是基本数据类型,那么比较的是变量的值

如果比较的是引用数据类型,那么比较的是地址值(两个对象是否指向同一块内

equals:如果没重写 equals 方法比较的是两个对象的地址值。

如果重写了 equals 方法后我们往往比较的是对象中的属性的内容

equals 方法是从 Object 类中继承的,默认的实现就是使用==

1.为什么要用es?存进es的数据是什么格式的,怎么查询

a.Flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。

b.Flume可以采集文件,socket数据包等各种形式源数据,又可以将采集到的数据输出到HDFS、hbase、hive、kafka等众多外部存储系统中

c.一般的采集需求,通过对flume的简单配置即可实现

d.ume针对特殊场景也具备良好的自定义扩展能力,因此,flume可以适用于大部分的日常数据采集场景

  1. Flume分布式系统中最核心的角色是agent,flume采集系统就是由一个个agent所连接起来形成
  2. 每一个agent相当于一个数据传递员,内部有三个组件:
    1. Source:采集源,用于跟数据源对接,以获取数据
    2. Sink:下沉地,采集数据的传送目的,用于往下一级agent传递数据或者往最终存储系统传递数据

Sqoop的原理其实就是将导入导出命令转化为mapreduce程序来执行,sqoop在接收到命令后,都要生成mapreduce程序

1.缓存穿透、缓存雪崩、缓存击穿

1)缓存穿透是指查询一个一定不存在的数据。由于缓存命不中时会去查询数据库,查不到

数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿

① 是将空对象也缓存起来,并给它设置一个很短的过期时间,最长不超过 5 分钟

② 采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定

不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力

2)如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,

尽量让失效的时间点不分布在同一个时间点

3)缓存击穿,是指一个 key 非常热点,在不停的扛着大并发,当这个 key 在失效的瞬间,

持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。

可以设置 key 永不过期

① 在指定的时间间隔内持久化

2)AOF : 以日志形式记录每个更新操作

Redis 重新启动时读取这个文件,重新执行新建、修改数据的命令恢复数据。

推荐(并且也是默认)的措施为每秒持久化一次,这种策略可以兼顾速度和安全性。

1 比起 RDB 占用更多的磁盘空间

3 每次读写都同步的话,有一定的性能压力

4 存在个别 Bug,造成恢复不能

如果对数据不敏感,可以选单独用 RDB;不建议单独用 AOF,因为可能出现 Bug;如果只是做纯内存缓存,可以都不用

悲观锁:执行操作前假设当前的操作肯定(或有很大几率)会被打断(悲观)。基于这个假设,我们在做操作前就会把相关资源锁定,不允许自己执行期间有其他操作干扰。

乐观锁:执行操作前假设当前操作不会被打断(乐观)。基于这个假设,我们在做操作前不会锁定资源,万一发生了其他操作的干扰,那么本次操作将被放弃。Redis 使用的就是乐观锁。

5.redis 是单线程的,为什么那么快

1)完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。

2)数据结构简单,对数据操作也简单,Redis 中的数据结构是专门进行设计的

3)采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗

4)使用多路 I/O 复用模型,非阻塞 IO

5)使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,

Redis 直接自己构建了 VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求

1.在python,scala,java中任选两种实现快速排序和二分查找(接受伪代码)

2.快排的空间复杂度和原理

4.二叉树的前中后序遍历

5.链表转置/二叉树转置

8.冒泡的时间空间复杂度,原理

1.请描述K邻近算法的原理

2.请描述朴素贝叶斯算法的原理

init后得到这样一棵二叉树

如何遍历才能得到这样的数据?????

即按照分支左右分支遍历(描述可能有问题,大概是这个意思)

我要回帖

更多关于 二叉树的三种遍历例题 的文章