大数据阶段一面试题库

一、简单描述你对Hadoop集群SafeMode模式的理解?

集群处于安全模式,不能执行重要操作(写操作),集群属于只读状态。但是严格来说,只是保证HDFS元数据信息的访问,而不保证文件的访问。集群启动完成后,自动退出安全模式, 如果集群处于安全模式,想要完成写操作,需要离开安全模式。
(1)bin/hdfs dfsadmin -safemode get (功能描述:查看安全模式状态)
(2)bin/hdfs dfsadmin -safemode enter (功能描述:进入安全模式状态)
(3)bin/hdfs dfsadmin -safemode leave (功能描述:离开安全模式状态)
(4)bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式状态)。
对于全新创建的HDFS集群,NameNode启动后不会进入安全模式,因为没有Block信息。

二、是否可以在Windows上运行Hadoop?

你最好不要这么做,RedHat、Linux或者是Ubuntu才是Hadoop的最佳操作系统。在Hadoop安装中,Windows通常不会被使用,因为会出现各种各样的问题。因此,Windows绝对不是Hadoop的推荐系统。

三、在MapReduce处理任务时,简单描述经过哪节基本流程?

在这里插入图片描述
在这里插入图片描述

四、简答描述以下TextInputFormat怎么进行文件切分?

TextInputFormat根据文件大小将文件拆分成splits,如果单个文件较小,则每个个文件为一个split,并将文件按行分割形成<key,value>对,如果单个文件较大。超过block块默认大小得1.1倍,则会将文件切分为多个split。这一步由MapReduce框架自动完成,其中偏移量包括了回车所占的字符数。将分割好的<key,value>对交给用户定义的map方法进行处理,生成新的<key,value>对。得到map方法输出的<key,value>对后,Mapper会将它们按照key值进行排序,并执行Combine过程,将key至相同value值累加,得到Mapper的最终输出结果。Reducer先对从Mapper接收的数据进行排序,再交由用户自定义的reduce方法进行处理,得到新的<key,value>对,并作为任务的输出结果。

五、假如Namenode中没有数据会怎么样?

首先说明Namenode节点肯定不正常,集群肯定不正常得,没有数据的Namenode就不能称之为Namenode,通常情况下,Namenode肯定会有数据,并且存储的是元数据。

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

实现免密登录步骤:

  • 在服务器生成密钥对 ssh-keygen -t rsa 三次回车
  • 发送公钥到本机 ssh-copy-id hostname(服务器主机名,一般先发给自己实现本机免密登录);输入一次密码
  • 将.ssh文件夹中的文件分别分发至集群中其他服务器(节点)
  • SSH 为建立在应用层基础上的安全协议,采用非对称加密(rsa加密算法)

七、简单描述MapReduce不合适对哪些场景的使用,其实问得就是他得缺点?

MapReduce不适合做低延迟数据访问场景的使用
MapReduce不适合处理大量小文件
MapReduce不适合处理流式计算

八、MapReduce的基本数据类型包括哪些?

BooleanWritable ByteWritable IntWritable FloatWritable LongWritable DoubleWritable Text MapWritable ArrayWritable NullWritable

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

由ResourceManager、NodeManager、ApplicationMaster和Container等组件构成;

ResourceManager:处理客户端请求、监控NodeManager、启动或监控ApplicationMaster、资源的分配与调度
NodeManager:管理单个节点上的资源、处理来自ResourceManager的命令、处理来自ApplicationMaster的命令
ApplicationMaster:负责数据的切分、为应用程序申请资源并分配给内部的任务、任务的监控与容错
Container:Container是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等

FIFO、Capacity Scheduler(容量调度器)和Fair Scheduler(公平调度器)
Hadoop2.7.2默认的资源调度器是Capacity Scheduler(容量调度器)

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

首先确保你得集群配置是正确得,单点启动能够成功,如果要群起我们需要在etc/hadoop/Slaves文件中添加数据节点,也就是从节点,来告诉namenode群起的时候启动那些从节点(datanode)

十一、简单描述Shuffle过程环形缓冲区的作用?

