大数据面试题汇总

一、Java面试题

HashMap和HashTable的区别

共同点

  • 都是Map的接口的实现类
  • 都是key/value的形式存在
  • Hashtable 和 HashMap 采用的 hash/rehash 算法都大概一样,所以性能不会有很大的差异
  • 将键映射到值的对象,其中键和值都是对象

区别

HashMap
  • HashMap 是 HashTable 的轻量级实现
  • HashMap 允许 null key 和 null value
  • HashMap非线程安全,比HashTables的效率高
  • HashMap 把 Hashtable 的 contains 方法去掉了,改成 containsValue 和 containsKey。因为 contains 方法容易让人引起误解
HashTable
  • HashTable线程安全
  • HashTable不允许key和value值出现null
  • HashTable 继承自 Dictionary 类,而 HashMap 是 Java1.2 引进的 Map interface 的一个实现

JDK与JRE的区别

  • JRE:Java Runtime Environment( java 运行时环境)。即java程序的运行时环境,包含了 java 虚拟机,java基础类库。
  • JDK:Java Development Kit( java 开发工具包)。即java语言编写的程序所需的开发工具包。JDK 包含了 JRE,同时还包括 java 源码的编译器 javac、监控工具 jconsole、分析工具 jvisualvm等。
    jdk = jre + javac
    jre = 类库+jvm

jdk包括

  • 第一部分就是Java运行时环境,JVM。
  • 第二部分就是Java的基础类库,这个类库的数量还是非常可观的。
  • 第三部分就是Java的开发工具,它们都是辅助你更好的使用Java的利器。

什么是死锁

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程

Mybatis的模糊查询方式有几种

--第一种
	- #{}
	-- 第一种是最常用
	select id,name,age,score from star where name like "%"#{name}"%"
--第二种:
	- ${}
	select id,name,age,score from star where name like "%${value}%"
