您的位置:首页 > 职场人生

大数据常见面试题汇总(一)

2016-06-06 13:47 441 查看
生活的本质就是快乐地分享

引导技术往熟悉的地方引导


回答问题需要做到:

     简洁、痛点

大数据的本质:从数据中挖掘价值

云计算的本质:共享服务

【某公司笔试面试题】

1\使用mr,spark ,spark sql编写word count程序


【Spark 版本】

val conf=new SparkConf().setAppName("wd").setMaster("local[1]")

val sc=new SparkContext(conf,2)

//加载

val lines=sc.textFile("tructField("name",DataTypes.StringType,true)")

val paris=lines.flatMap(line=>line.split("^A"))

val words=paris.map((_,1))

val result=words.reduceByKey(_+_).sortBy(x=>x._1,false)

//打印

result.foreach(
wds=>{
println("单词:"+wds._1+" 个数:"+wds._2)
}

)

sc.stop()

【spark sql版本】

val conf=new SparkConf().setAppName("sqlWd").setMaster("local[1]")

val sc=new SparkContext(conf)

val sqlContext=new SQLContext(sc)

//加载

val lines=sqlContext.textFile("E:\idea15\createRecommeder\data\words.txt")

val words=lines.flatMap(x=>x.split(" ")).map(y=>Row(y))

val structType=StructType(Array(StructField("name",DataTypes.StringType,true)))

val df=sqlContext.createDataFrame(rows,structType)

df.registerTempTable("t_word_count")

sqlContext.udf.register("num_word",(name:String)=>1)

sqlContext.sql("select name,num_word(name) from t_word_count").groupBy(df.col("name")).count().show()

sc.stop()

2\hive的使用,内外部表的区别,分区作用,UDF和Hive优化

(1)hive使用:仓库、工具

(2)hive内外部表:内部表数据永久删除,外部表数据删除后、其他人依然可以访问

(3)分区作用:防止数据倾斜

(4)UDF函数:用户自定义的函数(主要解决格式,计算问题),需要继承UDF类

java代码实现

class TestUDFHive extends UDF {
public String evalute(String str){
try{
   return "hello"+str
}catch(Exception e){
   return str+"error"
}
}

}

(5)Hive优化:看做mapreduce处理

 a\排序优化:sort by 效率高于 order by

 b\分区:使用静态分区 (statu_date="20160516",location="beijin"),每个分区对应hdfs上的一个目录

 c\减少job和task数量:使用表链接操作

 d\解决groupby数据倾斜问题:设置hive.groupby.skewindata=true ,那么hive会自动负载均衡

 e\小文件合并成大文件:表连接操作

 f\使用UDF或UDAF函数:http://www.cnblogs.com/ggjucheng/archive/2013/02/01/2888819.html

 
3\Hbase的rk设计,Hbase优化

  a\rowkey:hbase三维存储中的关键(rowkey:行键 ,columnKey(family+quilaty):列键  ,timestamp:时间戳)

   \rowkey字典排序、越短越好

   \使用id+时间:9527+20160517 \使用hash散列:dsakjkdfuwdsf+9527+20160518

   \应用中,rowkey 一般10~100bytes,8字节的整数倍,有利于提高操作系统性能

  b\Hbase优化

   \分区:RegionSplit()方法 \NUMREGIONS=9

   \column不超过3个

   \硬盘配置,便于regionServer管理和数据备份及恢复

   \分配合适的内存给regionserver

   

   其他:

   hbase查询

   (1)get

   (2)scan

       使用startRow和endRow限制   

4\Linux常用操作

  a\awk:

       awk -F:`BEGIN{print "name ip "}{print $1 $7} END{print "结束"}` /etc/passwd
  last | head -5 |awk `BEGIN{print "name ip"}{print $1 $3}END{print "结束了"}`
  b\sed

5\java线程2种方式实现、设计模式、链表操作、排序

(1)2种线程实现

   a\Thread类继承

   TestCL th=new TestCL()//类继承Thread

   th.start()

   b\实现Runnable接口

   Thread th=new Thread(new Runnable(){
public void run(){
//实现
}

   })

   th.start()