Key、value从map()方法输出,被outputcollector收集通过getpartitioner()方法获取分区 号,在进入环形缓冲区。默认情况下,环形缓冲区大小值为100M。当map输入的数据 进入环形缓冲区的量达到80MB以上时,开始执行溢写过程,溢写过程中如果有其他数据进入,由剩余的20%反向写入。溢写过程会根据key、value先进行分区,之后进行排序,最终maptask溢写文件经过归并排序后落入本地磁盘,reduceTask将多个mapTask下相同分区的数据copy到不同的reduceTask中进行归并排序后一次读取一组数据给reduce()函数

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

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

十三、hdfs-site.xml的3个主要属性?

dfs.namenode.name.dir决定的是元数据存储的路径以及DFS的存储方式(磁盘或是远端)
dfs.datanode.data.dir决定的是数据存储的路径
dfs.replication决定数据的副本数
dfs.blocksize 设置块的大小(默认128M)
dfs.namenode.checkpoint.dir secondarynamenode本地镜像文件的存储位置(目录)

十四、完全分布模式有什么注意点?

完全分布式集群通常被用于生产环境,这里我们使用N台主机组成一个Hadoop集群,需要合理的搭配个服务器运行节点,Hadoop守护进程运行在每台主机之上。这里会存在Namenode运行的主机,Datanode运行的主机,SecondaryNameNode运行的节点,以及task tracker运行的主机,我们需要设置ResourceManager运行的主机,NodeManager运行的主机。在分布式环境下,主节点和从节点会分开。

十五、Hadoop集群可以运行的3个模式?

单机(本地)模式 伪分布式模式 全分布式模式

十六、Combiner的作用和意义?

(1)Combiner的意义就是对每一个MapTask的输出进行局部汇总,以减小网络传输量;
(2)并不是任何情况都能够使用Combiner,我们需要在不影响业务的情况下使用它。

十七、用shell脚本完成如下功能,求极值,根据输入数据,输出最大,最小值

read -p "请输入求值规则:" RULE
echo $RULE
if [ $RULE -eq 1 ]
then
       max=$1
        for value in "$@"
        do
                if [ $value -gt $max ]
                then                     
			max=$value
                fi
        done
        echo "最大值为:" $max
elif [ $RULE -eq 0 ]
then
        mix=$1
        for value in "$@"
        do
   		if [ $value -lt $mix ]
                then                       
   			mix=$value
                fi
        done
        echo "最小值为:" $mix
else
     echo "未知命令"
 fi

十八、编写一个最基本的wordcount单词统计的mapreduce

Mapper

package com.jh.wordcount;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;

/**
 * KEYIN:LongWritable(偏移量)
 * VALUEIN:Text(文本中每一行的内容)
 * KEYOUT:Text(某一个单词作为key)
 * VALUEOUT:IntWritable(单词出现的个数)
 */
public class WcMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
    // map输出的key值
    private Text keyText = new Text();
    // map输出的value值
    private IntWritable one = new IntWritable(1);
    
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//        super.map(key, value, context);
        // 获取文本中的行数据
        String line = value.toString();
        // 分割字符串(根据空格分割字符串)
        String [] fileds = line.split(" ");
        for (String filed : fileds) {
            keyText.set(filed);
            context.write(keyText, one);
        }
    }
}

Reducer

package com.jh.wordcount;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;

/**
 * KEYIN:Text(map端输出的key作为reduce输入的key)
 * VALUEIN:IntWritable(map端输出的value作为reduce输入的value)
 * KEYOUT:Text(以单词作为输出的key值)
 * VALUEOUT:IntWritable(统计单词出现的总数,作为输出的value)
 */
public class WcReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
    private IntWritable total = new IntWritable();
    
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
//        super.reduce(key, values, context);
        // 统计单词出现的总数
        int sum = 0;
        for (IntWritable value : values) {
            // 累加,统计单词出现总次数
            sum += value.get();
        }
        total.set(sum);
        // key,value写入到上下文中
        context.write(key, total);
    }
}

Driver

