1 本学期我们学习使用了哪些大数据框架,请根据各个框架的功能进行分类。
- 数据采集:kafka、flume、sqoop
- 数据存储:mysql、hbase、hive、hadoop
- 数据处理与分析:hadoop、spark、flink
- 数据可视化:superset、Apache Zeppelin
- 编程语言:java、scala、python
2.什么是文件系统和什么是分布式文件系统?二者有哪些区别?
文件系统是操作系统在硬盘或者分区上保存文件信息的方法和数据结构。
分布式文件系统是一种通过网络实现文件在多台主机上进行分布式存储的文件系统。
- 1.文件管理模式不同
- 文件系统用于管理机器上的文件和目录,使之能够被有效地存取。
- 分布式文件系统一般采用“客户机/服务器”模式,客户端以特定的通信协议通过网络与服务器建立连接,提出文件访问请求,客户端和服务器可以通过设置访问权限限制请求对方底层存储块的访问。
- 2.文件存储模式不同
- 文件以块为单位进行存储,一个大规模文件可以被分拆成若干个文件块, 不同的文件块可以被分发到不同的节点上,支持大规模文件存储。并且大大简化了存储系统。
- 3.文件系统读取文件流程不同
- 传统系统根据文件名找到对应的inode号码,通过inode号,获取inode信息。根据inode信息,找到文件数据所在的block,读出数据。
- 分布式文件系统是根据名称节点、数据节点比较文件对应ID号进行文件读取。
3 HDFS由哪几个组件构成,各自的作用是什么?
- 名称节点负责文件和目录的创建、删除和重命名等,同时管理着数据节点和文件块的映射关系。
- 数据节点是分布式文件系统HDFS的工作节点,负责数据的存储和读取,会根据客户端或者是名称节点的调度来进行数据的存储和检索,并且向名称节点定期发送自己所存储的块的列表。
- 第二名称节点是HDFS架构中的组成部分,它是用来保存名称节点中对HDFS元数据信息的备份,并减少名称节点重启的时间。
- 客户端代表用户与NameNode或者DataNode交互,来访问整个文件系统的对象。可以支持打开、读取、写入等常见的操作,并且提供了类似Shell的命令行方式来访问HDFS中的数据。
4 MapReduce任务执行过程分为哪几个阶段,叙述MapReduce的Shuffle过程。
- Mapreduce的各个执行阶段
- 输入 Map任务 Reduce任务 输出
- MapReduce的Shuffle过程:
- Map:输入数据和执行Map任务 写入缓存 溢写(分区排序合并) 文件归并
- Reduce:从Map端领取数据 写入缓存 归并数据 将数据传给Reduce任务
5 在Yarn上执行一个MapReduce任务从提交到完成所经历了哪些步骤。
步骤 1:用户编写客户端应用程序,向 YARN提交应用程序,提交的内容包括ApplicationMaster 程序、启动 ApplicationMaster 的命令、用户程序等。
步骤 2:YARN 中的 ResourceManager 负责接收和处理来自客户端的请求。接到客户端应用程序请求后,ResourceManager里面的调度器会为应用程序分配一个容器。同时,ResourceManager 的应用程序管理器会与该容器所在的 NodeManager 通信,为该应用程序在该容器中启动一个ApplicationMaster。
步骤 3:ApplicationMaster 被创建后会首先向 ResourceManager 注册,从而使得用户可以通过 ResourceManager 来直接查看应用程序的运行状态。接下来的步骤4~7 是具体的应用程序执行步骤。
步骤 4:ApplicationMaster 采用轮询的方式通过 RPC 协议向 ResourceManager 申请资源。
步骤 5:ResourceManager 以容器的形式向提出申请的 ApplicationMaster 分配资源,一旦 ApplicationMaster 申请到资源后,就会与该容器所在的NodeManager 进行通信,要求它启动任务。
步骤 6:当 ApplicationMaster 要求容器启动任务时,它会为任务设置好运行环境,然后将任务启动命令写到一个脚本中,最后通过在容器中运行该脚本来启动任务。
步骤 7:各个任务通过某个RPC协议向ApplicationMaster汇报自己的状态和进度,让 ApplicationMaster 可以随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。
步骤 8:应用程序运行完成后,ApplicationMaster 向 ResourceManager 的应用程序管理器注销并关闭自己。
6 实现一个Hadoop自定义类型有哪几个步骤?
- 创建类实现
WritableComparable
或者Writable
- 根据需要定义属性,生成
get
/set
函数 - 构造函数:空参/带参数
- 序列化和反序列方法实现
- 重写
write
方法并添加逻辑以写入所有字段值 - 重写
readFields
方法从输入流读取所有字段值
- 重写
- 重写
compareTo
方法并实现自定义数据类型排序的逻辑
7 简述Hadoop分区函数的作用,及自定义分区函数的方法。
实现了将key均匀分布在Reduce Tasks上,例如:如果Key为Text的话,Text的hashcode方法跟String的基本一致,得到一个int整数。但是,如果string太大的话这个int整数值可能会溢出变成负数,所以和整数的上限值Integer.MAX_VALUE(即0111111111111111)进行与运算,然后再对reduce任务个数取余,这样就可以让key均匀分布在reduce上。
Hadoop中自带了一个默认的分区类HashPartitioner
,继承Partitioner
类,提供了一个getPartition
的方法,定义如下:
public class HashPartitioner<K, V> extends Partitioner<K, V> {
public int getPartition(K key, V value, int numReduceTasks) {
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
}
8 什么是HBase? HBase 的存储结构是怎样的(HRegion, 列族)?
HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,主要用来存储非结构化和半结构化的松散数据。
- 列族:一个HBase表被分组成许多列族(ColumnFamily)的集合,它是基本的访问控制单元列
- Region:将一个数据表按Key值范围连续划分为多个的子表,这个子表,在HBase中被称作 “Region”。
列族:列族是每个子列的父级,每个子列都属于一个列族,一个列族包含一个或者多个相关列,创建表的时候需要指定列族,而不需要必须指定列。通过“列族名:列名”来表示某个具体 的子列。
HRegion:属于HRegionServer,一个HRegionServer可以存在多个HRegion。每一个Region都由多个Store组成,每个Store存在一个列族
9 什么是Hive?Hive中内部表和外部表的区别是什么?
Hive是基于Hadoop构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop分布式文件系统中的数据。
内部表的创建过程和数据加载过程这两个过程可以分别独立完成,也可以在同一个语句中完成,在加载数据的过程中,实际数据会被移动到数据仓库目录中;之后对数据访问将会直接在数据仓库目录中完成。删除表时,表中的数据和元数据将会被同时删除。
而外部表只有一个过程,加载数据和创建表同时完成,实际数据是存储在LOCATION后面指定的 HDFS 路径中,并不会移动到数据仓库目录中。当删除一个External Table时,仅删除该链接。
10 叙述Hive中分区和分桶的概念?
Partition
就是一种对表进行粗略划分的机制,可以实现加快查询速度的组织形式。Buckets
是将表的列通过Hash算法进一步分解成不同的文件存储。
它对指定列计算Hash,根据Hash值切分数据,目的是为了并行,每一个Bucket对应一个文件。
11 Spark生态包含了哪些模块,各个模块的功能是什么?
Spark的生态系统主要包含了Spark Core、Spark SQL、Spark Streaming、MLlib和GraphX等组件。
- Spark Core实现了Spark框架的基本功能,包含任务调度,内存管理,错误恢复,与存储系统交互等模块。Spark Core还包含了对弹性分布式数据集RDD的API定义。
- Spark Streaming是Spark提供的对实时数据进行流计算的组件。
- Spark SQL是Spark用来操作结构化数据的程序包,通过它可以使用SQL语言来查询数据,同时支持多种数据源,比如Hive, Parquet以及JSON等。
- MLLib是Spark提供的常见机器学习功能的程序库,提供了包括分类、回归、聚类、协同过滤等机器学习算法,还提供了模型评估,数据导入等额外的功能。
- GraphX是用来操作图的程序库,可以进行并行的图计算。
12 什么是RDD?RDD的Stage是如何划分的?RDD算子分为哪两类,分别举例说明。
弹性分布式数据集的简称,是分布式内存的一个抽象概念,提供了一种高度受限的共享内存模型 。
Stage的划分
- 在DAG中进行反向解析,遇到宽依赖就断开
- 遇到窄依赖就把当前的RDD加入到Stage中
- 将窄依赖尽量划分在同一个Stage中,可以实现流水线计算
RDD的算子
-
Transformation:
map
、flatMap
、filter
、reduceByKey
等。 -
Action:
take
、count
、saveAsTextFile
等。
13 Spark运行架构包括哪些组件,各个组件的功能是什么。
Spark运行架构包括
- 集群资源管理器:负责申请和管理在Worker Node上运行所需要的资源
- 运行作业任务的工作节点:集群中任何可以运行
Application
代码的节点 - 每个应用的任务控制节点:与资源管理器建立通讯进行任务分配和监控
- 每个工作节点上负责具体任务的执行进程:是运行在工作节点的一个进程,负责运行Task
14 Spark Streaming的设计原理是什么?什么是无状态转换和有状态转换?
Spark Streaming的基本原理是将实时输入数据流以时间片(秒级)为单位进行拆分,然后经Spark引擎以类似批处理的方式处理每个时间片数据。
- 无状态转换:对Dstream的操作会映射到每个批次的RDD上
- 有状态转换:跨时间区间跟踪处理数据的操作,依赖于之前批次的数据。
15 Spark与Hadoop的相同点和不同点?
[1] Hadoop 表达能力有限,计算都要转化成 Map 和 Reduce 两个操作;Spark 的计算模式也属于MapReduce 但不局限于此,还提供了多种数据集操作类型, 相比于 Hadoop 更加灵活;
[2] Hadoop 的硬盘 IO开销大;Spark 提供内存计算,可将中间结果存放在内存中,对于迭代运算效率更高
[3] Hadoop 延迟高且在一个任务执行完前无法进行后一个任务;Spark 基于 DAG
的任务调度执行机制要优于 Hadoop
[4] 在进行实际开发时,Hadoop 需要编写许多相对底层的代码而不够高效; Spark 提供了多种高层次、简洁的API 并提供了交互式编程反馈
[5] Hadoop 可以使用廉价的异构的机器来做分布式存储和计算,但是 Spark 对硬件的要求稍高一些,对内存和CPU 也有一定的要求
16 我们在实验中构建的流处理框架由哪几个组件构成?各个组件所起的作用是什么?
我们模拟生成电商平台购买日志,然后使用Flume对日志进行收集,收集的日志一方面存入HDFS,一方面传给Kafka,Kafka收到的日志传给SparkStreaming进行实时流处理,处理的结果存入Mysql。
- Flume:对日志进行收集
- HDFS:收集存储日志
- Kafka:收集存储日志,将收集的日志传给Spark Streaming进行实时流处理
- Spark Streaming:对日志进行实时流处理,并将结果存入MySQL
- MySQL:存储Spark Streaming输出的结