目录
请列出hadoop正常工作时要启动那些进程,并写出各自的作用。
一些传统的hadoop 问题,mapreduce 他就问shuffle 阶段,你怎么理解的
hbase的rowkey怎么创建好?列族怎么创建比较好?(重点)
Redis,传统数据库,hbase,hive 每个之间的区别?
-
hdfs的体系结构:
hdfs有namenode、secondraynamenode、datanode组成。 namenode负责管理datanode和记录元数据 secondraynamenode负责合并日志 datanode负责存储数据
-
请列出hadoop正常工作时要启动那些进程,并写出各自的作用。
namenode:管理集群并记录datanode的元数据,相应客户端的请求。 seconder namenode:对namenode一定范围内的数据做一份快照性备份。 datanode:存储数据。 jobTracker:管理客户端提交的任务,并将任务分配给TaskTracker。 TaskTracker:执行各个Task。 JobTracker和TaskTracker的功能 JobTracker是一个master服务,软件启动之后JobTracker接收Job,负责调度Job的每一个子任务task运行于TaskTracker上, 并监控它们,如果发现有失败的task就重新运行它。一般情况应该把JobTracker部署在单独的机器上。 TaskTracker是运行在多个节点上的slaver服务。TaskTracker主动与JobTracker通信,接收作业,并负责直接执行每一个任务。
-
一个datanode 宕机,怎么一个流程恢复?
Datanode宕机了后,如果是短暂的宕机,可以实现写好脚本监控,将它启动起来。如果是长时间宕机了(大概12小时以上这台机器上的块就会复制到别的机器上),那么datanode上的数据应该已经被备份到其他机器了, 那这台datanode就是一台新的datanode了,删除他的所有数据文件和状态文件,重新启动 hadoop 的 namenode 宕机,怎么解决? 先分析宕机后的损失,宕机后直接导致client无法访问,内存中的元数据丢失,但是硬盘中的元数据应该还存在,如果只是节点挂了, 重启即可,如果是机器挂了,重启机器后看节点是否能重启,不能重启就要找到原因修复了。 但是最终的解决方案应该是在设计集群的初期就考虑到这个问题,做namenode的HA。
-
MapTask并行机度是由什么决定的?
一个job的map阶段并行度由客户端在提交job时决定 每一个split切片分配一个mapTask 默认 切片大小=blocksize 切片时不考虑数据集整体,而是逐个对每一个文件单独切片
-
MapTask工作机制:
Read阶段; 读文件 输入文件对文件切片的规划 Map阶段: 业务逻辑 Collect阶段: 分区 排序 溢写阶段: 写磁盘 Combine阶段: 归并 (1)Read 阶段:Map Task 通过用户编写的 RecordReader,从输入 InputSplit 中解析出 一个个 key/value。 (2)Map 阶段:该节点主要是将解析出的 key/value 交给用户编写 map()函数处理,并 产生一系列新的 key/value。 (3)Collect 收集阶段:在用户编写 map()函数中,当数据处理完成后,一般会调用 OutputCollector.collect()输出结果。在该函数内部,它会将生成的 key/value 分区(调用 Partitioner),并写入一个环形内存缓冲区中。 (4)Spill 阶段:即“溢写”,当环形缓冲区满后,MapReduce 会将数据写到本地磁盘上, 生成一个临时文件。需要注意的是,将数据写入本地磁盘之前,先要对数据进行一次本地排 序,并在必要时对数据进行合并、压缩等操作。 溢写阶段详情: 步骤 1:利用快速排序算法对缓存区内的数据进行排序,排序方式是,先按照分区编号 partition 进行排序,然后按照 key 进行排序。这样,经过排序后,数据以分区为单位聚集在 一起,且同一分区内所有数据按照 key 有序。 步骤 2:按照分区编号由小到大依次将每个分区中的数据写入任务工作目录下的临时文 件 output/spillN.out(N 表示当前溢写次数)中。如果用户设置了 Combiner,则写入文件之 前,对每个分区中的数据进行一次聚集操作。 信息包括在临时文件中的偏移量、压缩前数据大小和压缩后数据大小。如果当前内存索引大 小超过 1MB,则将内存索引写到文件 output/spillN.out.index 中。 (5)Combine 阶段:当所有数据处理完成后,MapTask 对所有临时文件进行一次合并, 以确保最终只会生成一个数据文件。 当所有数据处理完后,MapTask 会将所有临时文件合并成一个大文件,并保存到文件 output/file.out 中,同时生成相应的索引文件 output/file.out.index。 在进行文件合并过程中,MapTask 以分区为单位进行合并。对于某个分区,它将采用多 轮递归合并的方式。每轮合并 io.sort.factor(默认 100)个文件,并将产生的文件重新加入 待合并列表中,对文件排序后,重复以上过程,直到最终得到一个大文件。 让每个 MapTask 最终只生成一个数据文件,可避免同时打开大量文件和同时读取大量 小文件产生的随机读取带来的开销。
-
MR是干什么的?
MR将用户编写的业务逻辑代码和自带的默认组件结合起来组成一个完整的分布式应用程序放到hadoop集群上运行。
-
MR的实例进程:
driver(mr的job提交客户端) MRAppMaster MapTask ReduceTask
-
combiner和partition的作用:
combiner的意义就是对每一个maptask的输出进行局部汇总,以减小网络传输量 partition的默认实现是hashpartition,是map端将数据按照reduce个数取余,进行分区,不同的reduce来copy自己的数据。 partition的作用是将数据分到不同的reduce进行计算,加快计算效果。
-
什么是shuffle:
map阶段处理的数据如何传递给reduce阶段,是mapreduce框架中最关键的一个流程,这个流程就叫shuffle; shuffle: 洗牌、发牌——(核心机制:数据分区,排序,缓存); 具体来说:就是将maptask输出的处理结果数据,分发给reducetask,并在分发的过程中,对数据按key进行了分区和排序;
-
secondarynamenode的主要职责是什么:
n的主要职责是执行checkpoint操作 每隔一段时间,会由secondary namenode将namenode上积累的所有edits和一个最新的fsimage下载到本地,并加载到内存进行merge(这个过程称为checkpoint)
-
用mapreduce怎么处理数据倾斜问题:
数据倾斜:map /reduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理时间很长, 这是因为某一个key的条数比其他key多很多(有时是百倍或者千倍之多),这条key所在的reduce节点所处理的数据量比其他节点就大很多, 从而导致某几个节点迟迟运行不完,此称之为数据倾斜。 解决:自己实现partition类,用key和value相加取hash值。
-
一些传统的hadoop 问题,mapreduce 他就问shuffle 阶段,你怎么理解的
Shuffle意义在于将不同map处理后的数据进行合理分配,让reduce处理,从而产生了排序、分区。
-
hive内部表和外部表的区别
内部表:加载数据到hive所在的hdfs目录,删除时,元数据和数据文件都删除 外部表:不加载数据到hive所在的hdfs目录,删除时,只删除表结构。
-
分桶的作用
最大的作用是提高join的效率。(1)获得更高的查询处理效率。(2)使取样(sampling)更高效。
-
UDF:
1、写对应的java代码自定义函数的逻辑 2、将代码打成jar包上传到hive 3、在hive创建临时函数与对应的class类相关联 4、在hive中调用临时函数。
-
hbase的rowkey怎么创建好?列族怎么创建比较好?(重点)
hbase存储时,数据按照Row key的字典序(byte order)排序存储。设计key时,要充分利用排序存储这个特性,将经常一起读取的行存储放到一起。(位置相关性) 一个列族在数据底层是一个文件,所以将经常一起查询的列放到一个列族中,列族尽量少,减少文件的寻址时间。
-
Redis,传统数据库,hbase,hive 每个之间的区别?
redis:分布式缓存,强调缓存,内存中数据 传统数据库:注重关系 hbase:列式数据库,无法做关系数据库的主外键,用于存储海量数据,底层基于hdfs hive:数据仓库工具,底层是mapreduce。不是数据库,不能用来做用户的交互存储
-
hdfs 和 hbase 各自使用场景
HDFS: 1、一次性写入,多次读取。 2、保证数据的一致性。 3、主要是可以部署在许多廉价机器中,通过多副本提高可靠性,提供了容错和恢复机制。 Hbase: 1、瞬间写入量很大,数据库不好支撑或需要很高成本支撑的场景。 2、数据需要长久保存,且量会持久增长到比较大的场景 3、hbase 不适用与有 join,多级索引,表关系复杂的数据模型 4、大数据量 (100s TB 级数据) 且有快速随机访问的需求。 如:淘宝的交易历史记录。数据量巨大无容置疑,面向普通用户的请求必然要即时响应。 5、容量的优雅扩展 大数据的驱使,动态扩展系统容量的必须的。例如:webPage DB。 6、业务场景简单,不需要关系数据库中很多特性(例如交叉列、交叉表,事务,连接等等) 7、优化方面:合理设计 rowkey。因为 hbase 的查询速度和rowkey有直接关系
-
你觉得spark 可以完全替代hadoop 么?
spark会替代mr,不会代替yarn和hdfs. 公司之后倾向用spark 开发,你会么(就用java代码去写) 会,spark使用scala开发的,在scala中可以随意使用jdk的类库,可以用java开发,但是最好用原生的scala开发,兼容性好,scala更灵活。