package com.jh.wordcount;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.CombineTextInputFormat;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.io.Text;
import java.io.IOException;

public class WcDriver {
    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        // 获取一个job实例
        Job job = Job.getInstance(new Configuration());
    
        // 设置inputformat
//        job.setInputFormatClass(NLineInputFormat.class);
        // 设置根据行切片,3行切一片
//        NLineInputFormat.setNumLinesPerSplit(job, 3);
    
        //设置CombineTextInputFormat(合并小文件)
//        job.setInputFormatClass(CombineTextInputFormat.class);
//        CombineTextInputFormat.setMaxInputSplitSize(job,4194304);
    
        // 设置CombineTextInputFormat(合并小文件)
        job.setInputFormatClass(CombineTextInputFormat.class);
        CombineTextInputFormat.setMaxInputSplitSize(job,4194304);
        
        // 设置本程序的jar包类的路径
        job.setJarByClass(WcDriver.class);
        
        // 设置map类和reduce类
        job.setMapperClass(WcMapper.class);
        job.setReducerClass(WcReducer.class);
        
        // 设置map输出的key和value类型
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);

        // 设置reduce输出的key和value类型
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        // 设置处理文本的输入和输出路径
        FileInputFormat.setInputPaths(job, new Path("D:\\jinghang\\Java\\idea\\aa\\wordcount"));
        FileOutputFormat.setOutputPath(job, new Path("D:\\jinghang\\Java\\idea\\aa\\wordcountoutput"));

        // 提交job任务
        boolean b = job.waitForCompletion(true);
        System.exit(b ? 0 : 1);
    }
}

十九、列出常用的hdfs 命令

Hadoop fs | hdfs dfs 命令分类

本地文件 -> HDFS

-put    将本地数据上传至hdfs
-copyFromLocal    将本地文件数据拷贝到hdfs
-moveFromLocal    将本地文件数据移动到hdfs,成功后本地数据会删除
-appendToFile    追加一个文件到已经存在的文件末尾

HDFS与HDFS之间

-ls    查看hdfs文件目录
-mkdir    在HDFS上创建目录
-rm    删除文件或者文件夹
-rmr    递归删除
-cp    从一个目录拷贝文件至另一目录
-mv    在HDFS目录中移动文件
-chown    修改文件所属用户权限
-chmod    修改文件所属读写权限
-du -h    文件夹暂用的空间大小
-df -h    查看系统分区情况
-cat    查看文件

HFDS -> 本地

-get    从hdfs下载文件至本地
-getmerge    合并hdfs目录下的文件至本地
-copyToLocal    从hdfs拷贝文件至本地

二十、zookeeper是什么(概括)?

Zookeeper是一个分布式协调服务的开源框架,主要用来解决分布式集群中应用系统的一致性问题;zooKeeper本质上是一个分布式的小文件存储系统,提供基于类似于文件系统的目录树方式的数据存储,并且可以对树中的节点进行有效管理,从而用来维护和监控你存储的数据的状态变化,通过监控这些数据状态的变化,从而可以达到基于数据的集群管理,诸如:统一命名服务、分布式配置管理、负载均衡、分布式锁、分布式协调等功能。

二十一、zookeeper特点?

A. Zookeeper:一个领导者(Leader),多个跟随者(Follower)组成的集群
B. 集群中只要有半数以上节点存活,Zookeeper集群就能正常服务
C. 全局数据一致:每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的
D. 可靠性:如果消息被其中一台服务器接受,那么将被所有服务器接收
E. 顺序性:更新请求顺序进行,来自同一个Client的更新请求按其发送顺序依次执行
F. 数据更新原子性:一次数据更新要么成功(半数以上节点成功),要么失败,不存在中间状态
G. 实时性:Zookeeper保证客户端再一定事件间隔范围内获取服务器的更新信息,或则服务器失效的信息

二十二、zookeeper分布式环境如何搭建,步骤?

