1、下面哪个Linux命令可以一次显示一页内容? (B)
A pause () B cat C more(查看一页) D grep(查找)
2、怎样更改一个文件的权限设置? (B)
A attrib B chmod C change
D. file
3、假如当前系统是在 level
3 运行,怎样不重启系统就可转换到 level 5 运行? (B)
A. Set level = 5 B. tel init 5 C. run 5 D. ALT-F7-5
A 配置本地回环地址 B 配置网卡的IP地址
C 激活网络适配器
D 加载网卡到内核中
5、 下列关于链接描述,错误的是 (B)
A 硬链接就是让链接文件的i节点号指向被链接文件的i节点
B 硬链接和符号连接都是产生一个新的i节点
C 链接分为硬链接和符号链接
D 硬连接不能链接目录文件
6、 在局域网络内的某台主机用ping命令测试网络连接时发现网络内部的主机都可以连同,而不能与公网连通,问题可能是(D)
A 主机IP设置有误
B 没有设置连接局域网的网关
C 局域网的网关或主机的网关设置有误
D 局域网DNS服务器设置有误
7、对名为fido的文件用chmod 551 fido 进行了修改,则它的许可权是 (D)
A -rwxr-xr-x B -rwxr–r-- C -r------ D -r-xr-x-x
8、NFS是 (C)系统.
A 文件 B 磁盘 C 网络文件
D 操作
9、改变文件所有者的命令为
( C)
A chmod B touch C
chown D cat
10、 Linux文件权限一共10位长度,分成四段,第三段表示的内容是
©
A 文件类型 B 文件所有者的权限
C 文件所有者所在组的权限 D 其他用户的权限
11、 下面哪个程序负责 HDFS 数据存储。(C )
A NameNode
B Jobtracker
C Datanode
D secondaryNameNode
E tasktracker
12、 HDfS 中的 block 默认保存几份?(A)
A 3 份 B 2 份 C 1 份 D不确定
13、下列哪个程序通常与
NameNode 在一个节点启动?(D) 1.0版本
A SecondaryNameNode B DataNode
C TaskTracker D Jobtracker
14、 下列哪项通常是集群的最主要瓶颈:©
A CPU B网络 C磁盘 IO D内存
15、 关于 SecondaryNameNode 哪项是正确的?©
A 它是 NameNode 的热备
B 它对内存没有要求
C 它的目的是帮助 NameNode 合并编辑日志,减少 NameNode 启动时间
D SecondaryNameNode 应与 NameNode 部署到一个节点。
16、下列哪个属性是hdfs-site.xml中的配置?(A)
A、dfs.replication
B、fs.defaultFS
C、mapreduce.framework.name
D、yarn.resourcemanager.address
17、Hadoop-2.7.3集群中的HDFS的默认的数据块的大小是?(C)
A、32M
B、64M
C、128M
D、256M
18、 如果我们现有一个安装2.6.5版本的hadoop集群,在不修改默认配置的情况下存储200个每个200M的文本文件,请问最终会在集群中产生多少个数据块(包括副本)?(D)
A、200
B、40000
C、400
D、1200
19、以下哪个不是HDFS的守护进程?(C)
A、secondarynamenode
B、datanode
C、mrappmaster/yarnchild
D、namenode
20、现在在hadoop集群当中的配置文件中有这么两个配置,请问假如集群当中有一个节点宕机,主节点namenode需要多长时间才能感知到?(B)默认时间:10分30秒
310+22
dfs.heartbeat.interval
3
heartbeat.recheck.interval
2000
A、26秒
B、34秒
C、30秒
D、20秒
二、填空题
在Linux系统中,以 文件 方式访问设备
。
链接分为: 硬连接___ 和
软连接 。
前台起动的进程使用 kill -9 终止。
_dhcp___可以实现动态 IP 地址分配。
在超级用户下显示Linux系统中正在运行的全部进程,应使用的命令及参数是__ps-aux___。
在用vi编辑文件时,将文件内容存入test.txt文件中,应在命令模式下键入
:w 。
7、Hadoop2.X版本有__hdfs_____、__mr、_common、_yarn_4个模块。
8、HDFS解除安全模式的命令是hdfs dfsadmin
-safemode enter(开启)(关闭)。
9、HA实现的模式有_ QJM_和__NFS__。
10、HA中同步NameNode的命令是
hdfs namenode -bootstarpStandby。
三、问答题
1、简单叙述如何安装开源版本Hadoop,无需完整步骤
2、简单叙述mapreduce中combiner,partition的作用.
Combiner:
combine分为map端和reduce端,作用是把同一个key的键值对合并在一起,可以自定义的。
combine函数把一个map函数产生的
这个value2亦可称之为values,因为有多个。这个合并的目的是为了减少网络传输。
Partition:
设置shuffle的key, partition是在map阶段完成后执行的。然后将分好区的数据传输到reduce端,也就是由Partitioner来决定每条记录应该送往哪个reducer节点。
3、运行Hadoop集群需要哪些守护进程?
4、Hadoop常见输入格式是什么?
TextInputFormat 以行偏移量为key,以换行符前的字符为Value
KeyValueTextInputFormat 默认分割符为”\t”,根据分割符来切分行,前为key,后为value
NLineInputFormat
根据属性mapreduce.input.lineinputformat.linespermap所设置的行数为每片split的行数
SequenceFileInputFormat
使用Hadoop特有文件格式SequenceFile.Reader进行读写,读取二进制文件
DBInputFormat 通过与数据建立连接,将读取的数据根据map数进行分片
5、主动和被动“名称节点”是什么?(提示 HA)
Active Standby
6、Hadoop 块的存储策略?
HDFS采用一种称为机架感知(rack-aware)的策略来改进数据的可靠性、可用性和网络带宽的利用率。目前实现的副本存放策略只是在这个方向上的第一步。实现这个策略的短期目标是验证它在生产环境下的有效性,观察它的行为,为实现更先进的策略打下测试和研究的基础。
大型HDFS集群系统往往运行在跨越多个机架的数据中心,不同机架上的两台机器之间的通信需要经过交换机。在大多数情况下,同一个机架内的两台机器间的带宽会比不同机架的两台机器间的带宽大。
通过一个机架感知的过程,NameNode可以确定每个DataNode所属的机架ID。一个简单但没有优化的策略就是将副本存放在不同的机架上。这样可以有效防止当整个机架失效时数据的丢失,并且允许读数据的时候充分利用多个机架的带宽。这种策略设置可以将副本均匀分布在集群中,有利于组件失效情况下的负载均衡。但是,因为这种策略的一个写操作需要传输数据块到多个机架,因此增加了写的代价。
HDFS默认的副本系数是3,这适用于大多数情况。副本存放策略是将第一个副本存放在本地机架的节点上,将第二个副本放在同一机架的另一个节点上,将第三个副本放在不同机架的节点上。这种策略减少了机架间的数据传输,这就提高了写操作的效率。机架的错误远远比节点的错误少,所以这个策略不会影响数据的可靠性和可用性。
与此同时,因为数据块只放在两个(不是3个)不同的机架上,所以此策略减少了读取数据时需要的网络传输总带宽。在这种策略下,副本并不是均匀分布在不同的机架上。三分之一的副本在一个节点上,三分之一的副本在同一个机架的其他节点上,其他副本均匀分布在剩下的机架中,这一策略在不损害数据可靠性和读取性能的情况下改进了写的性能。
为了降低整体的带宽消耗和读取延时,HDFS会尽量让读取程序读取离它最近的副本。如果读取程序的同一个机架上有一个副本,那么就读取该副本;如果一个HDFS集群跨越多个数据中心,那么客户端也将首先读取本地数据中心的副本。
7、怎么提高MapReduce运算效率
MapReduce计算模型的优化主要集中在两个方面:一是计算性能方面的优化;二是I/O操作方面的优化。
1.自定义分区 extends Partitioner 可以使用map输出的key或者value
2 .启用Combiner 减少reduce端拉去的文件(key value对)数量
3.shuffle启用压缩 map端压缩 reduce端解压缩 平衡集群的资源(CPU 内存)和络IO
4.CombinerFileInputFormat来合并小文件
5.调整shffle环形缓冲区大小以及spill溢写的阈值(MapOutputBuffer)
6.自定义key和value,根据业务需求.
8、简述下你对“数据倾斜”的理解,并提出解决方案
何为数据倾斜?
在弄清什么是数据倾斜之前,我想让大家看看数据分布的概念:
正常的数据分布理论上都是倾斜的,就是我们所说的20-80原理:80%的财富集中在20%的人手中, 80%的用户只使用20%的功能 , 20%的用户贡献了80%的访问量 , 不同的数据字段可能的数据倾斜一般有两种情况:一种是唯一值非常少,极少数值有非常多的记录值(唯一值少于几千)一种是唯一值比较多,这个字段的某些值有远远多于其他值的记录数,但是它的占比也小于百分之一或千分之一
数据倾斜:
数据倾斜在MapReduce编程模型中十分常见,用最通俗易懂的话来说,数据倾斜无非就是大量的相同key被partition分配到一个分区里,造成了’一个人累死,其他人闲死’的情况,这种情况是我们不能接受的,这也违背了并行计算的初衷,首先一个节点要承受着巨大的压力,而其他节点计算完毕后要一直等待这个忙碌的节点,也拖累了整体的计算时间,可以说效率是十分低下的。
解决方案:
1.增加jvm内存,这适用于第一种情况(唯一值非常少,极少数值有非常多的记录值(唯一值少于几千)),这种情况下,往往只能通过硬件的手段来进行调优,增加jvm内存可以显著的提高运行效率。
2.增加reduce的个数,这适用于第二种情况(唯一值比较多,这个字段的某些值有远远多于其他值的记录数,但是它的占比也小于百分之一或千分之一),我们知道,这种情况下,最容易造成的结果就是大量相同key被partition到一个分区,从而一个reduce执行了大量的工作,而如果我们增加了reduce的个数,这种情况相对来说会减轻很多,毕竟计算的节点多了,就算工作量还是不均匀的,那也要小很多。
3.自定义分区,这需要用户自己继承partition类,指定分区策略,这种方式效果比较显著。 4.重新设计key,有一种方案是在map阶段时给key加上一个随机数,有了随机数的key就不会被大量的分配到同一节点(小几率),待到reduce后再把随机数去掉即可。 5.使用combinner合并,combinner是在map阶段,reduce之前的一个中间阶段,在这个阶段可以选择性的把大量的相同key数据先进行一个合并,可以看做是local reduce,然后再交给reduce来处理,这样做的好处很多,即减轻了map端向reduce端发送的数据量(减轻了网络带宽),也减轻了map端和reduce端中间的shuffle阶段的数据拉取数量(本地化磁盘IO速率),推荐使用这种方法。
9、简述shuffle阶段(可画图展示)
reducer如何知道从哪台机器上得到map输出?
map任务成功完成后,它们使用心跳机制通知它们的application master,对于指定作业,application
master知道map输出和主机位置之间的映射关系。reducer中的一个线程周期性地请求master获取map输出主机的位置,直到获得所有的输出位置。
因为第一个reducer可能会失败,所以在第一个reducer检索map输出之后,主机不会立即从磁盘上删除它们。相反,主机会等待应用程序,直到application master 告诉它删除map输出,这是在作业完成后完成的。
10· Hadoop搭建的几种方式的理解
(单节点,伪分布,完全,HA,联邦)
单机模式
在一台单机上运行,没有分布式文件系统,而是直接读写本地操作系统的文件系统
伪分布式
也是在一台单机上运行,但用不同的Java进程模仿分布式运行中的各类结点(NameNode,DataNode,JobTracker,TaskTracker,SecondaryNameNode)
完全分布式
真正的分布式,由3个及以上的实体机或者虚拟机组件的机群。
HA,即高可用(7*24小时不中断服务)
实现高可用最关键的是消除单点故障
HDFS联邦
解决系统扩展性、整体性能和隔离性
四、编程题
以下是博客的好友列表数据,冒号前是一个用户,冒号后是该用户的所有好友(数据中的好友关系是单向的)
A:B,C,D,F,E,O
B:A,C,E,K
C:F,A,D,I
D:A,E,F,L
E:B,C,D,M,L
F:A,B,C,D,E,O,M
求出哪些人两两之间有共同好友,及他俩的共同好友都有谁?(只写思路即可)
此题旨在求两人之间的共同好友,原信息是<人,该人的所有好友>,因此首先以好友为键,人为值,交给reduce找出拥有此好友的所有人;再将这些人中两两配对作为键,之前的键(好友)作为值交给reduce去合并
简而言之我打算分成两个步骤,两次迭代
1)求出每一个人都是哪些人的共同好友
2)把这些人(用共同好友的人)作为key,其好友作为value输出
public class SharedFriend {
/*
第一阶段的map函数主要完成以下任务
1.遍历原始文件中每行<所有朋友>信息
2.遍历“朋友”集合,以每个“朋友”为键,原来的“人”为值 即输出<朋友,人>
*/
static class SharedFriendMapper01extends Mapper{
@Override
protected void map(LongWritable key, Text value,Context context)
throws IOException, InterruptedException {
String line =value.toString();
String[]person_friends = line.split(":");
String person =person_friends[0];
String[] friends= person_friends[1].split(",");
for(Stringfriend : friends){
context.write(newText(friend), new Text(person));
}
}
}
/*
第一阶段的reduce函数主要完成以下任务
1.对所有传过来的<朋友,list(人)>进行拼接,输出<朋友,拥有这名朋友的所有人>
*/
static class SharedFriendReducer01 extends Reducer{
@Override
protected void reduce(Textkey, Iterable values,Context context)
throwsIOException, InterruptedException {
StringBuffer sb= new StringBuffer();
for(Text friend: values){
sb.append(friend.toString()).append(",");
}
sb.deleteCharAt(sb.length()-1);
context.write(key,new Text(sb.toString())); } }
/*第二阶段的map函数主要完成以下任务
1.将上一阶段reduce输出的<朋友,拥有这名朋友的所有人>信息中的“拥有这名朋友的所有人”进行排序 ,以防出现B-C C-B这样的重复
2.将“拥有这名朋友的所有人”进行两两配对,并将配对后的字符串当做键,“朋友”当做值输出,即输出<人-人,共同朋友> */
static class SharedFriendMapper02 extendsMapper{
@Override
protected void map(LongWritable key, Text value,Context context)
throwsIOException, InterruptedException {
String line =value.toString();
String[]friend_persons = line.split("\t");
String friend =friend_persons[0];
String[] persons= friend_persons[1].split(",");
Arrays.sort(persons);
//排序
//两两配对
for(inti=0;i 中的“共同好友”进行拼接 最后输出<人-人,两人的所有共同好友>
*/
static class SharedFriendReducer02extends Reducer
@Override
protected void reduce(Textkey, Iterable values,Context context)
throws IOException,InterruptedException {
StringBuffer sb = newStringBuffer();
Setset = new HashSet();
for(Text friend: values){
if(!set.contains(friend.toString()))
set.add(friend.toString());
}
for(String friend: set){
sb.append(friend.toString()).append(",");
}
sb.deleteCharAt(sb.length()-1);
context.write(key,new Text(sb.toString()));
}
}
public static void main(String[] args)throws Exception {
Configuration conf = newConfiguration();
//第一阶段
Job job1 =Job.getInstance(conf);
job1.setJarByClass(SharedFriend.class);
job1.setMapperClass(SharedFriendMapper01.class);
job1.setReducerClass(SharedFriendReducer01.class);
job1.setOutputKeyClass(Text.class);
job1.setOutputValueClass(Text.class);
FileInputFormat.setInputPaths(job1,new Path("H:/大数据/mapreduce/sharedfriend/input"));
FileOutputFormat.setOutputPath(job1,new Path("H:/大数据/mapreduce/sharedfriend/output"));
boolean res1 =job1.waitForCompletion(true);
//第二阶段
Job job2 =Job.getInstance(conf);
job2.setJarByClass(SharedFriend.class);
job2.setMapperClass(SharedFriendMapper02.class);
job2.setReducerClass(SharedFriendReducer02.class);
job2.setOutputKeyClass(Text.class);
job2.setOutputValueClass(Text.class);
FileInputFormat.setInputPaths(job2,new Path("H:/大数据/mapreduce/sharedfriend/output"));
FileOutputFormat.setOutputPath(job2,new Path("H:/大数据/mapreduce/sharedfriend/output01"));
boolean res2 =job2.waitForCompletion(true);
System.exit(res1?0:1);
}
}