5 问答题(二) 5.1 写出以下执行命令 1) 如何杀死一个job 先Hadoop job -list 得到jobid 杀死job: hadoop job -kill jobid 2) 删除hdfs 上的/tmp/xxx 目录hadoop fs -rm -r /tmp/xxx 3) 加入一个新的存储节点和删除一个计算节点,需要刷新集群状态命令 加入新节点时: Hadoop-daemon.sh start datanode Hadoop-daemon.sh start tasktracker 删除节点时 Hadoop maradmin -refreshnodes Hadoop dfsadmin -refreshnodes 5.2 简述一下hdfs 的数据压缩算法,工作中用的是那种算法,为什么? 1、在HDFS 之上将数据压缩好后,再存储到HDFS 2、在HDFS 内部支持数据压缩,这里又可以分为几种方法: 2.1、压缩工作在DataNode 上完成,这里又分两种方法: 2.1.1、数据接收完后,再压缩 这个方法对HDFS 的改动最小,但效果最低,只需要在block 文件close 后,调用压 缩工具,将block 文件压缩一下,然后再打开block 文件时解压一下即可,几行代码就可 以搞定 2.1.2、边接收数据边压缩,使用第三方提供的压缩库 效率和复杂度折中方法,Hook 住系统的write 和read 操作,在数据写入磁盘之前, 先压缩一下,但write 和read 对外的接口行为不变,比如:原始大小为100KB 的数据,压 缩后大小为10KB,当写入100KB 后,仍对调用者返回100KB,而不是10KB 2.2、压缩工作交给DFSClient 做,DataNode 只接收和存储 这个方法效果最高,压缩分散地推给了HDFS 客户端,但DataNode 需要知道什么时 候一个block 块接收完成了。 推荐最终实现采用2.2 这个方法,该方法需要修改的HDFS 代码量也不大,但效果最高。 1、Datanode 在什么情况下不会备份? 单节点的情况下不会备份! 2、datanode 首次加入cluster的时候,如果log 报告不兼容文件版本,那 需要namenode 3、执行格式化操作,这样处理的原因是?这个说法是错误的! 添加了一个新的标识符ClusterID 用于标识集群中所有的节点。当格式化一个Namenode, 需要提供这个标识符或者自动生成。这个ID 可以被用来格式化加入集群的其他Namenode 应该检查hadoop 的版本是不是与其他的hadoop 版本一致! 5.3 三个datanode,当有一个datanode 出现错误会怎样? Datanode 以数据块作为容错单位通常一个数据块会备份到三个datanode 上,如果一个 datanode 出错,则回去其他备份数据块的datanode 上读取,并且会把这个datanode 上的数据块再复制一份以达到备份的效果! 5.4 hdfs 原理,以及各个模块的职责? Client:切分文件;访问或通过命令行管理HDFS;与NameNode 交互,获取文件位置信 息;与DataNode 交互,读取和写入数据。 NameNode:Master 节点,只有一个,管理HDFS 的名称空间和数据块映射信息;配置 副本策略;处理客户端请求。 DataNode:Slave 节点,存储实际的数据;执行数据块的读写;汇报存储信息给NameNode。 Secondary NameNode:辅助NameNode,分担其工作量;定期合并fsimage和fsedits, 推送给NameNode;紧急情况下,可辅助恢复NameNode,但Secondary NameNode 并非NameNode 的热备 Hdfs 文件读取 1.首先调用FileSystem 对象的open 方法,其实是一个DistributedFileSystem 的实 例 2.DistributedFileSystem 通过rpc 获得文件的第一批个block 的locations,同一 block 按照重复数会返回多个locations,这些locations 按照hadoop 拓扑结构排序,距 离客户端近的排在前面. 3.前两步会返回一个FSDataInputStream 对象,该对象会被封装成DFSInputStream 对象,DFSInputStream可以方便的管理datanode和namenode数据流。客户端调用read 方法,DFSInputStream 最会找出离客户端最近的datanode 并连接。 4.数据从datanode 源源不断的流向客户端。 5.如果第一块的数据读完了,就会关闭指向第一块的datanode 连接,接着读取下一块。 这些操作对客户端来说是透明的,客户端的角度看来只是读一个持续不断的流。 6.如果第一批block 都读完了,DFSInputStream 就会去namenode 拿下一批blocks 的location,然后继续读,如果所有的块都读完,这时就会关闭掉所有的流 Hdfs 的文件写入 1.客户端通过调用DistributedFileSystem 的create 方法创建新文件 2.DistributedFileSystem 通过RPC 调用namenode 去创建一个没有blocks 关联的新文 件,创建前,namenode 会做各种校验,比如文件是否存在,客户端有无权限去创建等。 如果校验通过,namenode 就会记录下新文件,否则就会抛出IO 异常. 3.前两步结束后会返回FSDataOutputStream 的对象,和读文件的时候相似, FSDataOutputStream 被封装成DFSOutputStream,DFSOutputStream 可以协调 namenode 和datanode。客户端开始写数据到DFSOutputStream,DFSOutputStream 会把数据切成一个个小packet,然后排成队列data quene。 4.DataStreamer 会去处理接受data quene,他先问询namenode 这个新的block 最适合 存储的在哪几个datanode 里,比如重复数是3,那么就找到3 个最适合的datanode,把 他们排成一个pipeline.DataStreamer 把packet 按队列输出到管道的第一个datanode 中, 第一个datanode 又把packet 输出到第二个datanode 中,以此类推。 5.DFSOutputStream 还有一个对列叫ack quene,也是有packet 组成,等待datanode 的收到响应,当pipeline 中的所有datanode 都表示已经收到的时候,这时akc quene 才 会把对应的packet 包移除掉。 6.客户端完成写数据后调用close 方法关闭写入流 7.DataStreamer 把剩余得包都刷到pipeline 里然后等待ack 信息,收到最后一个ack后, 通知datanode 把文件标示为已完成。 5.5 哪个进程通常与namenode 在一个节点启动?并做分析 JobTracker hadoop 的集群是基于master/slave 模式,namenode 和jobtracker 属于master, datanode 和tasktracker 属于slave,master 只有一个,而slave 有多个 SecondaryNameNode 内存需求和NameNode 在一个数量级上,所以通常secondary NameNode(运行在单独的物理机器上)和NameNode 运行在不同的机器上。 JobTracker 和TaskTracker JobTracker 对应于NameNode TaskTracker 对应于DataNode DataNode 和NameNode 是针对数据存放来而言的 JobTracker 和TaskTracker 是对于MapReduce 执行而言的 mapreduce 中几个主要概念,mapreduce 整体上可以分为这么几条执行线索: jobclient,JobTracker 与TaskTracker。 1、JobClient会在用户端通过JobClient类将应用已经配置参数打包成jar文件存储到hdfs, 并把路径提交到Jobtracker,然后由JobTracker 创建每一个Task(即MapTask 和 ReduceTask) 并将它们分发到各个TaskTracker 服务中去执行 2、JobTracker 是一个master 服务,软件启动之后JobTracker 接收Job,负责调度Job 的每一个子任务task 运行于TaskTracker 上, 并监控它们,如果发现有失败的task就重新运行它。一般情况应该把JobTracker 部署在单 独的机器上。 3、TaskTracker 是运行在多个节点上的slaver 服务。TaskTracker 主动与JobTracker 通信, 接收作业,并负责直接执行每一个任务。 TaskTracker 都需要运行在HDFS 的DataNode 上。 5.6 hdfs 的体系结构? HDFS 采用了主从(Master/Slave)结构模型,一个HDFS 集群是由一个NameNode 和若干个DataNode 组成的。其中NameNode 作为主服务器,管理文件系统的命名空间 和客户端对文件的访问操作;集群中的DataNode 管理存储的数据。HDFS 允许用户以文 件的形式存储数据。从内部来看,文件被分成若干个数据块,而且这若干个数据块存放在一 组DataNode 上。NameNode 执行文件系统的命名空间操作,比如打开、关闭、重命名 文件或目录等,它也负责数据块到具体DataNode的映射。DataNode负责处理文件系统 客户端的文件读写请求,并在NameNode 的统一调度下进行数据块的创建、删除和复制工 作。NameNode 和DataNode 都被设计成可以在普通商用计算机上运行。这些计算机通 常运行的是GNU/Linux 操作系统。HDFS 采用Java语言开发,因此任何支持Java 的机器 FileStatus filestatus = fs.getFileStatus(path); //获取文件块位置列表 BlockLocation[] blkLocations = fs.getFileBlockLocations(filestatus, 0, filestatus.getLen()); //循环输出块信息 for(int i=0;i<> String[] hosts = blkLocations[i].getHosts(); System.out.println(''block_''+i+''_location:''+hosts[0]); } 5.8 HDFS 存储的机制? HDFS 的三个实体 数据块 每个磁盘都有默认的数据块大小,这是磁盘进行读写的基本单位.构建于单个磁盘之上的文件 系统通过磁盘块来管理该文件系统中的块.该文件系统中的块一般为磁盘块的整数倍.磁盘块 一般为512 字节.HDFS 也有块的概念,默认为64MB(一个map 处理的数据大小).HDFS 上 的文件也被划分为块大小的多个分块,与其他文件系统不同的是,HDFS 中小于一个块大小的 文件不会占据整个块的空间. HDFS 用块存储带来的第一个明显的好处一个文件的大小可以大于网络中任意一个磁盘的 容量,数据块可以利用磁盘中任意一个磁盘进行存储.第二个简化了系统的设计,将控制单元 设置为块,可简化存储管理,计算单个磁盘能存储多少块就相对容易.同时也消除了对元数据 都可以部署NameNode 和DataNode。一个典型的部署场景是集群中的一台机器运行一 个NameNode 实例,其他机器分别运行一个DataNode 实例。当然,并不排除一台机器 运行多个DataNode 实例的情况。集群中单一的NameNode 的设计则大大简化了系统的 架构。NameNode 是所有HDFS 元数据的管理者,用户数据永远不会经过NameNode。 5.7 HDFS,replica 如何定位 //查找某个文件在HDFS 集群的位置 public static void getFileLocal() throws IOException{ //返回FileSystem 对象 FileSystem fs = getFileSystem(); //文件路径 Path path = new Path(''hdfs://single.hadoop.dajiangtai.com:9000/middle/weibo/weibo.txt''); //获取文件目录 的顾虑,如权限信息,可以由其他系统单独管理. DataNode 节点 DataNode 是HDFS 文件系统的工作节点,它们根据需要存储并检索数据块,受NameNode 节点调度.并且定期向NameNode 发送它们所存储的块的列表 NameNode 节点 NameNode 管理HDFS 文件系统的命名空间,它维护着文件系统树及整棵树的所有的文件 及目录.这些文件以两个文件形式永久保存在本地磁盘上(命名空间镜像文件和编辑日志文 件).NameNode 记录着每个文件中各个块所在的数据节点信息但并不永久保存这些块的位 置信息,因为这些信息在系统启动时由数据节点重建. 没有NameNode,文件系统将无法使用.如提供NameNode 服务的机器损坏,文件系统上的 所有文件丢失,我们就不能根据DataNode 的块来重建文件.因此,对NameNode 的容错非 常重要.第一种机制,备份那些组成文件系统元数据持久状态的文件.通过配置使NameNode 在多个文件系统上保存元数据的持久状态或将数据写入本地磁盘的同时,写入一个远程挂载 的网络文件系统.当然这些操作都是原子操作.第二种机制是运行一个辅助的NameNode,它 会保存合并后的命名空间镜像的副本,并在Name/Node 发生故障时启用.但是辅助 NameNode 保存.态总是滞后于主力节点,所以在主节点全部失效后难免丢失数据.在这种情 况下,一般把存储在远程挂载的网络文件系统的数据复制到辅助NameNode 并作为新的主 NameNode 运行 5.9 hdfs 的client 端,复制到第三个副本时宕机, hdfs 怎么恢复保证下次写第三副 本? Datanode 会定时上报block 块的信息给namenode ,namenode 就会得知副本缺失, 然后namenode 就会启动副本复制流程以保证数据块的备份! 5.10 block 块信息是先写dataNode 还是先写nameNode? Client 向NameNode 发起文件写入的请求。 NameNode根据文件大小和文件块配置情况,返回给Client 它所管理部分DataNode 的信息。 Client 将文件划分为多个Block,根据DataNode 的地址信息,按顺序写入到每一个 DataNode 块中。 5.11 Hive 的join 有几种方式,怎么实现join 的? 答:3 种join 方式: 1)在reduce 端进行join,最常用的join 方式。 Map 端的主要工作:为来自不同表(文件)的key/value 对打标签以区别不同来源的记录。然后 用连接字段作为key,其余部分和新加的标志作为value,最后进行输出。 reduce 端的主要工作:在reduce 端以连接字段作为key 的分组已经完成,我们只需要在每一 个分组当中将那些来源于不同文件的记录(在map 阶段已经打标志)分开,最后进行笛卡尔。 2)在map 端进行join,使用场景:一张表十分小、一张表很大: 在提交作业的时候先将小表文件放到该作业的DistributedCache 中,然后从DistributeCache 中 取出该小表进行join key / value 解释分割放到内存中(可以放大Hash Map 等等容器中)。然后扫描大 表,看大表中的每条记录的join key /value 值是否能够在内存中找到相同join key 的记录,如果有则 直接输出结果 3)SemiJoin,semijoin 就是左边连接是reducejoin 的一种变种,在map 端过滤掉一些数 据,在网络传输过程中,只传输参与连接的数据,减少了shuffle的网络传输量,其他和reduce 的思想是一样的。 实现:将小表中参与join 的key 单独抽取出来通过DistributeCache 分发到相关节点, 在map 阶段扫描连接表,将join key 不在内存hashset 的纪录过滤掉,让参与join 的纪录 通过shuffle 传输到reduce 端进行join,其他和reduce join 一样。 5.12 hive 内部表和外部表的区别? 内部表:建表时会在hdfs 创建一个表的存储目录,增加分区的时候,会将数据复制到此 location 下,删除数据的时候,将表的数据和元数据一起删除。 外部表:一般会建立分区,增加分区的时候不会将数据移到此表的location下,删除数据的 时候,只删除了表的元数据信息,表的数据不会删除。 5.13 hive 是如何实现分区的? 建表语句: create table tablename (id) partitioned by (dt string) 增加分区: alter table tablenname add partition (dt = ‘2016-03-06’) 删除分区: alter table tablename drop partition (dt = ‘2016-03-06’) 5.14 hive 支持not in 吗? 不支持,可以用left join 实现此功能 5.15 Hive 有哪些方式保存元数据,各有哪些优缺点。 1)存储于derby 数据库,此方法只能开启一个hive 客户端,不推荐使用 2)存储于mysql 数据库中,可以多客户端连接,推荐使用。 5.16 hive 如何优化 1)join 优化,尽量将小表放在join 的左边,如果一个表很小可以采用mapjoin 2)排序优化,order by 一个reduce 效率低,distirbute by +sort by 也可以实现全局排序 3)使用分区,查询时可减少数据的检索,从而节省时间。 5.17 hive 能像关系数据库那样,建多个库吗? 可以建立多个库,多库多表都支持。 5.18 hive 中的压缩格式RCFile、TextFile、SequenceFile 各有什么区别? TextFile:默认格式,数据不做压缩,磁盘开销大,数据解析开销大 SequenceFile:Hadoop API提供的一种二进制文件支持,使用方便,可分割,可压缩,支 持三种压缩,NONE,RECORD,BLOCK RCFILE 是一种行列存储相结合的方式。首先,将数据按行分块,保证同一个record 在同 一个块上,避免读一个记录读取多个block。其次,块数据列式存储,有利于数据压缩和快 速的列存取。数据加载的时候性能消耗大,但具有较好的压缩比和查询响应。 5.19 hive 相对于Oracle 来说有那些优点? 1)存储,hive 存储在hdfs 上,oracle 存储在本地文件系统 2)扩展性,hive 可以扩展到数千节点,oracle 理论上只可扩展到100 台左右 3)单表存储,数据量大hive 可以分区分桶,oracle 数据量大只能分表。 5.20 Hive 的sort by 和order by 的区别 order by 会对输入数据做全局排序,只有一个reduce,数据量较大时,很慢。 sort by 不是全局排序,只能保证每个reduce 有序,不能保证全局有序,需设置 mapred.reduce.tasks>1 |
|