logo资料库

大数据面试题.docx

第1页 / 共46页
第2页 / 共46页
第3页 / 共46页
第4页 / 共46页
第5页 / 共46页
第6页 / 共46页
第7页 / 共46页
第8页 / 共46页
资料共46页,剩余部分请下载后查看
Hadoop 部分 1. Hadoop 安装步骤(九部曲)? 主从节点都要操作的: 1.在/etc/hosts 下配置 IP 及主机名 2.创建 hadoop 用户(同时配置 hosts) 3.安装 jdk 4.配置环境变量/etc/profile 5.在主节点操作 (1).解压并安装 hadoop (2).配置参数文件 core-site.xml 、hdfs-site.xml、 mapred-site.xml、master、 slaves (3).将主节点的 hadoop 拷贝到各个从节点 6.在所有节点操作 把/usr/local/hadoop-0.20.2-cdh3u5 的所有者,所有者组改为 hadoop 并 su 成该用户 7.在各个节点上配置秘钥,访问所有的节点 8.在主节点操作 (1).格式化:hadoop (2).启动:hadoop 9.验证:jps nodename -format start-all.sh 2. 请列出正常的 hadoop 集群中 hadoop 都分别需要启动哪些进程,他们的作用分别都是什 么,请尽量列的详细一些。 NameNode:接受来自客户端的文件信息,存储文件的元数据, SecondaryNode:接受来自 NameNode 中的 edits 及 fsimage,做一个类似于类备份的操 作,定期清空 edits,减小 NameNode 的操作压力。 JobTracker: 管理所有作业,作业/任务的监控、错误处理等;将作业初始化分解成一 系列任务,并分派给 TaskTracker。 DataNode:存储实际的数据,汇报存储信息给 NameNode。 TaskTracker:运行 Map Task 和 Reduce Task;并与 JobTracker 交互,汇报任务状态 给 JobTracker。 3. hadoop 运行原理 MapReduce HDFS 分布式文件系统(HDFS 客户端的读写流程) 写: 客户端接收用户数据,并缓存到本地 当缓存足够一个 HDFS 大小的时候 客户端同 NameNode 通讯注册一个新的块 注册成功后 NameNode 给客户端返回一个 DateNode 的列表 客户端向列表中的第一个 DateNode 写入块 收到所有的 DateNode 的确认信息后,客户端删除本地缓存 客户端继续发送下一个块 重复以上步骤 所有数据发送完成后,写操作完成
读: 客户端与 NameNode 通讯获取文件的块位置信息,包括块的所有冗余备份的位置信息: DateNode 列表 客户端获取文件位置信息后直接同有文件块的 DateNode 通讯,读取文件 如果第一个 DateNode 无法连接,客户端将自动联系下一个 DateNode 如果块数据的校验值出错,则客户端需要向 NameNode 报告,并自动联系下一个 DateNode 客户端的 hadoop 环境:与集群的 hadoop 包一样 集群入口:core-site.xml、fs.default.name 缓存块大小:fs.block.size 存多少份:fs.replication 4. hadoop 中需要配置哪些配置文件其作用是什么? mapred-site-xml;hdfs-site-xml;core-site-xml; 作用:看 ppt; 5. Hadoop HA 如何实现?简述过程 HA:High Available(高可用) 说明 1:Hadoop 的高可用是 hadoop2.X 版本及以上的特性;hadoop HA 通过 zookeeper 来实现 namenode 的高可用; 过程:现在 hadoop 集群里面搭建了一个 zookeeper 的集群,同时我这个 zookeeper 的共 享池通过多个其他的节点来实现,然后通过在另一个机架服务器上已经配好了一个 standby 的 namenode,然后整个 hadoop 的集群现在有一个处于 active 的 namenode,通过 zookeeper 告诉 client 和从节点有这样一个 standby 的 namenode,然后 active-namenode 定期产生的 edits 会交互到这个共享池里面,如果 active-namenode 宕机,则 standby-namenode 通过 共享池里面的 edits 进行热备份立马恢复所有的 fsimage,最终成为新的 active-namenode。 6. mapreduce 的原理 mapreduce 的原理:一个 MapReduce 框架由一个单独的 master JobTracker 和集群节点 每一个 slave TaskTracker 共同组成。master 负责调度构成一个作业的所有任务,在这些
的 slave 上,master 监控它们的执行,并且重新执行已经失败的任务。而 slave 仅负责执 行由 maste 指派的任务。 7. HDFS 存储机制 HDFS 存储机制是以块的方式进行缓存到硬盘中,1.0 版的是每块大小是 64MB,2.0 版的 是每块大小是 128MB;其中 HDFS 由一个 NameNode 和多个 DataNode 组成,NameNode 负责存 储元数据,而 DataNode 负责存储实际数据。 8. 如何查看 hadoop 日志文件? 1.Hadoop MapReduce 日志分为两部分,一部分是服务日志,一部分是作业日志,服务 日 志 包 括 JobTracker 日 志 和 各 个 TaskTracker 日 志 , 他 们 的 日 志 文 件 均 在 所 在 节 点 的 $HADOOP_HOME/logs/目录下; 作业日志包括 jobhistory 日志和 task 日志两部分,其中,jobhistory 日志是作业运行 日志,包括作业启动时间、结束时间,每个任务的启动时间、结束时间,各种 counter 信息 等,用户可以从这个日志中解析出作业运行的各种信息,是非常有价值的信息。默认存放位 置 是 JobTracker 所 在 节 点 的 $HADOOP_HOME/history 目 录 下 , 可 通 过 参 数 hadoop.job.history.location 配 置 。 每 个 task 日 志 存 放 在 task 运 行 节 点 上 , 存 放 位 置 是 $HADOOP_HOME/userlogs//目录下 2.可在 NameNode 的那个网页上找到 9. Hadoop 集群可以运行的 3 个模式? 1.单机模式:有一个 java 进程模拟 hadoop 的各个角色:一台单机上运行,没有分布式 文件系统,而是直接读写本地操作系统的文件系统 2.伪分布式:有多个 java 进程模拟 hadoop 的各个角色:这种模式也是在一台单机上运 行,但用不同的 Java 进程模仿分布式运行中的各类结点 3.集群环境 10. 如何用命令确认 hadoop 集群的健康状况 hadoop dfsadmin -report 11. 杀死一个 job,执行的命令是什么? 列出 Jobtracer 上所有的作业 hadoop job -list 使用 hadoop job -kill 杀掉指定的 jobid hadoop job -kill job_id 组合以上两条命令就可以实现 kill 掉指定用户的 job for i in `hadoop job -list | grep -w username| awk '{print $1}' | grep job_`; do hadoop job -kill $i; done 12. Mapreduce 数据倾斜是什么意思?怎么处理? Mapreduce 数据倾斜是指我们在分片的时候导不同分片上的数据不均,导致这些分片在 并行处理的时候,有的分片执行事件过程,有的执行时间过短,导致总的执行时间过长的一 种现象,通常是由:1.map 的的 key 值过多或者有空值;2.业务本身的特性;3.某些 sql 就 有数据倾斜;4.建表的时候考虑不周等原因造成的。
处理:1.如果是大量数据的时候可以做基于 map 的 key 值离散。通过写一个 for 循环给 过多的 key 打标签。 2.数据量小的时候,且输入的结果不会影响到 reduce 输入的结果,且不做平均 值的时候,用基于 map 端之后 shuffle 端之前的 reduce 操作。 13. combiner 的作用,使用时机? 数据量小的时候,且输入的结果不会影响到 reduce 输入的结果,且不做平均值的时候, 用基于 map 端之后 shuffle 端之前的 reduce 操作。 14. MapReduce--如何设置 Reducer 的个数 1. 在 代 码 中 通 过 : JobConf.setNumReduceTasks(Int numOfReduceTasks) 方 法 设 置 reducer 的个数; 2.在 hive 中:set mapred.reduce.tasks; 3.reducer 的最优个数与集群中可用的 reducer 的任务槽数相关,一般设置比总槽数微 少一些的 reducer 数量;Hadoop 文档中推荐了两个公式: 0.95*NUMBER_OF_NODES*mapred.tasktracker.reduce.tasks.maximum 1.75*NUMBER_OF_NODES*mapred.tasktracker.reduce.tasks.maximum 备注:NUMBER_OF_NODES 是集群中的计算节点个数; mapred.tasktracker.reduce.tasks.maximum:每个节点所分配的 reducer 任务槽的个数; 15. MR 的过程: input ----->spilt—》 map----->combiner----->shuffer---> partition——》reduce----->output input :对数据进行 split 分片处理,产生 K1 值和 V1 值,传给 map map: 数据整理,把数据整理成 K2 和 V2, combiner:如果 map 输出内容比较多,reduce 计算比较慢,我们可以加个 combiner map 端的本地化 reduce,减少 map 输出; shuffer:相同的数据放到一个分区 partiton:如果 reduce 不是一个,shuffler 做一个分区,将相同的 K 值,分到一个区; 排序方式:hash 方式; reduce:shuffle 分区结束后交给 reduce 进行计算,形成 K3 V 3 output: 将 reduce 处理完的 K3 和 V3 交给 output 输出; a. 客户端编写好 mapreduce 程序,提交 job 到 jobtracker; b. Jobtracker 进行检查操作,确定输出目录是否存在,存在抛出错误; c. Jobtracker 根据输入计算输入分片 input split、配置 job 的资源、初始化作业、分配任务; d. 每个 input split 创建一个 map 任务,tasktracker 执行编写好的 map 函数; e. Combiner 阶段是可选的,它是一个本地化的 reduce 操作,合并重复 key 的值; f. Shuffle 一开始就是 map 做输出操作,并对结果进行排序,内存使用达到阀值就会 spill,把 溢出文件写磁盘,写磁盘前有个排序操作,map 输出全部做完后,会合并溢出文件,这个过 程中还有个 Partitioner 操作,一个 partitioner 对应一个 reduce 作业,reduce 开启复制线程, 复制对应的 map 输出文件,复制时候 reduce 还会进行排序操作和合并文件操作 g. 传输完成,执行编写好的 reduce 函数,结果保存到 hdfs 上。 16. MR 怎么处理小文件: 1.输入过程合并处理:1.在 linux 10000 个文件上传到 HDFS 时候,用脚本形成二进制文
件流上传,上传的过程中就合并成了一个文件。 2.如果在 hdfs 中有大量小文件,首先进行清洗,把 10000 个小文件清洗成一个文件或者 几个文件,写个 map(1.前提 10000 小文件格式相同,2.不会有太多的小文件 一千万个小文 件,首先会在操作系统上传时就处理完了,但是要是问可以说,分批做,每一万个存储到一 个目录中,对一个目录进行 map 清洗)),其次,进行 reduce 计算 清洗会产生数据倾斜: 很多小文件是数据倾斜(解决方法):2.1.基于 map 端的离散方 法;2.2.combiner; //hdfs 为什么怕很多小文件:因为很多小文件的话也会占用 namenode 目录树的空间,一般 一个文件的元数据会占到 150 字节;而 NameNode 是要接收集群中所有的 DataNode 的心跳 信息,来确定元数据的信息变化的,当小文件一旦过多,namenode 的元数据读取就会变慢。 (在 HDFS 中,namenode 将文件系统中的元数据存储在内存中,因此,HDFS 所能存储的文 件数量会受到 namenode 内存的限制) 17. (hadoop 下的数据类型)context 输出类型(8 个) BooleanWritable:标准布尔型数值 ByteWritable:单字节数值 DoubleWritable:双字节数值 FloatWritable:浮点数 IntWritable:整型数 LongWritable:长整型数 Text:使用 UTF8 格式存储的文本 NullWritable:当中的 key 或 value 为空时使用 18. flume 的组成部份 flume 以 agent 为最小的独立运行单位,一个 agent 就是一个 JVM。单 agent 由 source、 sink 和 channel 三大组件构成。 source:完成对日志数据的收集,分成 transtion 和 event 打入到 channel 之中。 channel:主要提供一个队列的功能,对 source 提供的数据进行简单的缓存。 sink:取出 channel 中的数据,进行相应的存储文件系统,数据库,或者提交到远程服务 器。 19. 如何从编程的角度讲解 MR 的过程 对数据进行底层默认分片把数据解析成 k1/v1 形式传给 map; Map 对 k1/v1 进行截取、运算等操作生成 k2/v2 传给 reduce; Reduce 对相同 key 的值进行计算,生成最终结果 k3/v3 输出 20. MR 中有没有只有 MAP 的 有,只对数据进行分片,解析成 key/value 形式后,直接输出结果不进行 reduce 端的去 重和数组化的。 eg:比如说我把所有的经过 split(map)形成的元素都放到 context 的 key 做标签就 不会用到 reduce。 21. MAP 输出端的组成部份 Combiner、shuffle、partitioner
22. 如何用 MR 实现 join 1) reduce side join(在 reduce 端做 join 操作) 在 map 阶段,map 函数同时读取两个文件 File1 和 File2,为了区分两种来源的 key/value 数据对,对每条数据打一个标签 (tag),比如:tag=0 表示来自文件 File1,tag=2 表示来 自文件 File2。即:map 阶段的主要任务是对不同文件中的数据打标签。 在 reduce 阶段,reduce 函数获取 key 相同的来自 File1 和 File2 文件的 value list, 然后对于同一个 key,对 File1 和 File2 中的数据进行 join(笛卡尔乘积)。即:reduce 阶段进行实际的连接操作。 2) map side join(在 map 端做 join 操作) 之所以存在 reduce side join,是因为在 map 阶段不能获取所有需要的 join 字段,即: 同一个 key 对应的字段可能位于不同 map 中。Reduce side join 是非常低效的,因为 shuffle 阶段要进行大量的数据传输。 Map side join 是针对以下场景进行的优化:两个待连接表中,有一个表非常大,而另 一个表非常小,以至于小表可以直接存放到内存中。这样,我们可以将小表复制多份,让每 个 map task 内存中存在一份(比如存放到 hash table 中),然后只扫描大表:对于大表中 的每一条记录 key/value,在 hash table 中查找是否有相同的 key 的记录,如果有,则连 接后输出即可。为了支持文件的复制,Hadoop 提供了一个类 DistributedCache,使用该类 的方法如下: (1)用户使用静态方法 DistributedCache.addCacheFile()指定要复制的文件,它的 参 数 是 文 件 的 URI ( 如 果 是 HDFS 上 的 文 件 , 可 以 这 样 : hdfs://namenode:9000/home/XXX/file,其中 9000 是自己配置的 NameNode 端口 号)。 JobTracker 在作业启动之前会获取这个 URI 列表,并将相应的文件拷贝到各个 TaskTracker 的本地磁盘上。(2)用户使用 DistributedCache.getLocalCacheFiles()方法获取文件目 录,并使用标准的文件读写 API 读取相应的文件。 23. MAP 如何排序 在 map 端一共经历两次的排序: 当 map 函数产生输出时,会首先写入内存的环形缓冲区,当达到设定的阈值,在刷写磁 盘之前,后台线程会将缓冲区的数据划分成相应的分区。在每个分区中,后台线程按键进行 内排序,在 Map 任务完成之前,磁盘上存在多个已经分好区,并排好序的、大小和缓冲区一 样的溢写文件,这时溢写文件将被合并成一个已分区且已排序的输出文件。由于溢写文件已 经经过第一次排序,所以合并分区文件时只需要再做一次排序就可使输出文件整体有序。 24. 65M 的任务会分成几个块 如果块大小是 64M 每个块的话,则会分成 2 个块(冗余的话默认为 6 个);如果是 128M 每块大小的话,则不够一个块的大小,只会产生一个快(冗余的话默认为 3 个)。 25. 假设 hadoop 一个 job 产生了 100 个 task, 并且其中的一个 task 失败了,hadoop 会如 何处理? Hadoop 是一个基于廉价硬件上的高效、可靠的系统。任何失败的 task 不会引起整个 job 的失败,因为所有失败的任务都会被重新执行,只有重新执行超过 4 次依然失败才会把任务 标记为失败,导致整个 job 的失败。
26. hive 中的压缩格式 RCFile.TextFile.SequenceFile(AVRO)各有什么区别,以上三种格 式一样大的文件哪个占用空间大小 TEXTFILE 和 SEQUENCEFILE(AVRO)的存储格式都是基于行存储的,RCFILE 是基于行列混 合的思想,先按行把数据划分成 N 个 row group,在 row group 中对每个列分别进行存储。 1.在压缩比方面,RCFILE 有较优的压缩比,因为 SEQUENCEFILE 是行压缩,行内不同数 据值统一压缩,但是 RCFILE 对每列独立压缩,避免了不同数据值的混合压缩,所以压缩比 相对高一些。但是由于对列进行压缩存储,压缩性能比单单对行进行压缩消耗更多。也正体 现了压缩的空间和时间的矛盾体。 2.数据加载方面,SEQUENCEFILE 优于 RCFILE,因为 RCFILE 的列压缩方式,数据加载压 缩时的性能消耗比较大。但是对于数据仓库的一次写入、多次读取,数据的加载性能对整体 利用影响没有压缩比和查询影响大。 3.查询响应方面,RCFILE 有较优的表现。RCFILE 的数据读取方式和 Lazy 解压方式起到了 很大的作用,在读取数据的每个行组时,RCFILE 只需读取元数据头部和查询指定的列,而不 是行组的全部数据都读到内存中,节省了很多的 I/O。虽然读取了元数据头部和查询指定的 列,但是不是对这些数据完全解压,Lazy 解压技术保证了,只解压满足 where 条件的数据。 27. 介绍一下 HBase 过滤器 过滤器产生的背景: HBase 的基本 API,包括增、删、改、查等。增、删都是相对简单的操作,与传统的 RDBMS (关系数据库管理系统(Relational Database Management System))相 比,这里的查询操作略显苍白,只能根据特性的行键进行查询(Get)或者根据行键的范围 来查询(Scan)。HBase 不仅提供了这些简单的查询,而且提供了更加高级的过滤器(Filter) 来查询。 过滤器的两类参数: 过滤器可以根据列族、列、版本等更多的条件来对数据进行过滤,基于 HBase 本身提 供的三维有序(行键,列,版本有序),这些过滤器可以高效地完成查询过滤的任务,带有 过滤器条件的 RPC(RPC(Remote Procedure Call Protocol)——远程过程调用协议)) 查询 请求会把过滤器分发到各个 RegionServer(这是一个服务端过滤器),这样也可以降低网络 传输的压力。 使用过滤器至少需要两类参数:1. 一类是抽象的操作符 2.另一类是比较器代表具体的 逻辑,例如字节级的比较,字符串级的比较等。 28. Hbase 的查询方式有几种 1.可以进行全表查询:scan 表名 2.可以通过单个 row key 查询:get ‘表名’,’行键名’ 3.可以通过 row key range 查询:get ‘表名’,’行键名’,’列族名:列名’等 4.还可以通过查询表名中的列族名进行查询:scan ‘表名’,{COLUMNS,’列族名’} 29. sqoop 具体命令 bin/sqoop export 123456 --connect --password --table --input-fields-terminated-by '\t' jdbc:mysql://192.168.18.101:3306/test sss --username root hdfs://h101:9000/user/hadoop/bb.txt --export-dir Import,export,eval;(详细看之前的文档的命令)
30. Hive 中的 sort by 和 order by 的区别 a.hive 中的 ORDER BY 语句会对查询结果做全局排序,这意味着所有的数据会传送到一 个 Reduce 任务上,这样会导致在大数量的情况下,花费大量时间。 b.SORT BY 不是全局排序,其在数据进入 reducer 前完成排序,因此在有多个 reduce 任 务情况下,SORT BY 只能保证每个 reduce 的输出有序,而不能保证全局有序 。 31. 如何在集群中新添加一个节点 方式 1:静态添加 datanode,停止 namenode 方式 : 1.停止 namenode 2.修改 slaves 文件,并更新到各个节点 3.启动 namenode 4.执行 hadoop balance 命令。(此项为 balance 集群使用,如果只是添加节点,则此步骤不 需要) ----------------------------------------- 方式 2:动态添加 datanode,不停 namenode 方式 : 1.修改 slaves 文件,添加需要增加的节点 host 或者 ip,并将其更新到各个节点 2.在 datanode 中启动执行启动 datanode 命令。命令:sh hadoop-daemon.sh start datanode 3.可以通过 web 界面查看节点添加情况。或使用命令:sh hadoop dfsadmin -report 4.执行 hadoop balance 命令。(此项为 balance 集群使用,如果只是添加节点,则此步骤不 需要) 32. yarn 命令中的 container 的作用? (1)Container 是 YARN 中资源的抽象,它封装了某个节点上一定量的资源(CPU 和内 存两类资源)。它跟 Linux Container 没有任何关系,仅仅是 YARN 提出的一个概念(从实现 上看,可看做一个可序列化/反序列化的 Java 类)。 (2)Container 由 ApplicationMaster 向 ResourceManager 申请的,由 ResouceManager 中的资源调度器异步分配给 ApplicationMaster; (3)Container 的运行是由 ApplicationMaster 向资源所在的 NodeManager 发起的, Container 运行时需提供内部执行的任务命令(可以使任何命令,比如 java、Python、C++进 程启动命令均可)以及该命令执行所需的环境变量和外部资源(比如词典文件、可执行文件、 jar 包等)。 33. 请简述 hadoop 怎样实现二级排序。 在 Hadoop 中,默认情况下是按照 key 进行排序,如果要按照 value 进行排序怎么办? 有两种方法进行二次排序,分别为:buffer and in memory sort 和 value-to-key conversion。 buffer and in memory sort 主要思想是:在 reduce()函数中,将某个 key 对应的所有 value 保存下来,然后进行排 序。 这种方法最大的缺点是:可能会造成 out of memory。 value-to-key conversion 主要思想是:将 key 和部分 value 拼接成一个组合 key(实现 WritableComparable 接口 或者调 setSortComparatorClass 函数),这样 reduce 获取的结果便是先按 key 排序,后按 value 排序的结果,需要注意的是,用户需要自己实现 Paritioner,以便只按照 key 进行数据划分。
分享到:
收藏