100道hadoop常见面试题及答案解析

100道hadoop常见面试题及答案解析

2023年7月26日发(作者:)

100道hadoop常见⾯试题及答案解析1 单选题1.1 下⾯哪个程序负责 HDFS 数据存储。a)NameNodeb)Jobtrackerc)Datanoded)secondaryNameNodee)tasktracker答案 C datanode1.2 HDfS 中的 block 默认保存⼏份?a)3 份b)2 份c)1 份d)不确定答案 A 默认 3 分1.3 下列哪个程序通常与 NameNode 在⼀个节点启动?a)SecondaryNameNodeb)DataNodec)TaskTrackerd)Jobtracker答案 D,此题分析:hadoop 的集群是基于 master/slave 模式,namenode 和 jobtracker 属于 master,datanode 和 tasktracker 属 于 slave , master 只 有 ⼀ 个 , ⽽ slave 有多个SecondaryNameNode 内存需求和 NameNode 在⼀个数量级上,所以通常 secondaryNameNode(运⾏在单独的物理机器上)和 NameNode 运⾏在不同的机器上。JobTracker 和 TaskTrackerJobTracker 对应于 NameNodeTaskTracker 对应于 DataNodeDataNode 和 NameNode 是针对数据存放来⽽⾔的JobTracker 和 TaskTracker 是对于 MapReduce 执⾏⽽⾔的mapreduce 中⼏个主要概念,mapreduce 整体上可以分为这么⼏条执⾏线索:obclient,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上。1.4 Hadoop 作者a)Martin Fowlerb)Kent Beckc)Doug cutting答案 C Doug cutting1.5 HDFS 默认 Block Sizea)32MBb)64MBc)128MB答案:B(因为版本更换较快,这⾥答案只供参考)1.6 下列哪项通常是集群的最主要瓶颈:a)CPUa)CPUb)⽹络c)磁盘 IOd)内存答案:C 磁盘该题解析:⾸先集群的⽬的是为了节省成本,⽤廉价的 pc 机,取代⼩型机及⼤型机。⼩型机和⼤型机有什么特点? 处理能⼒强2.内存够⼤所以集群的瓶颈不可能是 a 和 d3.⽹络是⼀种稀缺资源,但是并不是瓶颈。4.由于⼤数据⾯临海量数据,读写数据都需要 io,然后还要冗余数据,hadoop ⼀般备 3份数据,所以 IO 就会打折扣。1.7 关于 SecondaryNameNode 哪项是正确的?a)它是 NameNode 的热备b)它对内存没有要求c)它的⽬的是帮助 NameNode 合并编辑⽇志,减少 NameNode 启动时间d)SecondaryNameNode 应与 NameNode 部署到⼀个节点。答案 C2 多选题2.1 下列哪项可以作为集群的管理?a)Puppetb)Pdshc)Cloudera Managerd)Zookeeper答案:ABD2.2 配置机架感知的下⾯哪项正确:a)如果⼀个机架出问题,不会影响数据读写b)写⼊数据的时候会写到不同机架的 DataNode 中c)MapReduce 会根据机架获取离⾃⼰⽐较近的⽹络数据答案 ABC2.3 Client 端上传⽂件的时候下列哪项正确?a)数据经过 NameNode 传递给 DataNodeb)Client 端将⽂件切分为 Block,依次上传c)Client 只上传数据到⼀台 DataNode,然后由 NameNode 负责 Block 复制⼯作答案 B,该题分析:Client 向 NameNode 发起⽂件写⼊的请求。NameNode 根据⽂件⼤⼩和⽂件块配置情况,返回给 Client 它所管理部分 DataNode 的信息。Client 将⽂件划分为多个 Block,根据 DataNode 的地址信息,按顺序写⼊到每⼀个DataNode 块中。2.4 下列哪个是 Hadoop 运⾏的模式:a)单机版b)伪分布式c)分布式答案 ABC2.5 Cloudera 提供哪⼏种安装 CDH 的⽅法?a)Cloudera managerb)Tarballc)Yumd)Rpm答案:ABCD3 判断题3.1 Ganglia 不仅可以进⾏监控,也可以进⾏告警。( 正确)分析:此题的⽬的是考 Ganglia 的了解。严格意义上来讲是正确。ganglia 作为⼀款最常⽤分析:此题的⽬的是考 Ganglia 的了解。严格意义上来讲是正确。ganglia 作为⼀款最常⽤的 Linux 环境中的监控软件,它擅长的的是从节点中按照⽤户的需求以较低的代价采集数据。但是 ganglia 在预警以及发⽣事件后通知⽤户上并不擅长。最新的 ganglia 已经有了部分这⽅⾯的功能。但是更擅长做警告的还有 Nagios。Nagios,就是⼀款精于预警、通知的软件。通过将 Ganglia 和 Nagios 组合起来,把 Ganglia 采集的数据作为 Nagios 的数据源,然后利⽤ Nagios 来发送预警通知,可以完美的实现⼀整套监控管理的系统。3.2 Block Size 是不可以修改的。(错误 )分析:它是可以被修改的 Hadoop 的基础配置⽂件是 ,默认建⽴⼀个 Job 的时候会建⽴ Job 的 Config,Config ⾸先读⼊ 的配置,然后再读⼊ 的配置(这个⽂件初始的时候配置为空), 中主要配置需要覆盖的 的系统级配置。3.3 Nagios 不可以监控 Hadoop 集群,因为它不提供 Hadoop ⽀持。(错误 )分析:Nagios 是集群监控⼯具,⽽且是云计算三⼤利器之⼀3.4 如果 NameNode 意外终⽌,SecondaryNameNode 会接替它使集群继续⼯作。(错误 )分析:SecondaryNameNode 是帮助恢复,⽽不是替代,如何恢复,可以查看3.5 Cloudera CDH 是需要付费使⽤的。(错误 )分析:第⼀套付费产品是 Cloudera Enterpris,Cloudera Enterprise 在美国加州举⾏的Hadoop ⼤会 (Hadoop Summit) 上公开,以若⼲私有管理、监控、运作⼯具加强Hadoop 的功能。收费采取合约订购⽅式,价格随⽤的 Hadoop 叢集⼤⼩变动。3.6 Hadoop 是 Java 开发的,所以 MapReduce 只⽀持 Java 语⾔编写。(错误 )分析:rhadoop 是⽤ R 语⾔开发的,MapReduce 是⼀个框架,可以理解是⼀种思想,可以使⽤其他语⾔开发。3.7 Hadoop ⽀持数据的随机读写。(错 )分析:lucene是⽀持随机读写的,⽽ hdfs 只⽀持随机读。但是 HBase 可以来补救。HBase提供随机读写,来解决 Hadoop 不能处理的问题。HBase⾃底层设计开始即聚焦于各种可伸缩性问题:表可以很“⾼”,有数⼗亿个数据⾏;也可以很“宽”,有数百万个列;⽔平分区并在上千个普通商⽤机节点上⾃动复制。表的模式是物理存储的直接反映,使系统有可能提⾼⾼效的数据结构的序列化、存储和检索。3.8 NameNode 负责管理 metadata,client 端每次读写请求,它都会从磁盘中读取或则会写⼊ metadata 信息并反馈 client 端。(错误)此题分析:NameNode 不需要从磁盘读取 metadata,所有数据都在内存中,硬盘上的只是序列化的结果,只有每次 namenode 启动的时候才会读取。1)⽂件写⼊Client 向 NameNode 发起⽂件写⼊的请求。NameNode 根据⽂件⼤⼩和⽂件块配置情况,返回给 Client 它所管理部分 DataNode 的信息。Client 将⽂件划分为多个 Block,根据 DataNode 的地址信息,按顺序写⼊到每⼀个DataNode 块中。2)⽂件读取Client 向 NameNode 发起⽂件读取的请求。3.9 NameNode 本地磁盘保存了 Block 的位置信息。( 个⼈认为正确,欢迎提出其它意见)分析:DataNode 是⽂件存储的基本单元,它将 Block 存储在本地⽂件系统中,保存了 Block的 Meta-data,同时周期性地将所有存在的 Block 信息发送给 NameNode。NameNode返回⽂件存储的 DataNode 的信息。Client 读取⽂件信息。3.10 DataNode 通过长连接与 NameNode 保持通信。(有分歧 )这个有分歧:具体正在找这⽅⾯的有利资料。下⾯提供资料可参考。⾸先明确⼀下概念:(1).长连接Client ⽅与 Server ⽅先建⽴通讯连接,连接建⽴后不断开,然后再进⾏报⽂发送和接收。这种⽅式下由于通讯连接⼀直存在,此种⽅式常⽤于点对点通讯。(2).短连接Client ⽅与 Server 每进⾏⼀次报⽂收发交易时才进⾏通讯连接,交易完毕后⽴即断开连接。Client ⽅与 Server 每进⾏⼀次报⽂收发交易时才进⾏通讯连接,交易完毕后⽴即断开连接。此种⽅式常⽤于⼀点对多点通讯,⽐如多个 Client 连接⼀个 Server.3.11 Hadoop ⾃⾝具有严格的权限管理和安全措施保障集群正常运⾏。(错误 )hadoop 只能阻⽌好⼈犯错,但是不能阻⽌坏⼈⼲坏事3.12 Slave 节点要存储数据,所以它的磁盘越⼤越好。( 错误)分析:⼀旦 Slave 节点宕机,数据恢复是⼀个难题3.13 hadoop dfsadmin –report 命令⽤于检测 HDFS 损坏块。(错误 )3.14 Hadoop 默认调度器策略为 FIFO(正确 )3.15 集群内每个节点都应该配 RAID,这样避免单磁盘损坏,影响整个节点运⾏。(错误 )分析:⾸先明⽩什么是 RAID,可以参考百科磁盘阵列。这句话错误的地⽅在于太绝对,具体情况具体分析。题⽬不是重点,知识才是最重要的。因为 hadoop 本⾝就具有冗余能⼒,所以如果不是很严格不需要都配备 RAID。具体参考第⼆题。3.16 因为 HDFS 有多个副本,所以 NameNode 是不存在单点问题的。(错误 )3.17 每个 map 槽就是⼀个线程。(错误 )分析:⾸先我们知道什么是 map 槽,map 槽->map slotmap slot 只是⼀个逻辑值( eSlots ),⽽不是对应着⼀个线程或者进程3.18 Mapreduce 的 input split 就是⼀个 block。(错误 )3.19 NameNode 的 Web UI 端⼝是 50030,它通过 jetty 启动的 Web 服务。(错误 )3.20 Hadoop 环境变量中的 HADOOP_HEAPSIZE ⽤于设置所有 Hadoop 守护线程的内存。它默认是 200 GB。( 错误)hadoop 为各个守护进程(namenode,secondarynamenode,jobtracker,datanode,tasktracker)统⼀分配的内存在 中设置,参数为 HADOOP_HEAPSIZE,默认为 1000M。3.21 DataNode ⾸次加⼊ cluster 的时候,如果 log 中报告不兼容⽂件版本,那需要 NameNode 执⾏“Hadoop namenode -format”操作格式化磁盘。(错误 )分析:⾸先明⽩介绍,什么 ClusterIDClusterID添加了⼀个新的标识符 ClusterID ⽤于标识集群中所有的节点。当格式化⼀个 Namenode,需要提供这个标识符或者⾃动⽣成。这个 ID 可以被⽤来格式化加⼊集群的其他 Namenode。⼆次整理有的同学问题的重点不是上⾯分析内容:内容如下:这个报错是说明 DataNode 所装的Hadoop版本和其它节点不⼀致,应该检查DataNode的 Hadoop 版本4 问答题(⼀)4.1 Hadoop 集群可以运⾏的 3 个模式?单机(本地)模式伪分布式模式全分布式模式4.2 单机(本地)模式中的注意点?在单机模式(standalone)中不会存在守护进程,所有东西都运⾏在⼀个 JVM 上。这⾥同样没有 DFS,使⽤的是本地⽂件系统。单机模式适⽤于开发过程中运⾏ MapReduce程序,这也是最少使⽤的⼀个模式。4.3 伪分布模式中的注意点?伪分布式(Pseudo)适⽤于开发和测试环境,在这个模式中,所有守护进程都在同⼀台机器上运⾏。4.4 VM 是否可以称为 Pseudo?不是,两个事物,同时 Pseudo 只针对 Hadoop。4.5 全分布模式⼜有什么注意点?全分布模式通常被⽤于⽣产环境,这⾥我们使⽤ N 台主机组成⼀个 Hadoop 集群,Hadoop 守护进程运⾏在每台主机之上。这⾥会存在 Namenode 运⾏的主机,Datanode运⾏的主机,以及 tasktracker 运⾏的主机。在分布式环境下,主节点和从节点会分开。4.6 Hadoop 是否遵循 UNIX 模式?4.6 Hadoop 是否遵循 UNIX 模式?是的,在 UNIX ⽤例下,Hadoop 还拥有“conf”⽬录。4.7 Hadoop 安装在什么⽬录下?Cloudera 和 Apache 使 ⽤ 相 同 的 ⽬ 录 结 构 , Hadoop 被 安 装 在cd/usr/lib/hadoop-0.20/。4.8 Namenode、Jobtracker 和 tasktracker 的端⼝号是?Namenode,70;Jobtracker,30;Tasktracker,60。4.9 Hadoop 的核⼼配置是什么?Hadoop 的核⼼配置通过两个 xml ⽂件来完成:1,;2,。这些⽂件都使⽤ xml 格式,因此每个 xml 中都有⼀些属性,包括名称和值,但是当下这些⽂件都已不复存在。4.10 那当下⼜该如何配置?Hadoop 现在拥有 3 个配置⽂件:1,;2,;3,。这些⽂件都保存在 conf/⼦⽬录下。4.11 RAM 的溢出因⼦是?溢出因⼦(Spillfactor)是临时⽂件中储存⽂件的⼤⼩,也就是 Hadoop-temp ⽬录。4.12 只是单⼀的⽬录? 只是⼀个⽬录。4.13 的 3 个主要属性? 决定的是元数据存储的路径以及 DFS 的存储⽅式(磁盘或是远端) 决定的是数据存储的路径 ⽤于第⼆ Namenode4.14 如何退出输⼊模式?退出输⼊的⽅式有:1,按ESC;2,键⼊:q(如果你没有输⼊任何当下)或者键⼊:wq(如果你已经输⼊当下),并且按下 Enter。4.15 当你输⼊ hadoopfsck/造成“connectionrefusedjavaexception’”时,系统究竟发⽣了什么?这意味着 Namenode 没有运⾏在你的 VM 之上。4.16 我们使⽤ Ubuntu 及 Cloudera,那么我们该去哪⾥下载 Hadoop,或者是默认就与 Ubuntu ⼀起安装?这个属于 Hadoop 的默认配置,你必须从 Cloudera 或者 Edureka 的dropbox 下载,然后在你的系统上运⾏。当然,你也可以⾃⼰配置,但是你需要⼀个 Linuxbox,Ubuntu或者是 RedHat。在 Cloudera ⽹站或者是 Edureka 的 Dropbox 中有安装步骤。4.17 “jps”命令的⽤处?这个命令可以检查 Namenode、Datanode、TaskTracker、JobTracker 是否正常⼯作。4.18 如何重启 Namenode?点击 ,再点击 。键 ⼊ sudohdfs ( Enter ), su-hdfs ( Enter ), /etc/init.d/ha ( Enter ), 及/etc/init.d/hadoop-0.20-namenodestart(Enter)。4.19 Fsck 的全名?全名是:FileSystemCheck。4.20 如何检查 Namenode 是否正常运⾏?如 果 要 检 查 Namenode 是 否 正 常 ⼯ 作 , 使 ⽤ 命 令/etc/init.d/hadoop-0.20-namenodestatus 或者就是简单的 jps。4.21 r 命令的作⽤?可以让你知道哪个节点是 JobTracker。4.22 /etc/init.d 命令的作⽤是?/etc/init.d 说明了守护进程(服务)的位置或状态,其实是 LINUX 特性,和 Hadoop关系不⼤。4.23 如何在浏览器中查找 Namenode?如果你确实需要在浏览器中查找 Namenode,你不再需要 localhost:8021,Namenode 的端⼝号是 50070。4.24 如何从 SU 转到 Cloudera?从 SU 转到 Cloudera 只需要键⼊ exit。4.25 启动和关闭命令会⽤到哪些⽂件?4.25 启动和关闭命令会⽤到哪些⽂件?Slaves 及 Masters。4.26 Slaves 由什么组成?Slaves 由主机的列表组成,每台 1 ⾏,⽤于说明数据节点。4.27 Masters 由什么组成?Masters 同样是主机的列表组成,每台⼀⾏,⽤于说明第⼆ Namenode 服务器。4.28 是⽤于做什么的?提供了 Hadoop 中.JAVA_HOME 的运⾏环境。4.29 Master ⽂件是否提供了多个⼊⼝?是的你可以拥有多个 Master ⽂件接⼝。4.30 ⽂件当下的位置?现在位于 conf。4.31 在 Hadoop_PID_DIR 中,PID 代表了什么?PID 代表了“ProcessID”。4.32 /var/hadoop/pids ⽤于做什么?/var/hadoop/pids ⽤来存储 PID。4.33 ties ⽂件的作⽤是?ties 被⽤做“Reporting”,控制 Hadoop 报告,初始状态是“nottoreport”。4.34 Hadoop 需求什么样的⽹络?Hadoop 核⼼使⽤ Shell(SSH)来驱动从节点上的服务器进程,并在主节点和从节点之间使⽤ password-lessSSH 连接。4.35 全分布式环境下为什么需求 password-lessSSH?这主要因为集群中通信过于频繁,JobTracker 需要尽可能快的给 TaskTracker 发布任务。4.36 这会导致安全问题吗?完全不⽤担⼼。Hadoop 集群是完全隔离的,通常情况下⽆法从互联⽹进⾏操作。与众不同的配置,因此我们完全不需要在意这种级别的安全漏洞,⽐如说通过互联⽹侵⼊等等。Hadoop 为机器之间的连接提供了⼀个相对安全的⽅式。4.37 SSH ⼯作的端⼝号是?SSH ⼯作的端⼝号是 NO.22,当然可以通过它来配置,22 是默认的端⼝号。4.38 SSH 中的注意点还包括?SSH 只是个安全的 shell 通信,可以把它当做 NO.22 上的⼀种协议,只需要配置⼀个密码就可以安全的访问。4.39 为什么 SSH 本地主机需要密码?在 SSH 中使⽤密码主要是增加安全性,在某些情况下也根本不会设置密码通信。4.40 如果在 SSH 中添加 key,是否还需要设置密码?是的,即使在 SSH 中添加了 key,还是需要设置密码。4.41 假如 Namenode 中没有数据会怎么样?没有数据的 Namenode 就不能称之为 Namenode,通常情况下,Namenode 肯定会有数据。4.42 当 JobTracker 宕掉时,Namenode 会发⽣什么?当 JobTracker 失败时,集群仍然可以正常⼯作,只要 Namenode 没问题。4.43 是客户端还是 Namenode 决定输⼊的分⽚?这并不是客户端决定的,在配置⽂件中以及决定分⽚细则。4.44 是否可以⾃⾏搭建 Hadoop 集群?是的,只要对 Hadoop 环境⾜够熟悉,你完全可以这么做。4.45 是否可以在 Windows 上运⾏ Hadoop?你最好不要这么做,RedHatLinux 或者是 Ubuntu 才是 Hadoop 的最佳操作系统。在Hadoop 安装中,Windows 通常不会被使⽤,因为会出现各种各样的问题。因此,Windows绝对不是 Hadoop 的推荐系统。5 问答题(⼆)5.1 写出以下执⾏命令1) 如何杀死⼀个 job先 Hadoop job -list 得到 jobid 杀死 job: hadoop job -kill jobid2) 删除 hdfs 上的/tmp/xxx ⽬录 hadoop fs -rm -r /tmp/xxx3) 加⼊⼀个新的存储节点和删除⼀个计算节点,需要刷新集群状态命令加⼊新节点时:start datanodestart tasktracker删除节点时Hadoop maradmin -refreshnodesHadoop dfsadmin -refreshnodes5.2 简述⼀下 hdfs 的数据压缩算法,⼯作中⽤的是那种算法,为什么?1、在 HDFS 之上将数据压缩好后,再存储到 HDFS2、在 HDFS 内部⽀持数据压缩,这⾥⼜可以分为⼏种⽅法:2.1、压缩⼯作在 DataNode 上完成,这⾥⼜分两种⽅法:2.1.1、数据接收完后,再压缩这个⽅法对 HDFS 的改动最⼩,但效果最低,只需要在 block ⽂件 close 后,调⽤压缩⼯具,将 block ⽂件压缩⼀下,然后再打开 block ⽂件时解压⼀下即可,⼏⾏代码就可以搞定2.1.2、边接收数据边压缩,使⽤第三⽅提供的压缩库效率和复杂度折中⽅法,Hook 住系统的 write 和 read 操作,在数据写⼊磁盘之前,先压缩⼀下,但 write 和 read 对外的接⼝⾏为不变,⽐如:原始⼤⼩为 100KB 的数据,压缩后⼤⼩为 10KB,当写⼊ 100KB 后,仍对调⽤者返回 100KB,⽽不是 10KB2.2、压缩⼯作交给 DFSClient 做,DataNode 只接收和存储这个⽅法效果最⾼,压缩分散地推给了 HDFS 客户端,但 DataNode 需要知道什么时候⼀个 block 块接收完成了。推荐最终实现采⽤ 2.2 这个⽅法,该⽅法需要修改的 HDFS 代码量也不⼤,但效果最⾼。1、 Datanode 在什么情况下不会备份?单节点的情况下不会备份!2、 datanode ⾸次加⼊ cluster 的时候,如果 log 报告不兼容⽂件版本,那需要 namenode3、 执⾏格式化操作,这样处理的原因是?这个说法是错误的!添加了⼀个新的标识符 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 的实例butedFileSystem 通过 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 ⽅法创建新⽂件butedFileSystem 通过 RPC 调⽤ namenode 去创建⼀个没有 blocks 关联的新⽂件,创建前,namenode 会做各种校验,⽐如⽂件是否存在,客户端有⽆权限去创建等。如果校验通过,namenode 就会记录下新⽂件,否则就会抛出 IO 异常.3.前两步结束后会返回 FSDataOutputStream 的 对 象 , 和读 ⽂ 件 的 时 候 相似 ,FSDataOutputStream 被 封装 成 DFSOutputStream, DFSOutputStream 可以协 调namenode 和 datanode。客户端开始写数据到 DFSOutputStream,DFSOutputStream会把数据切成⼀个个⼩ packet,然后排成队列 data quene。reamer 会去处理接受 data quene,他先问询 namenode 这个新的 block 最适合存储的在哪⼏个 datanode ⾥,⽐如重复数是 3,那么就找到 3 个最适合的 datanode,把他们排成⼀个 reamer 把packet 按队列输出到管道的第⼀个 datanode 中,第⼀个 datanode ⼜把 packet 输出到第⼆个 datanode 中,以此类推。putStream 还有⼀个对列叫 ack quene,也是有 packet 组成,等待 datanode的收到响应,当 pipeline 中的所有 datanode 都表⽰已经收到的时候,这时 akc quene 才会把对应的 packet 包移除掉。6.客户端完成写数据后调⽤ close ⽅法关闭写⼊流reamer 把剩余得包都刷到 pipeline ⾥然后等待 ack 信息,收到最后⼀个 ack 后,通知 datanode 把⽂件标⽰为已完成。5.5 哪个进程通常与 namenode 在⼀个节点启动?并做分析JobTrackerhadoop 的集群是基于 master/slave 模式,namenode 和 jobtracker 属于 master,datanode 和 tasktracker 属于 slave,master 只有⼀个,⽽ slave 有多个SecondaryNameNode 内存需求和 NameNode 在⼀个数量级上,所以通常 secondaryNameNode(运⾏在单独的物理机器上)和 NameNode 运⾏在不同的机器上。JobTracker 和 TaskTrackerJobTracker 对应于 NameNodeTaskTracker 对应于 DataNodeDataNode 和 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 的机器都可以部署 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://:9000/middle/weibo/”);//获取⽂件⽬录FileStatus filestatus = eStatus(path);//获取⽂件块位置列表BlockLocation[] blkLocations =eBlockLocations(filestatus, 0, ());//循环输出块信息for(int i=0;i< ;i++){String[] hosts = blkLocations[i].getHosts();n(“block_”+i+"_location:"+hosts[0]);}5.8 HDFS 存储的机制?HDFS 的三个实体数据块每个磁盘都有默认的数据块⼤⼩,这是磁盘进⾏读写的基本单位.构建于单个磁盘之上的⽂件系统通过磁盘块来管理该⽂件系统中的块.该⽂件系统中的块⼀般为磁盘块的整数倍.磁盘块⼀般为 512 字节.HDFS 也有块的概念,默认为 64MB(⼀个 map 处理的数据⼤⼩).HDFS 上的⽂件也被划分为块⼤⼩的多个分块,与其他⽂件系统不同的是,HDFS 中⼩于⼀个块⼤⼩的⽂件不会占据整个块的空间.HDFS ⽤块存储带来的第⼀个明显的好处⼀个⽂件的⼤⼩可以⼤于⽹络中任意⼀个磁盘的容量,数据块可以利⽤磁盘中任意⼀个磁盘进⾏存储.第⼆个简化了系统的设计,将控制单元设置为块,可简化存储管理,计算单个磁盘能存储多少块就相对容易.同时也消除了对元数据的顾虑,如权限信息,可以由其他系统单独管理.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 就会得知副本缺失,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 的左边,如果⼀个表很⼩可以采⽤ mapjoin2)排序优化,order by ⼀个 reduce 效率低,distirbute by +sort by 也可以实现全局排序3)使⽤分区,查询时可减少数据的检索,从⽽节省时间。5.17 hive 能像关系数据库那样,建多个库吗?可以建⽴多个库,多库多表都⽀持。5.18 hive 中的压缩格式 RCFile、 TextFile、 SequenceFile 各有什么区别?TextFile:默认格式,数据不做压缩,磁盘开销⼤,数据解析开销⼤SequenceFile:Hadoop API 提供的⼀种⼆进制⽂件⽀持,使⽤⽅便,可分割,可压缩,⽀持三种压缩,NONE,RECORD,BLOCKRCFILE 是⼀种⾏列存储相结合的⽅式。⾸先,将数据按⾏分块,保证同⼀个 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 有序,不能保证全局有序,需设置>1

发布者:admin,转转请注明出处:http://www.yc00.com/news/1690377803a340450.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信