Hadoop的回顾以及面试试题

  • 以下是试题及总结

1. Hadoop集群SafeMode模式

  • SafeMode又称Hadoop安全模式是hadoop的一种保护机制,用于保证集群中的数据块的安全性。
  • 在安全模式下不允许客户端进行任何修改文件的操作,包括上传文件,删除文件,重命名,创建文件夹等操作 虽然不能进行修改文件的操作,但是可以浏览目录结构、查看文件内容的。
  • 在命令行下是可以控制安全模式的进入、退出和查看的。
    命令 hadoop fs -safemode get — 查看安全模式状态
    命令 hadoop fs -safemode enter — 进入安全模式状态
    命令 hadoop fs -safemode leave — 离开安全模式

2.hive的理解

  • hive是建立在hadoop上的数据仓库基础架构(framework)。这是一种可以储存、查询和分析储存在hadoop中的大规模数据的机制。hive定义了简单的类sql查询语言,也称hql,它允许熟悉sql的用户查询数据
  • hive是sql解析引擎,它将sql语句转译成M/R job在hadoop执行
  • 语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。

3.是否可以在Windows上运行Hadoop?

  • 答案是肯定的,可以在Windows上运行Hadoop,因为Hadoop底层实现语言是Java,所以我们在运行Hadoop时是需要Java运行环境的。
  • 在此附上安装教程

4.MapReduce的执行流程

1)MapTask收集我们的map()方法输出的kv对,放到内存缓冲区中
2)从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件
3)多个溢出文件会被合并成大的溢出文件
4)在溢出过程及合并的过程中,都要调用Partitioner进行分区和针对key进行排序
5)ReduceTask根据自己的分区号,去各个MapTask机器上取相应的结果分区数据
6)ReduceTask会取到同一个分区的来自不同MapTask的结果文件,ReduceTask会将这些文件再进行合并(归并排序)
7)合并成大文件后,Shuffle的过程也就结束了,后面进入ReduceTask的逻辑运算过程(从文件中取出一个一个的键值对Group,调用用户自定义的reduce()方法)

5.TextInputFormat怎么进行文件切分的

分片大小是由block块大小决定的,和它的大小一样。比如把一个258MB的文件上传到HDFS上,block块大小是128MB,那么它就会被分成三个block块,与之对应产生三个split,所以最终会产生三个map task。第三个block块里存的文件大小只有2MB,而它的block块大小是128MB,它实际占用Linux file system的空间根据文件大小来决定,而非一个块的大小

6.假如Namenode中没有数据会怎么样?

如果Namenode 中没有数据那么你的datanode中就算有文件,也会找不到数据
因为namenode元数据丢失,导致name不知道文件位置,也不知道有文件

7.如何实现服务器之间的免密登录(便捷版),SSH采用的是什么加密?

1)实现服务器之间的免密登录

  • 我们使用ssh-keygen在ServerA上生成private和public密钥,将生成的public密钥拷贝到远程机器ServerB上后,就可以使用ssh命令无需密码登录到另外一台机器ServerB上。
    在linux系统中,ssh是远程登录的默认工具,因为该工具的协议使用了RSA/DSA的加密算法【默认是DSR算法】,该工具做linux系统的远程管理是非常安全的。
    2)ssh采用两种加密方式
  • 第一种级别(基于口令的安全验证),只要你知道自己帐号和口令,就可以登录到远程主机。
  • 第二种级别(基于密匙的安全验证)需要依靠密匙
  • Ssh采用非对称式加密
    生成公钥和私钥:

[jinghang@hadoop102 .ssh]$ ssh-keygen -t rsa

然后敲(三个回车),就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
将公钥拷贝到要免密登录的目标机器上

[jinghang@hadoop102 .ssh]$ ssh-copy-id hadoop102
[jinghang@hadoop102 .ssh]$ ssh-copy-id hadoop103
[jinghang@hadoop102 .ssh]$ ssh-copy-id hadoop104

