内蒙古师范大学计算机与信息工程学院
2016—2017 学年第2学期
《大数据存储与处理》试题
答题纸
题号 |
一 |
二 |
三 |
四 |
总分 |
评卷人 |
分数 |
|
|
|
|
|
|
一.选择题(30分)
Hadoop最早起源于下面哪个?B
(a)Solr
(b)Nutch
(c)Luence
(d)Elasticsearch
下面哪一个是主从结构?()B
(a)一个NameNode,一个DataNode
(b)一个NameNode,多个DataNode
(c)多个NameNode,一个DataNode
(d)多个NameNode,多个DataNode
HDFS默认Block Size()B
(a)32MB
(b)64MB
(c)128MB
(d)256MB
HDFS中的block默认保存几分?()C
(a)1份
(b)2份
(c)3份
(d)以上都不是
下面哪一个程序负责HDFS数据存储?()C
(a)NameNode
(b)JobTracker
(c)DateNode
(d)secondaryNameNode
关于SecondaryNameNode哪项是正确的?()C
(a)它是NameNode的热备份
(b)它对内存没有要求
(c)它的目的是帮助NameNode合并编辑日志,减少NameNode启动时间
(d)SecondaryNameNode应与NameNode部署到一个节点
下面的TaskTracker端心跳机制哪个是正确的?A
(a)JobTracker和TaskTracker之间的心跳模式采用“拉”的方法
(b)JobTracker和TaskTracker之间的心跳模式采用“推”的方法
(c)JobTracker主动向TaskTracker发送心跳信息
(d)JobTrackrt领取TaskTracker返回心跳包的各种命令
解压.tar.gz结尾的HBase压缩包使用Linux命令是哪个?A
A.tar -xzvf
B.tar -zx
C.tar -s
D.tar -nf
下列哪项通常是集群的最主要净瓶()C
(a)CPU
(b)网络
(c)磁盘
(d)内存
首先集群的目的是为了节省成本,用廉价的 pc 机,取代小型机及大型机。小型机和大型机有什么特点?
二.多选题(10分)
大数据的特性是什么?A,B,C,D
(a)海量存储
(b)支持快速数据访问
(c)可靠性,失效性,可扩展性
(d)分布式处理
Hadoop最核心设计是哪些?()A,B
(a)MapReduce
(b)HDFS
(c)BigTable
(d)Zookeeper
Client端上传文件的时候下列哪项正确()B
(a)数据经过NameNode传递给DataNode
(b)Client端将文件切分为Block,依次上传
(c)Client只上传数据到一台DataNode,然后由NameNode负责block复制工作。
Client 向 NameNode 发起文件写入的请求。NameNode 根据文件大小和文件块配置情况,返回给 Client 它所管理部分 DataNode 的信息。Client 将文件划分为多个 Block,根据 DataNode 的地址信息,按顺序写入到每一个DataNode 块中。具体查看HDFS 体系结构简介及优缺点。
MapReduce编程接口有哪些?
(a)Mapper
(b)Partitioner
(c)Combiner
(d)Reducer
MapReduce有哪些作业调度模式?A,B,C
(a)先进先出作业调度
(b)公平调度
(c)容量调度
(d)多级反馈队列调度
RPC框架的组成部分有哪些?A,B,C,D
(a)序列化层
(b)函数调用层
(c)网络传输层
(d)服务端框架层
下列哪些是Hadoop运行的模式()A,B,C
(a)单机版
(b)伪分布式
(c)完全分布式
下列哪些选项正确地描述了HBase特性?A,B,C,D
(a)高可用性
(b)高性能
(c)面向列
(d)可伸缩性
HBase实现二级索引的实现方式有哪些?A,B
(a)MapReduce
(b)Coprocesser
(c)Bloom Filter
(d)Filter
构建企业Hadoop安全的平台需要考虑哪些问题?()A,B,C,D
(a)认证机制
(b)授权机制
(c)设备安全
(d)隐私性差异
三.判断题(10分)
VM可以称为PSeudo。()错误
分析:它是可以被修改的Hadoop的基础配置文件是hadoop-default.xml,默认建立一个Job的时候会建立Job的Config,Config首先读入hadoop-default.xml的配置,然后再读入hadoop-site.xml的配置(这个文件初始的时候配置为空),hadoop-site.xml中主要配置需要覆盖的hadoop-default.xml的系统级配置。
Job Tracker宕掉,集群不会工作。()错误
客户端决定输入的分片。()错误
Block Size是不可以修改的。()错误
Hadoop的基础配置文件是hadoop-default.xml,默认建立一个Job的时候会建立Job的Config,Config首先读入hadoop-default.xml的配置,然后再读入hadoop-site.xml的配置(这个文件初始的时候配置为空),hadoop-site.xml中主要配置需要覆盖的hadoop-default.xml的系统级配置。具体配置可以参考下
- <property>
- <name>dfs.block.size</name>//block的大小,单位字节,后面会提到用处,必须是512的倍数,因为采用crc作文件完整性校验,默认配置512是checksum的最小单元。
- <value>5120000</value>
- <description>The default block size for new files.</description>
- </property>
NameNode意外终止,SecondaryNameNode会接替它使集群继续工作。()
SecondaryNameNode是帮助恢复,而不是替代,如何恢复,可以查看
hadoop 根据SecondaryNameNode恢复Namenode
Hadoop dfsadmin -report命令用于检测HDFS损坏块。()错误
用这个命令可以快速定位出哪些节点down掉了,HDFS的容量以及使用了多少,以及每个节点的硬盘使用情况。
当然NameNode有个http页面也可以查询,但是这个命令的输出更适合我们的脚本监控dfs的使用状况
用这个命令可以快速定位出哪些节点down掉了,HDFS的容量以及使用了多少,以及每个节点的硬盘使用情况。
当然NameNode有个http页面也可以查询,但是这个命令的输出更适合我们的脚本监控dfs的使用状况
Hadoop是Java开发的,所以MapReduce只支持Java语言编写。()错误
分析:rhadoop是用R语言开发的,MapReduce是一个框架,可以理解是一种思想,可以使用其他语言开发。
NameNode负责管理metadata,Client每次读写请求,它都会从磁盘中读取或者会写入到metadata信息并反馈Client端。()错误
此题分析:
NameNode 不需要从磁盘读取 metadata,所有数据都在内存中,硬盘上的只是序列化的结果,只有每次 namenode 启动的时候才会读取。
1)文件写入
Client向NameNode发起文件写入的请求。
NameNode根据文件大小和文件块配置情况,返回给Client它所管理部分DataNode的信息。
Client将文件划分为多个Block,根据DataNode的地址信息,按顺序写入到每一个DataNode块中。
2)文件读取
Client向NameNode发起文件读取的请求。
Hadoop默认调度器策略为FIFO()正确
Hadoop-env.sh是用来提供Hadoop中JAVA-HOME的运行环境。()正确
四.编程题(20分)
1.MapReduce实现wordcount,并进行优化。(10分)
Class NewParititioner extends HashPartitioner<K,V>{
getPartition(K key,V value,int numReduceTasks)
{term=key.toString().split(“:”)[0];
super.getPartition(t,value,numReduceTasks);}}
Job.setPartitionClass(NewPartitioner)
public static class NewCombiner extends Reducer<Text,IntWritable,>{
public void reduce(Text key,Iterable<IntWritable>values,Context context)
{context.write(key,new IntWritable(1));}}
Job.setPartitionerClass(NewPartitioner)
2.HBase实现数据导入(10分)
Configuration config = HBaseConfiguration.create();
// 配置hbase.zookeeper.quorum: 后接zookeeper集群的机器列表
config.set("hbase.zookeeper.quorum", "master”);
// 配置hbase.zookeeper.property.clientPort: zookeeper集群的服务端口
config.set("hbase.zookeeper.property.clientPort", "2181");
HTable htable = null;
try {
/ 配置hbase的具体表名
htable = new HTable(config, "hbase_table");
// 设置rowkey的值
Put put = new Put(Bytes.toBytes("rowkey:1001"));
// 设置family:qualifier:value
put.add(Bytes.toBytes("family"), Bytes.toBytes("qualifier"), Bytes.toBytes("value"));
// 使用put类, 写入hbase对应的表中
htable.put(put);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (htable != null) {
try {
htable.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
五.简答题
1.简单描述如何安装配置一个apache开源版Hadoop,只描述即可,无需列出完整步骤,能列出步骤更好。(5分)
1) 安装JDK并配置环境变量(/etc/profile)
2) 关闭防火墙
3) 配置hosts文件,方便hadoop通过主机名访问(/etc/hosts)
4) 设置ssh免密码登录
5) 解压缩hadoop安装包,并配置环境变量
6) 修改配置文件($HADOOP_HOME/conf)
hadoop-env.sh core-site.xml hdfs-site.xml mapred-site.xml
7) 格式化hdfs文件系统 (hadoop namenode -format)
8) 启动hadoop ($HADOOP_HOME/bin/start-all.sh)
9) 使用jps查看进程
2.请列出正常的Hadoop集群中需要启动哪些进程,他们的作用分别是什么?(5分)
1) NameNode: HDFS的守护进程,负责记录文件是如何分割成数据块,以及这些数据块分别被存储到那些数据节点上,它的主要功能是对内存及IO进行集中管理
2) Secondary NameNode:辅助后台程序,与NameNode进行通信,以便定期保存HDFS元数据的快照。
3) DataNode:负责把HDFS数据块读写到本地的文件系统。
4) JobTracker:负责分配task,并监控所有运行的task。
5) TaskTracker:负责执行具体的task,并与JobTracker进行交互。
3.HBase的rowkey怎么创建比较好,列族怎么创建比较好?(5分)
rowkey,我们知道rowkey是行的主键,而且hbase只能用个rowkey,或者一个rowkey范围即scan来查找数据。所以 rowkey的设计是至关重要的,关系到你应用层的查询效率。我们知道,rowkey是以字典顺序排序的。而存储的字节码,字典排序,我们知道,如果是字 母,那就是字母的顺序,比如,有两个rowkey,rowkey1:aaa222,rowkey2:bbb111,那么rowkey1是排在 rowkey2前面的,因为按字典,a排在b前面,如果rowkey2的第一位也是a,那么就根据第二位来比较,如果还相同,则比较第三为,后面同样。这 个理解了,我们在根据rowkey范围查询的时候,我们一般是知道startRowkey,如果我们通过scan只传startRowKey : d开头的,那么查询的是所有比d大的都查了,而我们只需要d开头的数据,那就要通过endRowKey来限制。我们可以通过设定endRowKey为:d 开头,后面的根据你的rowkey组合来设定,一般是加比startKey大一位。比如说rowkey设计为:用户ID-日期,那么查某个用户某天的数 据,startKEY为3231-20121212,endKey为:3231+201213,那么你查到的就是用户为3231在20121212这一天 的数据。
4.HBase数据合并(5分)
多索引(多表)的join场景中,主要有两种参考方案:
1,按索引的种类扫描各自独立的单索引表,最后将扫描结果merge。
这个方案的特点是简单,但是如果多个索引扫描结果数据量比较大的话,merge就会遇到瓶颈。
比如,现在有一张1亿的用户信息表,建有出生地和年龄两个索引,我想得到一个条件是在杭州出生,年龄为20岁的按用户id正序排列前10个的用户列表。
有一种方案是,系统先扫描出生地为杭州的索引,得到一个用户id结果集,这个集合的规模假设是10万。
然后扫描年龄,规模是5万,最后merge这些用户id,去重,排序得到结果。
这明显有问题,如何改良?
保证出生地和年龄的结果是排过序的,可以减少merge的数据量?但Hbase是按row key排序,value是不能排序的。
变通一下 – 将用户id冗余到row key里?OK,这是一种解决方案了,这个方案的图示如下:
merge时提取交集就是所需要的列表,顺序是靠索引增加了_id,以字典序保证的。
5.如果需要你设计一个分布式系统,你如何设计?(10分)