文章目录
小题:
选择:
- HDFS的局限性 - 不适合低延迟的数据访问 - HBase 更加适合- 无法高效存储大量小文件- 不支持多用户写入及任意修改文件
- HDFS体系结构的局限性 - 命名空间的限制- 性能的瓶颈- 隔离问题- 集群的可用性
- Hadoop1.0的局限与不足 - 抽象层次低- 表达能力有限 - 复杂的分布式编程工作高度抽象为MapReduce两个函数,在降低开发复杂度的同时,也带来表达能力有限的问题,实际生成环境中的一些应用是无法用简单的Map和Reduce 来完成的- 开发者需要自己管理作业之间的依赖关系 - 实际生产中需要多个作业协作才能顺利解决一些问题,这些作业之间往往存在复杂的依赖关系,但是MapReduce 本身没有对依赖关系进行有效管理- 难以看到程序的整体逻辑 - 用户的实际处理逻辑都在两个函数中,没有更高层次的抽象- 执行迭代操作效率低 - 每次处理都必须经过Map和Reduce 的数据读取和写入的过程,效率低下- 资源浪费 - Reduce 任务必须等到所有的Map任务都完成才能继续- 实时性差 - 只适合处理离线批处理程序,无法支持交互式的数据处理
- HDFS联邦相对于HDFS1.0的优势 - HDFS集群可扩展性- 每个名称节点分管一部分目录,使得一个集群可以扩展到更多的节点,不用像HDFS1.0那样由于内存的限制制约文件存储数目- 性能更高效- 多个名称节点管理不同数据,并同时对外提供服务- 良好的隔离性- 不同业务数据交由不同名称节点管理
- JobTracker 的三大功能(资源管理,任务调度,任务监控)
- Spark 的各个组件 - Spark Core- Spark Sql- Spark Streaming- MLIB- Graphx
- Spark 的优点 - Spark的计算模式不局限于Map和Reduce 操作- Spark提供了内存计算- 基于DAG的任务调度执行机制
- 流计算的特征 - 数据持续到达- 数据来源众多,格式复杂- 数据量大
判断:
- 名称节点不会定期检查副本数量(错)- 名称节点会定期检查冗余副本的数量,如果副本数量小于冗余因子,就会启动数据冗余复制,生成新的副本,HDFS与其他文件系统最大的区别就在于可以调整冗余数据的位置
- Map函数来自于HDFS的文件块格式是固定的- 不固定,文件格式任意,可以是文件,也可以是二进制格式的
- MapReduce 的键值对的键具有唯一性- 键不具备唯一性,不能作为输出的身份标识
- 云数据库是一种新的技术(错)- 只是以服务的方式提供数据库的功能
- SparkStream 无法实现毫秒级的流计算,而Storm 可以实现毫秒级响应
填空:
- 名称节点的两个核心数据结构- FsImage- EditLog
- 如果EditLog 很大就会导致NameNode 启动进程满,使得名称节点长期处于安全模式,无法对外提供写操作
- 名称节点启动时会将FsImage 加载到内存中,然后执行EditLog文件中的各项操作,使得内存中的元数据保持最新
- 名称节点启动成功后进入正常运行模式,HDFS的更新操作会被写入到EditLog 中,而不是写入FsImage
- DataNode是分布式文件系统HDFS的工作节点,负责数据的存储和读取
- HDFS默认的冗余复制因子数是3,每一个文件会保存在3个地方,其中两个副本在同一个机架的不同机器上,第三个副本在放在不同的机架的机器上,取数据的时候就近取(就近机架进行数据读取)
- HDFS的数据复制采用流水线策略
- HDFS写数据的过程中会通过RPC远程调用名称节点,客户端通过调用输出流的write()方法向HDFS中对应的文件写入数据
- HDFS写数据的过程中,为了保证数据节点的数据时准确的,接收到数据的名称节点会向发送者发送ACK确认包
- HDFS写数据的过程是流水线复制策略,通过构建数据流管道进行数据传输
- HBase是google的BigTable的开源实现,用来存储结构化和半结构化的松散数据
- HBase 采用更简单的数据模型,将数据存储为未经解释的字符串
- HBase 通常只采用单表的主键查询
- HBase 是基于列存储的
- HBase 只有一个索引——行键
- HBase 执行更新操作时,不会删除数据旧的版本而是生成一个新的版本,旧的版本仍然保留
- HBase 的版本采用时间戳进行索引,每次对一个单元格进行更新操作,就会默认生成并存储一个时间戳,时间戳最大的为最新的数据
- HBase 根据行键,列族,列限定符,和时间戳来确定一个单元格
- NoSql的四大类型及相关产品- 键值数据库- redis- 列族数据库- BigTable- HBase- 文档数据库- MongoDB- 图数据库- 存储不同顶点间的关系- Neo4J
- NoSql三大基石- CAP- BASE- 最终一致性
- Base 的基本含义- 基本可以- 软状态- 最终一致性
- 云数据库是部署和虚拟化在云计算环境中的数据库
- MapReduce模型中做的第一件事是(将大规模数据集进行分片,分成若干独立的小数据块)
- Reduce 函数的任务是将输入的一系列具有相同键的键值对以某种方式组合起来,输出处理后的键值对,输出的结果会合并成一个大文件
- shuffle 的各个执行阶段分区,排序,合并,归并
- Map的输出结果会先写入缓存中,缓存满时,就启动溢写操作
- Shuffle 过程的结果时最终生成一个大文件写到本地磁盘上
- Map端读取Map结果,然后执行归并操作,最后输送给Reduce 任务进行处理
- ZooKeeper 实现HA中的自动化切换
- HDFS在Hadoop1.0中的单点失效问题是通过HDFS HA进行解决的
- HDFS的单一命名空间,无法实现资源隔离的问题是通过HDFS 联邦进行解决的
- 资源管理效率低的问题是通过HDFS资源管理框架Yarn解决的
- 通过设计HDFS HA,提供名称节点热备份机制,解决Hadoop1.0单一名称节点存在的单点失效问题
- 通过设计HDFS 联邦,管理多个命名空间,解决Hadoop1.0无法实现资源隔离的问题
- zookeeper 实现了HA中名称节点的自动化切换
- JobTracker 的三大功能(资源管理,任务调度,任务监控)
- Yarn的组件包括:ResourceManager(负责资源管理),ApplicationMaster(负责任务调度和监控),NodeManager(负责执行原TaskTraker 的任务)
- ResouceManager的两个组件调度器Scheduler,应用程序管理器Application Manager
- Yarn下ResouceManager通过容器的形式分配给应用程序资源
- MapReduce1.0分配资源的单位是槽
- 用户客户端编写的应用程序,向Yarn提交应用程序,提交内容包括ApplicaitonMaster应用程序和启动ApplicationMaster的命令,用户程序
- ApplicationMaster 创建后首先会向ResouceManager 注册
- ApplicationMaster 采用轮询的方式通过RPC协议向ResouceManager 申请资源
- 每个任务通过RPC协议向ApplicaitonMaster 汇报自己的状态和进度
- Pig 使用类Sql,可以将用户编写的脚本转换成MapReduce 作业
- Tez 支持DGA作业的计算框架
- Kafka高吞吐量的分布式发布订阅消息系统
- Storm的设计思路中,流数据是一个无限的Tuple序列,Storm认为每个Stream都有一个源头,可以把这个源头抽象为Spouts
- Storm 把Stream的状态转换过程抽象为Bolts
大题
简答 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过程
第七章(可能性4)
Map端
Map的输出结果首先写入缓存,缓存满时溢写操作写入磁盘文件,并清空缓存。启动溢写时,首先会将缓存中的数据进行分区,然后对每个数据进行排序和合并,之后再写入磁盘文件。当存在多个溢写文件时,就会被归并成一个大的磁盘文件。
其中一定发生的时候分区,排序,归并,若程序员实现了合并接口,则执行合并操作
Reduce端
从Map机器领回属于自己处理的那部分数据,然后对数据进行归并,然后交给Reduce函数进行处理
8、Hadoop1.0的局限和不足
第八章(可能性4)
- 抽象层次低
- 表达能力差
- 开发者自己管理作业之间的依赖关系
- 难以看到程序整体逻辑
- 执行迭代操作效率低
- 资源浪费
- 实时性差
9、MapReduce1.0的缺陷——> 导致Yarn的出现
第八章(可能性4)
- 存在单点故障
- JobTracker 任务过重
- 容易出现内存溢出
- 资源划分不合理
10、ApplicationMaster的主要功能:
第八章(可能性2)
- 用户作业提交时,AppplicationMaster 与 ResouceManager协商获取资源,ResourceManager以容器的形式分配资源
- 把获得的资源进一步分配给内部的各个任务
- 与NodeManager 保持交互通信进行应用程序的启动,运行,监控和停止(监控资源的使用情况,对所有任务的执行进度和状态进行监控,并在任务失败时执行失败恢复)
- 定时向ResouceManager 发送心跳信息,并报告资源使用情况和应用的进度信息
- 作业完成时,ApplicationMaster 向ResouceManager 注销容器,执行周期完成
11、Yarn的优势
第八章(可能性3)
- 大大减少了承担中心服务功能的ResouceManager 的资源消耗 - 任务调度和监控重启操作交给ApplicaitonMaster 来完成
- 解耦,Yarn 是一个纯粹的资源管理调度框架,可以支持不同的编程模型
- YARN中的资源管理比MapReduce1.0更高效
二、实验题
hadoop 的安装考点:
一、创建Hadoop 用户
adduser hadoop #1passwd hadoop #2
二、SSH免密登录
ssh-keygen -t rsa -P '~/.ssh'#生成id_dsa.pub #3cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys ssh localhost #验证 #4
三、查看Hadoop 版本
./hadoop1.2.1/bin/hadoop version #5
四、运行测试
mkdir ./input #创建input 目录#grep 是类的入口 ./bin/hadoop jar /........../hadoop-mapreduce-example-*.jar ./input ./output 'dfs[a-z.]+'#./bin/hadoop 6 jar 7 ./input 8 ./output 9 写对路径10
三、综合程序题
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 #8
检查启动成功
jps #8
访问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
版权归原作者 Jeffrey_oWang 所有, 如有侵权,请联系我们删除。