8.简单描述MapReduce不合适对哪些场景的使用?

  • 数据规模在TB/PB以下的应用不适合
  • 对实时计算的支持不是很好
  • 主要数据结构是图或网络的应用不适合。图这样的数据结构中包含着各种隐性的关系, 如图的边、子树 、节点之间的父子关系、权重等,而且这些关系并非都能在图中一个结点上表示。这样的特性就要求处理图的算法要在每一次的迭代计算中加入当前图的完整或部分的信息。 这样的算法基本上用MapReduce的框架是不可能实现的,即便能够实现也会是一种很迂回的解决方案。)
  • 纯数学计算的应用不适合. 一个数学上的例子就是斐波那契数列的计算。 某些机器学习的算法,如梯度和较大期望等,也不是很适合使用MapReduce的模式。

9.MapReduce的基本数据类型包括哪些?

  • BooleanWriable:标准布尔型数
  • ByteWriable:单字节数
  • DoubleWriable:双字节数值
  • FloatWriable:浮点数
  • IntWriable:整型数
  • LongWriable:长整型数
  • Text:使用UTF8格式存储的文本
  • NullWriable:当<key,value>中的key或value为空时使用

10.Hive内部表和外部表的区别?

  • 内部表 : 当我们在hive中使用命令删除hive表时 hive所对应的hdfs的目录
    也会被删除 元数据库中的数据 也被删除
  • 外部表 : 在hive中删除了外部表 而外部表所对应的hdfs目录不会被删除 元数据库被删除。

11.yarn有哪几部分组成,作用分别是什么?调度器主要有哪三种,hadoop默认的是哪一种?

a)Yarn主要由ResourceManager、NodeManager、ApplicationMaster、和Container组成。
1)ResourceManager的作用如下:

1.处理客户端的请求
2.监控NodeManager
3.启动或监控ApplicationMaster
4.资源分配与调度

2)NodeManager的作用如下:

1.管理单个节点上的资源
2.处理来自ResourceManager的命令
3.处理来自ApplicationMaster的命令

3)ApplicationMaster的作用如下:

1.负责数据的切分
2.为应用程序申请资源并分配给内部的任务
3.任务的监控与容错

b)调度器主要有 Fair Scheduler,Capacity Scheduler,FIFO Scheduler 默认使用的是Capacity Scheduler容量调度器。

12.如果需要在namenode节点群起集群,你需要如何配置?

1)准备3台客户机(关闭防火墙、静态ip、主机名称)
2)安装JDK
3)配置普通用户具有root权限
4)安装Hadoop
5)配置环境变量
6)配置集群
7)单点启动
8)配置ssh
9)群起并测试集群

13.简单描述Shuffle过程环形缓冲区的作用?

环形缓冲区(字节数组实现),用于存储任务的输出。默认是100M,这其中80%的容量用来缓存,当这部分容量满了的时候会启动一个溢出线程进行溢出操作,写入磁盘形成溢写文件;在溢出的过程中剩余的20%对新生产的数据继续缓存。【简单来说就是别读边写】但如果再次期间缓冲区被填满,map会阻塞直到写磁盘过程完成。

14.Mapreduce执行过程中,在执行Reduce Task之前主要做哪些工作?

reduce task在执行之前的工作是不断地拉取当前job里每个map task的最终的输出文件,然后将不同maptask中某一分区的数据不断地做merge,也最终形成一个文件作为reduce task的输入文件交给reduce

15.简答描述一下hive中的分区表

分区表实际上就是对应一个HDFS文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过WHERE子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多。

16.hdfs-site.xml的3个主要属性?

dfs.name.dir决定的是元数据存储的路径以及DFS的存储方式(磁盘或是远端)
dfs.data.dir决定的是数据存储的路径
fs.checkpoint.dir用于第二Namenode

17.完全分布模式有什么注意点?

密钥同步,etc下的profile文件,同步配置文件

18.Hadoop集群可以运行的3个模式?

1、单机(本地)模式:这种模式在一台单机上运行,没有分布式文件系统,而是直接读写本地操作系统的文件系统。在单机模式(standalone)中不会存在守护进程,所有东西都运行在一个JVM上。这里同样没有DFS,使用的是本地文件系统。单机模式适用于开发过程中运行MapReduce程序,这也是最少使用的一个模式。

2、伪分布式模式:也是在一台单机上运行,但用不同的Java进程模仿分布式运行中的各类结(NameNode,DataNode,JobTracker,TaskTracker,SecondaryNameNode),伪分布式(Pseudo)适用于开发和测试环境,在这个模式中,所有守护进程都在
一台机器上运行。

