1.wordcount的实现过程
Map 阶段:
- 按行读取要统计的文本文件;
- 按空格拆分每行的单词
- 将单词转换成 kv 键值对,格式为(单词,1)
- 将所有的 kv 键值对中的单词按照单词首字母分区,比如分两个区,那么分区1(a-p),分区2(q-z)
Reduce 阶段:
- 每个 ReduceTask 拉取上一阶段所有 MapTask 的输出,按照 key 汇总
- 对相同的 key 的 value(value 都是 1) 求和
扩展:程序的写法如下
// Mapper类
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
public class WordcountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
Text k = new Text();
IntWritable v = new IntWritable(1);
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// 1 获取一行
String line = value.toString();
// 2 切割
String[] words = line.split(" ");
// 3 输出
for (String word : words) {
k.set(word);
context.write(k, v);
}
}
}
// Reducer类
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
public class WordcountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{
int sum;
IntWritable v = new IntWritable();
@Override
protected void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException {
// 1 累加求和
sum = 0;
for (IntWritable count : values) {
sum += count.get();
}
// 2 输出
v.set(sum);
context.write(key,v);
}
}
2.MapReduce 与 Spark 的区别
- MapReduce 是一个分布式运算程序的编程框架。
- 核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并行运行在一个Hadoop集群上。
- Spark 是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。
- Spark 和 Hadoop 的根本差异是多个作业之间的数据通信问题 :
- Spark多个作业之间数据通信是基于内存,而 Hadoop 是基于磁盘。
- Spark 只有在 shuffle 的时候将数据写入磁盘,而 Hadoop 中多个 MR 作业之间的数据交互都要依赖于磁盘交互。
- Spark 的弹性分布式数据集(Resilient Distributed Datasets),提供了比 MapReduce 丰富的模型,可以快速在内存中对数据集进行多次迭代,MapReduce 的设计初衷并不是为了满足循环迭代式数据流处理。
- Spark 是基于内存的,由于内存的限制,可能会由于内存资源不够导致Job执行失败,数据量大时 MapReduce 是一个更好的选择。
3.Spark 在 client 与在 cluster 运行的区别
- Client 模式将用于监控和调度的 Driver 模块在客户端执行,而不是在 Yarn 中,所以一般用于测试。
- Cluster模式将用于监控和调度的Driver模块启动在Yarn集群资源中执行。一般应用于实际生产环境。
4.相同的 SQL 在 Hive SQL 与 Spark SQL 的实现中,为什么 Spark 比 Hadoop 快
Hive 的底层时 MapReduce,所以比 Spark 慢
5.UDF 是什么
UDF(User-Defined Functions)是用户定义的 hive 函数。
- UDF:one to one,一进一出,如:upper、substr函数
- UDAF:many to one,多进一出,如:sum、min。
- UDTF:one to many ,一进多出。如:alteral view 与 explode
6.设计 HBase 表需要注意的点
Hbase 中一条数据的唯一标识就是rowkey,那么这条数据存储于哪个分区,取决于rowkey处于哪个一个预分区的区间内,设计 rowkey的主要目的 ,就是让数据均匀的分布于所有的 region 中,在一定程度上防止数据倾斜。常用方法:
- 生成随机数、hash、散列值
- 比如:原本 rowKey 为1001的哈希后变成:dd01903921ea24941c26a48f2cec24e0bb0e8cc7
- 字符串反转
- 20170524000001转成10000042507102,20170524000002转成20000042507102
- 字符串拼接
- 20170524000001_a12e,20170524000001_93i7
7.HBase的 Hlog
后面单独写一篇讲解。
8.数据同样存在 HDFS,为什么 HBase 支持在线查询
- HBase 划分了多个 region,例如 1TB 分 500 个,那么最多只用读 2GB
- 列式存储:例如 region 分了 3 个列簇,那么 2GB / 3 = 666M,一个列簇有分为多个 HStoreFile,假如一个是 128M,总共有 6 个,一个在内存,剩下 5 个在磁盘
- 排序:记录排好序的,平均只需要遍历一半即 2.5 个 HStoreFile 共 300M
- kv 存储:只需要遍历 key 的位置就能判断
实时查询就是从内存中查询,HBase 数据先写入内存,达到一定的量再写入磁盘,在内存中只增加数据,用户的操作在内存中完成,保证实时响应。
9.Spark Streaming与 Flink与什么区别
- Flink 是标准的实时处理引擎,基于事件驱动。Spark Streaming 是微批(Micro-Batch)的模型。
- 时间机制:Spark Streaming 支持的时间机制有限,只支持处理时间。 Flink 支持了流处理程序在时间上的三个定义:处理时间、事件时间、注入时间。同时也支持 watermark 机制来处理滞后数据。
- 容错机制对于 Spark Streaming 任务,我们可以设置 checkpoint,然后假如发生故障并重启,我们可以从上次 checkpoint 之处恢复,但是这个行为只能使得数据不丢失,可能会重复处理,不能做到恰好一次处理语义。Flink 则使用两阶段提交协议来解决这个问题。
10.有三个map,一个reduce来做top10,哪种方法最优。数据量特别大。
- 直接在 Reduce 中排序。
- 定义一个 size = 10 的小顶堆,大于堆顶元素才入堆。
- 利用 MapReduce 的高级 API 编程,定义分区器和分组比较器。
11.数据仓库的模型设计
星型模型,星座模型,雪花模型。一般是星型模型。
12.数据仓库的数据清洗
单独写一篇文章。
13.数据仓库是怎么设计的
参考阿里的《大数据之路》。关注公众号回复 802 获取 pdf。
14.数仓规范设计哪些方面(字段、维度,存储压缩、数据保留机制)
参考阿里的《大数据之路》。关注公众号回复 802 获取 pdf。
15.数据质量
主要问题:数据不一致,数据不完整,数据不合规,数据不可控,数据冗余。
主要监控指标:
- 单表数据量监控
- 单表空值检测
- 单表重复值检测
- 单表值域检测
- 跨表数据对比
16.数仓拉链表的原理
拉链表处理的业务场景:主要处理缓慢变化维的业务场景,记录每条信息的生命周期,有开始结束日期,结束日期。详细说明见下面这篇文章。
17.有没有遇到数据倾斜的问题
详细解答见这篇文章。数据倾斜的处理。
欢迎关注公众号,每天分享大数据开发面试经验。