(2)设计模式,分为4类

  a\创建模式:如工厂模式、单例模式

  b\结构模式:代理模式

  c\行为模式:观察者模式

  d\线程池模式

6\【最熟悉的一个项目简介、架构图、使用的技术、你负责哪块】

7\cdh集群监控


(1)数据库监控 (2)主机监控 (3)服务监控 (4)活动监控

8\计算机网络工作原理

将分散的机器通过数据通信原理连接起来,实现共享!

9\hadoop生态系统

hdfs\mapreduce\hive\hbase\zookeeper\flume

hdfs原理及各个模块的功能 mapreduce原理 mapreduce优化 数据倾斜

11系统维护:hadoop升级datanode节点

12\【讲解项目要点:数据量、多少人、分工、运行时间、项目使用机器、算法、技术】

13\【学会向对方提问】

14\jvm运行机制及内存原理


运行:

I加载.class文件

II管理并且分配内存

III垃圾回收

内存原理:

IJVM装载环境和配置

II装载JVM.dll 并初始化JVM.dll

IV 处理class类

15\hdfs、yarn参数调优

mapreduce.job.jvm.num.tasks 

默认为1,设置为 -1,重用jvm

16\Hbase、Hive、impala、zookeeper、Storm、spark原理和使用方法、使用其架构图讲解

【某公司笔试题】
1、如何为一个hadoop任务设置mappers的数量

答案:

使用job.setNumMapTask(int n)手动分割,这是不靠谱的

官方文档:“Note: This is only a hint to the framework”说明这个方法只是提示作用,不起决定性作用

实际上要用公式计算:

Max(min.split,min(max.split,block))就设置分片的最大最下值  computeSplitSize()设置

参考:http://blog.csdn.net/strongerbit/article/details/7440111

2、有可能使hadoop任务输出到多个目录中么?如果可以,怎么做?

答案:在1.X版本后使用MultipleOutputs.java类实现

源码:

MultipleOutputs.addNamedOutput(conf, "text2", TextOutputFormat.class, Long.class, String.class);

MultipleOutputs.addNamedOutput(conf, "text3", TextOutputFormat.class, Long.class, String.class);

参考:http://my.oschina.net/leejun2005/blog/94706