全分布式模式:全分布模式通常被用于生产环境,使用N台主机组成一个Hadoop集群,Hadoop守护进程运行在每台主机之上。这里会存在Namenode运行的主机,Datanode运行的主机,以及tasktracker运行的主机。在分布式环境下,主节点和从节点会分开。

19.用一句话总结Combiner的作用和意义?

为了减少传输到Reduce中的数据量。它主要是为了削减Mapper的输出从而减少网络带宽和Reducer之上的负载。

20.是否可以自行搭建Hadoop集群,请简述基本搭建流程?

1)安装JDK并配置环境变量(/etc/profile)
2)关闭防火墙
3)配置hosts文件,方便hadoop通过主机名访问(/etc
/hosts)
4)设置ssh免密码登录
5)解压缩hadoop安装包,并配置环境变量
6)修改配置文件、设置java jdk路径和相关的节点配置
(关掉Hive默认开启的Combine_面试题HADOOP_ HOME/sbin/start-dfs.sh
$HADOOP_ HOME/sbin/start-yarn.sh)
9)使用jps查看节点进程

20.用shell脚本完成如下功能,求极值,根据输入数据,输出最大,最小值(达到手写的程度)

#!/bin/bash
max=$1
min=$1
for x in $@
do
        if [ $max -lt  $x ]
        then
                max=$x
        fi
        if [ $min -gt $x ]
        then
                min=$x
        fi
done
echo $max
echo $min

21…编写一个最基本的wordcount单词统计的mapreduce

map端

Public class WDmapper extends Mapper<LongWritable,Text,Text,IntWritable> {
    private Text text=new Text();
    private IntWritable one =new IntWritable(1);
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        String line=value.toString();
        String [] fields=line.split(" ");
        for(String field:fields){
            this.text.set(field);
            context.write(this.text,one);
        }

   }
}

Reducer端

public class WDReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
   private IntWritable v=new IntWritable();
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int sum=0;
        for (IntWritable value : values) {
            sum+=value.get();
        }
        v.set(sum);
        context.write(key,v);
    }
}

Driver端

public class WDDrive {
   		public static void main(String[] args) throws IOException, 								ClassNotFoundException, InterruptedException {
        Job job=Job.getInstance(new Configuration());

        job.setJarByClass(WDDrive.class);

        job.setMapperClass(WDmapper.class);
        job.setReducerClass(WDReducer.class);

        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);

        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        FileInputFormat.setInputPaths(job,new Path(args[0]));
        FileOutputFormat.setOutputPath(job,new Path(args[1]));

       Boolean b= job.waitForCompletion(true);
       System.exit(b?0:1);
    }
}

22.根据如下要求编写对应的HQL语句(手写代码的程度)

  1. 创建一个名为class20的数据库(存在则创建,不存在则不创建)添加两个属性,创建人和创建时间。
Create database if not exists class20 with
tbproperties(‘author’=’wyj’,’data’=’20191129’)
  1. 强制删除class20(含有表,表中有数据)的数据库。
Drop database class20 cascade;
  1. 在class20数据库下创建一个外部表students,字段包含id,姓名、成绩、学号,电话,根据班级设置分区(注意本地文件数据字段以“\t”分割的)
Create external table if not exists students(id int,name
 string,xnumner string,phone string) Partitioned (class string) Row
 format delimited fields terminated by “\t”;
  1. 将本地数据路径为/opt/module/hive/data/students.txt 文件数据追加到students表中的class20分区中
Load data local inpath “/opt/module/hive/data/students.txt”  into
table students partiton(class=”class20”);
  1. 查询students表中class20分区内的学生的学号,姓名,电话
Select xnumber,name,phone from students where class=”class20”;

23.列出常用的hdfs 命令(至少10个,并说明命令的作用)

  • -ls 查询目录
  • -mkdir 创建目录
  • -touch 创建文件
  • -put 将本地文件上传到HDFS上
  • -get 从HDFS上获取文件到本地
  • -copFromLocal将本地文件上床到HDFS上
  • -copTolocal 从HDFS上获取文件到本地
  • -cp 复制
  • -rm -r 删除,移除, -rf 强制递归删除
  • -mv 如果两个目录一样则是重命名,否则是移动
  • -help 帮助
  • -cat 显示文件内容