--第三种:
	--mysql独有函数,concat
	select id,name,age,score from star where name like concat("%",#{name},"%")

Mybatis中“#”与“$”符号的区别是

"#"号:

  • 很大程度上 防止sql注入
  • 一般情况下使用的都是"#"号
  • 传入的数据都变成字符串类型,对于传入的数据加上双引号,例如:order by #{name},如果传入的值是zj,解析sql的时候,会将该语句解析为:order by “zj”;

"$"号:

  • 无法防止sql注入
  • "$"传入的是列名或者表名用来传入动态参数
  • 传入的参数采用拼接的方式进行sql解析。例如:order by #{name},如果传入的值是zj,解析sql的时候,会将该语句解析为:order by zj;

二、Sql面试题

左连接与右连接的区别

相同点
  • 两者都是将两个表进行关联,将两张表的内容关联到一张表中。
不同点
  • 左连接:左连接是以左边的表格为主,主要显示的是左边表格的内容属性在右边表格中的内容,如果左表有右表没有,那么右表的属性值为null,如果左表没有右表存在则不显示
  • 右链接:右连接与左连接相反

Sql的三级范式

Mysql一共分为三级范式:

  • 一级范式:
    所有的原子不可拆分
  • 二级范式:
    存在主键,保证属性的唯一性
  • 三级范式:
    每列都与主键有直接关系,不存在传递依赖

注意:要满足2NF的时候,首先1NF要满足,同理满足3NF,那么1NF、2NF一定也是满足的。

内部表与外部表的区别

  • 创建表语句中:内部表可以使用create直接创建,但是创建外部表的时候一定要使用external作为关键词(hive默认创建的表为内部表)
  • 导入数据存在差异:内部表load加载数据的时候,相当于复制一个文件到hive存在的HDFS文件路径中,原路径仍然存在该文件。外部表load加载文件的时候,相当于把这个文件mv到hive表的相关HDFS文件路径中,load之后原路径中不存在该文件。
  • 删除数据:内部表删除数据后,HDFS文件系统中的数据也立即删除。外部表的数据删除后,HDFS文件系统中的数据仍然存在,从而体现了外部表的安全性要比内部表的高。

三、linux shell 命令

如何查看虚拟机的内存和磁盘大小

  • du
    显示每个文件的目录和磁盘大小
常用:
    du -s -h 目录路径
  目录少的时候用:
    du -h 目录路径
命令参数:
  -c或--total  除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。
  -s或--summarize  仅显示总计,只列出最后加总的值。
  -h或--human-readable  以K,M,G为单位,提高信息的可读性。
  • df
    显示指定磁盘文件的可用空间
常用:
  df -h
命令参数:
  -a 全部文件系统列表
  -h 方便阅读方式显示
  -i 显示inode信息
  -T 文件系统类型
  • free
    查看虚拟机的内存使用情况
常用:
  free -h
输出结果如下:
	              total        used        free      shared  buff/cache   available
Mem:            38G        2.7G         25G         17M        9.8G         34G
Swap:            0B          0B          0B
输出字段说明:
	Mem:表示物理内存统计
	total:表示物理内存总量(total = used + free)
	used:表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。
	free:未被分配的内存。shared:共享内存。
	buffers:系统分配但未被使用的buffers 数量。cached:系统分配但未被使用的cache 数量。
	
	-/+ buffers/cache:表示物理内存的缓存统计
	used2:也就是第一行中的used – buffers-cached 也是实际使用的内存总量。 //used2为第二行
	free2= buffers1 + cached1 + free1 //free2为第二行、buffers1等为第一行
	free2:未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。
	Swap:表示硬盘上交换分区的使用情况
  • top
    查看cpu的使用情况
常用:
	top [-] [d] [p] [q] [c] [C] [S] [s]  [n]
参数说明:
  d 指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。 
  p 通过指定监控进程ID来仅仅监控某个进程的状态。 
  q 该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。 
  S 指定累计模式 
  s 使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。 
  i 使top不显示任何闲置或者僵死进程。 
  c 显示整个命令行而不只是显示命令名 

如何查看文件前10行或者后10行和一个实时写入的文件

  • 前10行
head -n 10 [file_name]
  • 后10行
tail -n 10 [file_name]
  • 实时读取
tail -f [file_name]

四、大数据面试题

Scala中的Case作用

Scala存在一个强大的模式匹配,每个模式匹配的开始都是以“match-case”进行开始匹配信息。对应于java中的switch-case模式

# scala case demo

object Test {
   def main(args: Array[String]) {
      println(matchTest(3))

   }
   def matchTest(x: Int): String = x match {
      case 1 => "one"
      case 2 => "two"
      case _ => "many"
   }
}

输出:

$ scalac Test.scala    # 编译scala文件
$ scala Test           # 运行scala文件信息
many

数据仓库分层概念

数据分层概念

数据分层为倒三角,从上到下依次为ODS层(原始数据层)、DWD层(明细数据层)、DWS层(服务数据层)、ADS层(数据应用层),数据量是从多到少,从复杂化到简单化。

  • ODS层:原始数据层、存放原始数据,直接加载原始日志信息,数据, 数据保持原貌不做处理
  • DWD层(DWI层):结构和粒度与原始数据保持一致,对ODS层数据进行数据清洗(去空值、脏数据、超过极限范围的数据)
  • DWS层:以DWD为基础,进行轻度汇总(用户的一些基本操作,例如:评论、收藏、下单等基本操作行为)
  • ADS层:为各种统计表提供数据(数据结果)

分层优点:

  • 把复杂问题简单化
    将一个复杂的任务分解成多个步骤来完成,每一层只处理单一的步骤,比较简单、并且方便 定位问题
  • 减少重复操作
    规范数据分层,通过中间层数据,能够减少极大的重复计算,增加一次计算结果的复用性。
  • 隔离原始数据
    不论是数据的异常还是数据的敏感性,使真实的数据与统计数据解耦开。

Kafka策略的三种模式

kafka在分布式集群中,担任的是分布式消息队列,在producer推送数据到kafka topic中的时候存在三种策略来解决数据在推送过程中存在的问题。
大数据面试题汇总_第1张图片
参考kafka相关博客

  • At most once 消息至多会被发送一次,但如果产生网络延迟等原因消息就会有丢失。
  • At least once 消息至少会被发送一次,上面既然有消息会丢失,那么给它加一个消息确认机制即可解决,但是消息确认阶段也还会出现同样问题,这样消息就有可能被发送两次。
  • Exactly once 消息只会被发送一次,这是我们想要的效果。

Kafka的produce的ack为0,1,-1分别代表什么

Kafka producer有三种ack机制 初始化producer时在config中进行配置;

  • ack等于0:意味着producer不等待broker同步完成的确认,继续发送下一条(批)信息提供了最低的延迟。但是最弱的持久性,当服务器发生故障时,就很可能发生数据丢失。例如leader已经死亡producer不知情,还会继续发送消息broker接收不到数据就会数据丢失。

  • ack等于1(默认):意味着producer要等待leader成功收到数据并得到确认,才发送下一message。此选项提供了较好的持久性较低的延迟性。Partition的Leader死亡,follwer尚未复制,数据就会丢失。

  • ack等于-1:意味着producer得到follwer确认,才发送下一条数据持久性最好,延时性最差

Kafka的ofset的方式有几种

参考博客

Zookeeper如何保证Kafka节点的正常运行

  • kafka集群中存在与节点相同个数的broker,不能每一个broker都能监控整个kafka集群,此时需要一个Controller,那么这个Controller的产生就是靠zookeeper进行选举产生,管理集群broker的上下线,所有topic的分区副本分配和leader选举等工作。
  • kafka的brocker的topic的元数据信息存储在Zookeeper中,保证数据的可用性。

Spark中的RDD、DataFrame、DataSet的关系和区别

RDD :
弹性分布式数据集,他记录的只读分区集合,是Spark的基本数据结构。

  • 弹性:
    1. 在计算过程中,如果内存不足的时候,也会将计算中间数写入到磁盘等外存上
    2. RDD使用的是一种“血统”的容错机制,在结构更新上面和丢失后可以随时根据血统进行数据模型的重建。
  • 分布式
    1.可以分布在多台机器上运行
  • 数据集
    一组只读、可分区的分布式数据集合,集合包含多个分区,分区依照特定规则将具有的相同属性的数据记录放在一起,每个分区相当于数据集片段。

DataFrame
DataFrame思想来源于Python的Pandas库,RDD是一个数据集,DataFrame在RDD的基础上增加了Schema(描述数据信息,可以认为是元数据)
DataFrame比RDD数据多出一张表头,更加像一张表,一般用于Spark SQl。

DataSet

DataSet是DataFrame API扩展,相较于RDD来说,DataSet提供了强类型支持,区别也是给RDD的每行数据增加类型约束。

  • 相对于分布式程序来讲,提交一次作业太费劲,如果提交到集群运行的时候才发现错误,比较浪费时间,DataSet相比DataFrame来说,他提供了编译时类型检查
  • 引入DataSet另一个重要原因是RDD转换DataFrame后不可逆,但RDD转换为DataSet是可逆的。

相同点

  • 三者均为Spark平台下的分布式弹性数据集,为处理超大型数据提供便利
  • 三者均有懒惰机制,在创建、转换等阶段,如:map、filter等方法时,不会立即执行,只有在遇到Action如count、reduce时才会真正开始运算
  • 三者都会根据Spark的内存情况自动缓存运算,这样即使数据量很大,也不会担心内存溢出。
  • 三者有许多共同的函数,如filter、map等

异同点

  • RDD不支持Sql操作,DF和DS均支持
  • DF和DS拥有完全一样的成员函数,但是DF的每一行类型不确定,只知道为字段,DS的每行数据类型是确定的,DF又称为DataSet[Row]。
    由于DF类型不确定,所以在执行编译操作的时候是没有办法进行编译检查的
  • RDD与DF和DS的保存数据方式不同,DF和DS还会支持一些其他的保存方式,例如:csv,且可以带上表头,这样每一列的字段名一目了然。

什么是数据倾斜?如何避免数据倾斜

  • 数据倾斜是大数据中最常见的问题之一,一般我们在执行MR和Hive Sql任务的时候出现 map100% reduce90% 一直卡在这执行不下去的时候,这个时候就是数据倾斜的典型代表。
  • 数据倾斜其实是进行分布式计算的时候,某些节点计算的能力较差,或者由于此节点需要计算的数据比较多,导致出现其他节点的reduce阶段任务执行完成,但是这种节点的数据处理任务还没有执行完成

数据倾斜的原因:

  • 在map数据中,得到某一个key的数量严重过多,造成在Reduce计算的时候,出现其中数据比较多key分配的reduce的一直在计算相加。(key分布不均匀)
  • 某些语句就是会导致数据产生一定的倾斜
  • 在创建相应表的时候设计不周
  • 业务数据本身问题

如何避免数据倾斜

  • 修改相关的sql语句,例如增加group by字段对sql语句进行优化处理
  • 优化map和reduce:出现小文件过多的时候可以先进行合并操作,例如在MR中可以增加combiner提前将一些文件进行合并操作,有的常场景也可以增加map的个数来避免map端的数据计算时长
  • Hive的数据倾斜,一般都发生在Sql中group by和join on上,而且和数据逻辑绑定比较深
  • spark的数据倾斜只能存在shuffer中,需要通过修改suffer的参数来提高数据的并发性。

注意:这只是其中的一些情况,还有很多原因导致数据倾斜

什么是数据预处理

数据预处理简单来说就是我们在数据清洗之前,需要对原数据信息的脏数据进行处理操作。

  • 数据不完整
  • 数据不一致
  • 数据不可信
  • 数据不准确

Hive、Hbase与Hadoop之间的关系和区别

Hive:数据仓库
Hbase:非关系型数据库,用于对数据的列式存储。
Hadoop:具有HDFS分布式文件系统和MarReduce计算引擎
其中,Hive和Hbase存储的数据都是存储在HDFS文件系统中。HDFS文件系统为整个Hadoop生态圈提供数据存储。

Hadoop的读写流程

Hadoop读写流程中,运行原理中,相对而言,写的知识点比较多。
大数据面试题汇总_第2张图片

Hadoop如何判断文件是否已经存在

hdfs dfs --test 

编程题:

手写快排

引用:十大经典排序算法(动图演示)

十大经典排序算法

产生10个1-20以内的随机数,要求随机数不能重复(使用List)

public static void main(String[] args) {
    Random random = new Random();
    ArrayList list = new ArrayList();

    for (int x = 0; x < 10; x++) {
        int num = random.nextInt(20);
        if (!list.contains(num)) {
            list.add(num);
        } else {
            x--;
        }
    }
    System.out.println(list);
}

//输出:[5, 1, 3, 15, 9, 8, 11, 13, 7, 2]

使用set

public static void main(String[] args) {
    Random random = new Random();
    HashSet set = new HashSet();
    while (set.size() < 10) {
        int num = random.nextInt(20);
        set.add(num);
    }
    System.out.println(set);
}

获取字符串“aababcabcdabcde”中出现的字母次数,要求结果a(5)b(4)c(3)

public static void main(String[] args) {
    String str = "aababcabcdabcde";
    HashMap<Character,Integer> map = new HashMap<Character, Integer>();
    char[] a = str.toCharArray();
    for (Character a1 : a) {
        Integer num = map.get(a1);
        if (num == null) {
            map.put(a1, 1);
        } else {
            num++;
            map.put(a1, num);
        }
    }
    System.out.println(map);
}

你可能感兴趣的:(大数据,大数据,hadoop,java)