A. 集群规划:在hadoop节点上部署Zookeeper
B. 解压Zookeeper安装包到/opt/module/目录下:[jinghang@hadoop01 software]$ tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/
C. 重命名/opt/module/zookeeper-3.4.10/conf这个目录下的zoo_sample.cfg为zoo.cfg
D. 打开zoo.cfg文件,修改数据存储路径配置(dataDir=/opt/module/zookeeper-3.4.10/zkData),增加配置server.1=hadoop01:2888:3888…
E. 在/opt/module/zookeeper-3.4.10/这个目录下创建zkData
F. 在/zkData目录下创建一个myid的文件,在文件中添加与server对应的编号(1,2,3…)
G. 分发配置好的zookeeper到其他机器上,并修改myid文件中的内容
H. 分别在各个节点上启动Zookeeper:bin/zkServer.sh start
I. 查看状态:bin/zkServer.sh status

二十三、zookeeper的常用命令(增、删、改、查、观察者、其他命令)

  1. 显示所有操作命令:
    help
  2. 增加:
    create [-e] [-s] path data acl
    -s 有序节点(序列号递增)
    -e 表示临时节点(关闭当前会话,即删除) (临时节点下不能添加其他子节点)
  3. 删除:
    delete path [version] 删除节点,并且只能删除空节点(不能存在子节点)
    rmr path 删除非空节点
  4. 修改:
    set path data [version] 修改节点数据
    set /school0000000001 zhangxiaozhang
    set /school0000000001 12345 2[指定数据的版本]
  5. 查询:
    ls path [watch] 获取当前节点的子节点
    ls2 path [watch] 获取当前节点的子节点,还会返回当前节点的信息
    get path [watch] 获取当前节点数据,并返回当前节点的信息
    stat path [watch] 返回当前节点的信息
  6. 添加约束:
    etquota -n|-b val path (软限制,只会给警告提示)
    -n:设置某节点下的最大子节点数
    -b:设置某节点下的存储的最大数据量
    listquota path 查看节点的约束(限制)
    Output quota for /school0000000001 count=-1,bytes=-1
    count=-1,bytes=-1;表示没有添加任何限制
    delquota [-n|-b] path
  7. 其他命令:
    history 查看历史命令
    redo 命令编号:该命令可以重新执行指定命令编号的历史命令,命令编号可以通过history查看
  8. 观察者:(观察者只生效一次)
  • ls path [watch] 获取当前节点的子节点,观察节点变化
    WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/
  • ls2 path [watch] 获取当前节点的子节点,还会返回当前节点的信息,观察节点变化
    WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/
  • get path [watch] 获取当前节点数据,并返回当前节点的信息 观察节点数据变化
    WatchedEvent state:SyncConnected type:NodeDataChanged path:/school0000000001
  • stat path [watch] 返回当前节点的信息 观察节点数据属性变化
    WatchedEvent state:SyncConnected type:NodeDataChanged path:/school0000000001

二十四、zookeeper集群的角色和作用,observer的使用场景以及如何配置?

https://zhuanlan.zhihu.com/p/42067231
Leader:Zookeeper集群工作的核心,事务请求(写操作)的唯一调度和处理者,保证集群事务处理的顺序性;集群内部各个服务器的调度者
Follower:处理客户端非事务(读操作)请求,转发事务请求给Leader;参与集群Leader选举投票
Observer:对于访问量比较大的集群,可以新增观察者角色
观察者角色,观察Zookeeper集群的最新状态变化并将这些状态同步过来,对于非事务请求可以进行独立处理,对于事务请求,则
则会转发给Leader服务器进行处理;不会参与任何形式的投票只提供非事务服务,通常用于在不影响集群事务处理能力的前提下提升集群的非事务处理能力

二十五、zookeeper节点类型有哪些?

A. 持久(Persistent):客户端和服务器端断开连接后,创建的节点不删除
B. 短暂(Ephemeral):客户端和服务器端断开连接后,创建的节点自己删除
C. 持久化目录节点:客户端与Zookeeper断开连接后,该节点依旧存在
D. 持久化顺序编号目录节点:客户端与Zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
E. 临时目录节点:客户端与Zookeeper断开连接后,该节点被删除
F. 临时顺序编号目录节点:客户端与Zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号