发音:Multiple['m?lt?pl]--》许多的



3、如何为一个hadoop任务设置要创建的reducer的数量


答案:job.setNumReduceTask(int n)

       或者调整hdfs-site.xml中的mapred.tasktracker.reduce.tasks.maximum默认参数值
  
4、在hadoop中定义的主要公用InputFormats中,哪一个是默认值:                        

   (A)TextInputFormat

   (B)KeyValueInputFormat

   (C)SequenceFileInputFormat

答案:A

5、两个类TextInputFormat和KeyValueTextInputFormat的区别?

答案:

?FileInputFormat的子类:

TextInputFormat(默认类型,键是LongWritable类型,值为Text类型,key为当前行在文件中的偏移量,value为当前行本身);

?KeyValueTextInputFormat(适合文件自带key,value的情况,只要指定分隔符即可,比较实用,默认是\t分割);

源码:

   String sepStr =job.get("mapreduce.input.keyvaluelinerecordreader.key.value.separator","\t");

   注意:在自定义输入格式时,继承FileInputFormat父类

参考:http://www.cnblogs.com/vichao/archive/2013/06/06/3118100.html

6、在一个运行的hadoop任务中,什么是InputSpilt?

答案:InputSplit是MapReduce对文件进行处理和运算的输入单位,只是一个逻辑概念,每个InputSplit并没有对文件实际的切割,只是记录了要处理的数据的位置(包括文件的path和hosts)和长度(由start和length决定),默认情况下与block一样大。

拓展:需要在定义InputSplit后,展开讲解mapreduce的原理

7、Hadoop框架中,文件拆分是怎么被调用的?

答案:JobTracker, 创建一个InputFormat的 实例,调用它的getSplits()方法,把输入目录的文件拆分成FileSplist作 为Mapper task 的输入,生成Mapper task加入Queue。

源码中体现了拆分的数量

long goalSize = totalSize / (numSplits == 0 ? 1 : numSplits);

long minSize = Math.max(job.getLong(org.apache.hadoop.mapreduce.lib.input.

  FileInputFormat.SPLIT_MINSIZE, 1), minSplitSize);//minSplitSize默认是1

  
8、分别举例什么情况下使用combiner,什么情况下不会使用?

答案:Combiner适用于对记录汇总的场景(如求和),但是,求平均数的场景就不能使用Combiner了

9、Hadoop中job和Tasks之间的区别是什么?

答案: 

job是工作的入口,负责控制、追踪、管理任务,也是一个进程

    包含map task和reduce task

Tasks是map和reduce里面的步骤,主要用于完成任务,也是线程

  
10、Hadoop中通过拆分任务到多个节点运行来实现并行计算,但是某些节点运行较慢会拖慢整个任务的运行,hadoop采用何种机制应对这种情况?

答案:结果查看监控日志,得知产生这种现象的原因是数据倾斜问题

解决:

(1)调整拆分mapper的数量(partition数量)

(2)增加jvm

(3)适当地将reduce的数量变大

11、流API中的什么特性带来可以使map reduce任务可以以不同语言(如perl\ruby\awk等)实现的灵活性?

答案:用可执行文件作为Mapper和Reducer,接受的都是标准输入,输出的都是标准输出

参考:http://www.web520.cn/archives/9220

12、参考下面的M/R系统的场景:

--HDFS块大小为64MB

--输入类型为FileInputFormat

--有3个文件的大小分别是:64k 65MB 127MB

Hadoop框架会把这些文件拆分为多少块?

答案:

64k------->一个block

65MB---->两个文件:64MB是一个block,1MB是一个block

127MB--->两个文件:64MB是一个block,63MB是一个block

13、Hadoop中的RecordReader的作用是什么?

答案:属于split和mapper之间的一个过程 

      将inputsplit输出的行为一个转换记录,成为key-value的记录形式提供给mapper
 
14、Map阶段结束后,Hadoop框架会处理:Partitioning ,shuffle 和sort,在这个阶段都会发生了什么?

答案:

MR一共有四个阶段,split map shuff reduce 在执行完map之后,可以对map的输出结果进行分区,

分区:这块分片确定到哪个reduce去计算(汇总)

排序:在每个分区中进行排序,默认是按照字典顺序。

Group:在排序之后进行分组

15、如果没有定义partitioner,那么数据在被送达reducer前是如何被分区的?

答案:

   Partitioner是在map函数执行context.write()时被调用。

用户可以通过实现自定义的?Partitioner来控制哪个key被分配给哪个?Reducer。

查看源码知道:

如果没有定义partitioner,那么会走默认的分区Hashpartitioner

public class HashPartitioner<K, V> extends Partitioner<K, V> {

  /** Use {@link Object#hashCode()} to partition. */

  public int getPartition(K key, V value, int numReduceTasks) {

    return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;

  }

}

参考:http://blog.csdn.net/gamer_gyt/article/details/47339755

16、什么是Combiner?

答案:这是一个hadoop优化性能的步骤,它发生在map与reduce之间

目的:解决了数据倾斜的问题,减轻网络压力,实际上时减少了maper的输出

源码信息如下:

public void reduce(Text key, Iterator<LongWritable> values,

    OutputCollector<Text, LongWritable> output, Reporter reporter)

    throws IOException {

  LongWritable maxValue = null;

  while (values.hasNext()) {

    LongWritable value = values.next();

    if (maxValue == null) {

      maxValue = value;

    } else if (value.compareTo(maxValue) > 0) {

      maxValue = value;

    }

  }

  output.collect(key, maxValue);

}

在collect实现类中,有这样一段方法

public synchronized void collect(K key, V value)

    throws IOException {

  outCounter.increment(1);

  writer.append(key, value);

  if ((outCounter.getValue() % progressBar) == 0) {

    progressable.progress();

  }

}

下面是说明输出数量达到10000时,开始合并为一个maper

public static final long DEFAULT_COMBINE_RECORDS_BEFORE_PROGRESS = 10000;

Mapreduce原理详解: http://my.oschina.net/itblog/blog/275294
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: