小题:
选择:
- HDFS的局限性
- 不适合低延迟的数据访问
- 无法高效存储大量小文件
- 不支持多用户写入及任意修改文件
- HDFS体系结构的局限性
- Hadoop1.0的局限与不足
-
抽象层次低 -
表达能力有限
- 复杂的分布式编程工作高度抽象为MapReduce两个函数,在降低开发复杂度的同时,也带来表达能力有限的问题,实际生成环境中的一些应用是无法用简单的Map和Reduce 来完成的
-
开发者需要自己管理作业之间的依赖关系
- 实际生产中需要多个作业协作才能顺利解决一些问题,这些作业之间往往存在复杂的依赖关系,但是MapReduce 本身没有对依赖关系进行有效管理
-
难以看到程序的整体逻辑
- 用户的实际处理逻辑都在两个函数中,没有更高层次的抽象
-
执行迭代操作效率低
- 每次处理都必须经过Map和Reduce 的数据读取和写入的过程,效率低下
-
资源浪费
- Reduce 任务必须等到所有的Map任务都完成才能继续
-
实时性差
- 只适合处理离线批处理程序,无法支持交互式的数据处理
判断:
-
名称节点不会定期检查副本数量(错)
- 名称节点会定期检查冗余副本的数量,如果副本数量小于冗余因子,就会启动数据冗余复制,生成新的副本,HDFS与其他文件系统最大的区别就在于可以调整冗余数据的位置
-
Map函数来自于HDFS的文件块格式是固定的
- 不固定,文件格式任意,可以是文件,也可以是二进制格式的
-
MapReduce 的键值对的键具有唯一性
填空:
- 名称节点的两个核心数据结构
- 如果EditLog 很大就会导致NameNode 启动进程满,使得名称节点长期处于安全模式,无法对外提供写操作
- 名称节点启动时会将FsImage 加载到内存中,然后执行EditLog文件中的各项操作,使得内存中的元数据保持最新
- 名称节点启动成功后进入正常运行模式,HDFS的更新操作会被写入到EditLog 中,而不是写入FsImage
- DataNode是分布式文件系统HDFS的工作节点,负责数据的存储和读取
- HDFS默认的冗余复制因子数是3,每一个文件会保存在3个地方,其中两个副本在同一个机架的不同机器上,第三个副本在放在不同的机架的机器上,取数据的时候就近取(就近机架进行数据读取)
- HDFS的数据复制采用流水线策略
- HDFS写数据的过程中会通过RPC远程调用名称节点,客户端通过调用输出流的write()方法向HDFS中对应的文件写入数据
- HDFS写数据的过程中,为了保证数据节点的数据时准确的,接收到数据的名称节点会向发送者发送ACK确认包
- HDFS写数据的过程是流水线复制策略,通过构建数据流管道进行数据传输
- HBase是google的BigTable的开源实现
- MapReduce模型中做的第一件事是(将大规模数据集进行分片,分成若干独立的小数据块)
- Reduce 函数的任务是将输入的一系列具有相同键的键值对以某种方式组合起来,输出处理后的键值对,输出的结果会合并成一个大文件
- shuffle 的各个执行阶段分区,排序,合并,归并
- Map的输出结果会先写入缓存中,缓存满时,就启动溢写操作
- Shuffle 过程的结果时最终生成一个大文件写到本地磁盘上
- Map端读取Map结果,然后执行归并操作,最后输送给Reduce 任务进行处理
- ZooKeeper 实现HA中的自动化切换
- HDFS在Hadoop1.0中的单点失效问题是通过HDFS HA进行解决的
- HDFS的单一命名空间,无法实现资源隔离的问题是通过HDFS 联邦进行解决的
- 资源管理效率低的问题是通过HDFS资源管理框架Yarn解决的
大题
简答 6*5
实验相关 10*1
综合程序(配置解释)10*1
一、简答题
1、Hadoop 生态及各部分的作用
第二章(可能性5)
也有可能考填空
2、HDFS的实现目标
第三章(可能性3)
- 兼容廉价的硬件设备
- 流数据的读写,以流数据的形式访问文件系统
- 大数据集
- 简单的文件模型,“一次写入多次读取”,文件一旦写入,关闭后就无法再次写入,只能被读取
- 强大的跨平台性
3、FsImage和EditLog的过程
第三章(可能性3)
FsImage 用于维护文件系统及文件树中所有文件和文件夹的元数据
操作日志EditLog 中记录了所有针对文件的创建、删除、重命名等操作
名称节点启动时会将FsImage 加载到内存中,然后执行EditLog文件中的各项操作,使得内存中的元数据保持最新
4、HDFS读数据的过程
第三章(可能性5)
客户端通过FileSystem.open()打开文件,DistributeFileSystem 会创建输入流FSDataInputStream(HDFS实现类 DFSInputStream)
- 输入流(通过ClientProtocal.getBlockLocations)远程调用名称节点,获得文件开始部分数据块的保存位置。对于该数据块,名称节点返回保存该数据块所有数据节点的地址,同时根据距离客户端的远近对数据节点进行排序,然后将FSDataInputStream 和 数据块的数据节点地址返回给客户端
- 客户端通过FSDataInputStream 调用read方法读取数据,输入流根据排序结果,选择最近的数据节点,建立连接并读取数据
- 数据块读取完毕后,FSDataInputStream关闭和数据节点的连接
- 输入流通过getBlockLocation() 方法查找下一个数据块(如果客户端缓存中已经包含该数据块的位置信息,就不再调用该方法)
- 找到数据块的最佳数据节点,读取数据
- 全部数据块读取完毕后调用FSDataInputStream 的close() 方法,关闭输入流
如果客户端和数据节点通信时出现错误,就会尝试连接含此数据块的下一个数据节点
5、HBase Region的定位方式
6、简述Map函数和Reduce函数的功能
第七章(可能性5)
- Map函数
- 输入<k1,v1>
- 输出List<k2,v2>
- 功能:
- 将小数据集进一步分解成一批<key,value>,输入Map函数中进行处理
- 每个输入的<k1,v1> 会输出一批<k2,v2>(中间结果)
- Reduce函数
- 输入<k2,list(v2)>
- 输出<k3,v3>
- 功能:
- 输入的中间结果<k2,list(v2)>中的List(v2)表示是一批属于同一个的k2的value
Map函数的输入是来自分布式文件系统的任意格式文件块,首先Map函数会将输入的元素转换为<key,value>格式的键值对,键和值的类型任意
Reduce函数将输入的一系列具有相同键的键值对以某种方式组合起来,输出处理后的键值对,输出的结果会合并成一个大文件
Map函数和Reduce函数都是程序员根据业务自行实现,所以功能只谈论输入输出和最终的结果,印证函数式编程的思想
7、简述Map端和Reduce端的shuffle过程
Map端
Map的输出结果首先写入缓存,缓存满时溢写操作写入磁盘文件,并清空缓存。启动溢写时,首先会将缓存中的数据进行分区,然后对每个数据进行排序和合并,之后再写入磁盘文件。当存在多个溢写文件时,就会被归并成一个大的磁盘文件。
其中一定发生的时候分区,排序,归并,若程序员实现了合并接口,则执行合并操作
Reduce端
Map机器领会属于自己处理的那部分数据,然后对数据进行归并,然后交给Reduce函数进行处理
二、实验题
hadoop 的安装考点:
一、创建Hadoop 用户
adduser hadoop
passwd hadoop
二、SSH免密登录
ssh-keygen -t rsa -P '~/.ssh'
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
ssh localhost
三、查看Hadoop 版本
./hadoop1.2.1/bin/hadoop version
四、运行测试
mkdir ./input
./bin/hadoop jar /........../hadoop-mapreduce-example-*.jar ./input ./output 'dfs[a-z.]+'
三、综合程序题
hadoop伪分布式安装考点:
core-site.xml hadoop通用配置文件
<configuration>
<property>
<name>hadoop.tmp.dir</name>
#运行产生的临时文件的存储地址
<value>file:/usr/local/hadoop/tmp</value>
</property>
<property>
<name>fs.defaultFS</name> #1
#制定hdfs 访问的协议,ip和端口号
<value>hdfs://localhost:9000</value> #2
</property>
</configuration>
hdfs-sit.xml hdf特有配置文件
<configuration>
<property>
#同一份数据的副本数
<name>dfs.replication</name> #3
<value>1</value> #4
</property>
<property>
<name>dfs.namenode.name.dir</name> #5
<value>file:/user/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name> #6
<value>file:/user/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>
初始化文件系统
./bin/hadoop namenode -format
启动集群
./sbin/start-all.sh
检查启动成功
jps
访问web页面
http://localhost:9870
HDFS常用命令:
hadoop fs -ls <path> 显示path 路径下的文件信息 #9
hadoop fs -cat <path> 将path 路径下的文件内容输出到标准输出 #10
hadoop fs -mkdir [-p] <path> 创建制定的path路径的下的文件夹,-p级联创建 #11
hadoop fs -put <localSrc> <dst> 从本地路径<locslSrc> 的文件复制到dst指定hadoop文件目录下 #12
|