二十六、Stat结构体相关参数?

czxid-创建节点的事务zxid
ctime - znode被创建的毫秒数(从1970年开始)
mzxid - znode最后更新的事务zxid
mtime - znode最后修改的毫秒数(从1970年开始)
pZxid-znode最后更新的子节点zxid
cversion - znode子节点变化号,znode子节点修改次数
dataversion - znode数据变化号(修改一次会加一)
ephemeralOwner- 如果是临时节点,这个是znode拥有者的session id。如果不是临时节点则是0
dataLength- znode的数据长度
numChildren - znode子节点数量

二十七、请简述ZooKeeper的选举机制?

半数机制:集群中半数以上机器存活,集群可用;所以Zookeeper适合安装奇数台服务器

  • 全新集群选举:
    假设目前有5台服务器,每台服务器均没有数据,它们的编号分别是1,2,3,4,5,按编号依次启动,它们的选举过程如下:
    服务器1启动,给自己投票,然后发投票信息,由于其它机器还没有启动所以它收不到反馈信息,服务器1的状态一直属于Looking。
    服务器2启动,给自己投票,同时与之前启动的服务器1交换结果,由于服务器2的编号大所以服务器2胜出,但此时投票数没有大于半数,所以两个服务器的状态依然是LOOKING。
    服务器3启动,给自己投票,同时与之前启动的服务器1,2交换信息,由于服务器3的编号最大所以服务器3胜出,此时投票数正好大于半数,所以服务器3成为领导者,服务器1,2成为小弟。
    服务器4启动,给自己投票,同时与之前启动的服务器1,2,3交换信息,尽管服务器4的编号大,但之前服务器3已经胜出,所以服务器4只能成为小弟。
    服务器5启动,后面的逻辑同服务器4成为小弟。
  • 非全新集群选举
    对于运行正常的zookeeper集群,中途有机器down掉,需要重新选举时,选举过程就需要加入数据ID、服务器ID和逻辑时钟。
    其中:
    数据ID:数据新的version就大,数据每次更新都会更新version。
    服务器ID:就是我们配置的myid中的值,每个机器一个。
    逻辑时钟:这个值从0开始递增,每次选举对应一个值。 如果在同一次选举中,这个值是一致的。
    这样选举的标准就变成:
    逻辑时钟小的选举结果被忽略,重新投票;
    统一逻辑时钟后,数据id大的胜出;
    数据id相同的情况下,服务器id大的胜出;
    根据这个规则选出leader。

二十八、请简述zookeeper监听原理是什么?

A. 首先要有一个main()线程
B. 在main线程中创建Zookeeper客户端,这时就会创建两个线程,一个负责网络连接通信(connet),一个负责监听(listener)
C. 通过connect线程将注册的监听事件发送给Zookeeper
D. 在Zookeeper的注册监听器列表中将注册的监听事件添加到列表中
E. Zookeeper监听到有数据或路径变化,就会将这个消息发送给listener线程
F. listener线程内部调用了process()方法

二十九、请简述zookeeper数据的写流程?

A. Client向ZooKeeper的Server1上写数据,发送一个写请求
B. 如果Server1不是Leader,那么Server1 会把接受到的请求进一步转发给Leader,因为每个ZooKeeper的Server里面有一个是Leader;这个Leader 会将写请求广播给各个Server,比如Server1和Server2,各个Server写成功后,会向Leader发送成功信息
C. 当Leader收到半数以上(大多数)Server 数据写成功的信息,说明该数据写成功了;Leader会告诉server1数据写成功了
D. Server1会进一步通知Client数据写成功了,这时就认为整个写操作成功

三十、ZooKeeper的部署方式有哪几种?集群中的角色有哪些?集群最少需要几台机器?

部署方式单机模式、集群模式
角色:Leader、Follower和Observer
集群最少需要机器数:3

发布了13 篇原创文章 · 获赞 11 · 访问量 2793

猜你喜欢

转载自blog.csdn.net/weixin_45557389/article/details/103833109