面试问题:
1. 数据仓库建模方面
2. 数据仓库为什么分层
面试问题:
1. Hive优化和spark优化问题
这块优化手段有很多, 挑着自己比较熟的说几个就行.
2. 对空key加随机字符串防止数据倾斜, 写一下这个SQL语句
SELECT a.*
FROM nullidtable a
LEFT JOIN ori b ON CASE WHEN a.id IS NULL THEN concat('hive', rand()) ELSE a.id END = b.id;
3. 写一下在join出现数据倾斜的时候怎么处理的代码
这块面试官让本人在A4纸上直接手写, 本人写的那叫一个磕磕绊绊啊, 实在是处理逻辑都记得, 在A4纸上写是真的写不顺畅.
回到家, 感觉翻出以前的笔记, 使劲儿多敲了几遍, 才算舒了口气~
// reduceBykey加随机数避免数据倾斜
val preRDD = rdd.map(x=>{
Random random = new Random()
int pre = random.nextInt(100);
(pre+"_"+x.1, x._2) //1_hello 2_hello
})
val firReduce = preRDD.reduceBykey(+)
val secRDD = firReduce.map(x=>{
val key = x.1.split("_")[1]
(key, x._2)
})
val secReduce = secRDD.reduceBykey(+)
// 小数据量与大数据量join时避免数据倾斜
val rdd1 = rdd1.collect()
val broadcastRdd1 = sc.broadcast(rdd1)
rdd2.map(x=>{
val rdd1Data = broadcastRdd1.value()
val map = HashMap()
for (data <- rdd1Value){
map.append(data.1,data.2)
}
val rdd1Value = map.get(x._1)
(x.1, (x.2, rdd1Value))
})
// 采样倾斜key并分拆join操作
val sampleRDD = rdd1.sample(false,0.1)
topIds = sampleRDD.map((.1, 1)).reduceBykey(+).sortBy(.2,false).map(.1).take(100).collect()
val filterRDD1 = rdd1.filter(line=>{
topIds.contains(line)
})
val commonRDD1 = rdd1.filter(line=>{
!topIds.contains(line)
})
val filterRDD2 = rdd2.filter(line=>{
topIds.contains(line)
}).flatMap(x=>{
val list = BufferList();
for (i <- 1 to 100){
list += (i+"_"+x.1, x._2)
}
list
})
val joinedRDD1 = filterRDD1.map(x=>{
Random random = new Random()
int pre = random.nextInt()
(pre+"_"+x.1, x._2)
})
val joinedRDD1 = joinedRDD1.join(filterRDD2)
val joinedRDD2 = commonRDD1.join(rdd2)
val joinedRDD = joinedRDD1.union(joinedRDD2)
4. 写一下分类求取TopN的SQL
这个很简单了, 就不写了.
5. Linux监控命令用过哪些 (df/dh/free等简单的不用说了) 重点可以说说JVM监控
jstat -class 2041 查看加载了多少类以及对应的信息
jstat -compiler 2041 查看编译的数量, 成功和失败的数量和类型
jstat -gc 2041 查看垃圾回收的统计信息
通过jstat可以对jvm堆的内存进行统计分析,而jmap可以获取到更加详细的内容
如:内存使用情况的汇总、对内存溢出的定位与分析。
jmap -heap 2041 heap内存的使用情况
jmap -histo 2041 | more 查看内存中对象数量及大小
jmap -histo:live 2041 | more 查看内存中对象活跃数量及大小
jmap -dump:format=b,file=/tmp/dump.dat 6219 将内存使用情况dump到文件中
jhat -port 9999 dump.dat 通过jhat对dump文件进行分析
最后还有个Htop, 属于top的升级版, 需要先使用yum安装, 之后就使用htop命令就可以进入界面
6. MapReduce的处理流程, map端和reduce端分别用的什么排序算法
在Map阶段,k-v溢写时,采用的是快排;而溢出文件的合并使用的则是归并;在Reduce阶段,通过shuffle从Map获取的文件进行合并的时候采用的也是归并;最后阶段则使用了堆排作最后的合并过程。
所以快排、归并以及堆排是必须要掌握的排序算法,这都在MapReduce内部使用的排序算法,学习Hadoop的必须过程。
7. 用shell写个Wordcount程序
#!/bin/bash
if [ $# -ne 1 ]
then
echo "Usage: $0 filename"
exit -1
fi
cat $1 | tr 'A-Z' 'a-z' | egrep -o "\b[[:alpha:]]+\b" | \
awk '{ count[$0]++ }
END {
for(ind in count){
printf("%-14s%d\n",ind,count[ind]);
}
}' | sort -k 2 -n -r
egrep命令: 按照正则表达式的规则匹配
-o: 仅输出匹配到的单词, 不输出那一行
awk: 行处理器, 这玩意儿厉害了
$0: awk里面的$0指的是一行, 和shell的$0不一样哦
END: 是指前面的每一行都执行过后再执行后面的
sort: 排序
-k: 指定排序的列
-n: 按照数字排序, 非字典序
-r: 降序排序