Hadoop总结
1、大数据与人工智能这个概念在近几年来持续火爆,企业对这一方面人才需求越来越大,为此,为了培养这一方面人才,同时提高某高校应届毕业生就业竞争力,该高校开展大数据与人工智能学科竞赛,在该高校主页的学科竞赛专栏上,从后台服务器上收集到该学科竞赛专栏原始日志数据(moodle.iflysse.access.log),那么,你作为参赛选手,需要你使用HDFS API做到以下几点?
(1) 使用Java API创建HDFS文件夹(hdfs://Master:8020/hdfs/iflysse_log);
(2)将日志数据上传到分布式文件系统上并指定文件(hdfs:/Master:8020/hdfs/iflysse_log);
(3)使用Java API查看HDFS文件夹下的内容(hdfs:/Master:8020/hdfs/iflysse_log);
(4)使用Java API查看上传的文件内容(hdfs:/Master:8020/hdfs/iflysse_log);
(5)使用Java API重命名上传的文件 iflysse_cp.log;
(6)使用Java API下载重命名后的文件;
(7)使用Java API删除HDFS上的moodle.iflysse.access.log文件(hdfs://Master:8020/hdfs/iflysse log)。
2、简述MapReduce中Reducer任务的执行过程?
<1>第一种回答
第一阶段是Reduce任务会主动从Mapper任务复制其输出的键值对。Mapper任务可能会有很多,因此Reduce会复制多个Mapper的输出。
第二个阶段是把复制到Reduce本地数据,全部进行合并,即把分散的数据合并成一个大的数据。再对合并的数据排序
第三阶段是对排序后的键值对调用reduce方法,键相等的键值对调用一次reduce方法,每次调用会产生0个或者多个键值对,最后把这些输出的键值对写入HDFS文件中。
<2>第二种回答
执行Reduce任务分成三个阶段:shuffle阶段,merge阶段,Reduce函数处理阶段
(1)shuffle阶段
Reduce启动一个复制线程,根据JobTracker传过来的地址,将对应的映射到自己任务上的数据复制过来
(2)merge阶段
Reduce复制过来的数据会首先放入到内存缓冲区中,当缓冲区中的数据达到一定程度之后会进行内存缓冲区到本地磁盘的merge,实际上也是spill过程。
ps:实际上merge和shuffle是可以同时进行的,即边复制边merge。
(3)Reduce处理
merge之后,会形成一个文件,这个文件可能存放在内存中(文件小),也可能存放在本地磁盘中(文件很大),文件中的数据形式为key-list对,这个文件就是作为reduce函数的输入,文件中有多少个key-list对,就执行多少次reduce函数。
3、请简述MapReduce中partition的作用?
MapReduce中的map输出的数据根据partition来判断不同的key输入到不同的reduce的过程,通过partition,在缺省的情况下默认HashPartitioner,它通过对key取hash值,然后与reduce的数目取模,然后就可以判断该key及对应的valuelist应该去哪个reduce上进行处理。Hadoop将会根据getPartitioner返回的值判断mapper的值将会被发到哪个reducer上,返回值相同的Key/value将会被输出到同一个reducer上。
4、如果没有定义partitioner,那么数据在被送达reducer前是如何被分区的?
Partitioner是在map函数执行context.write()时被调用。用户可以通过实现自定义的Partitioner来控制哪个 key被分配给哪个Reducer。
如果没有自定义的 partitioning,则默认的 partition算法,即根据每一条数据的 key的hashcode,值模运算(%)reduce的数量,得到的数字就是“分区号”
如果没有定义partitioncr,那么会走默认的分区Hashpartitioner。
5、getPartition()三个参数分别是什么?
key、value、分区数
6、numReduceTasks指的是什么?默认值是是多少?
numReduceTasks指的是ReduceTasks的个数,默认值是1。
7、不同类型数据被分到同一个分区,是否会影响输出结果?会影响什么?
不会影响输出结果,会影响执行的性能和开销。
8、combine出现在哪个过程,举例说明什么情况下可以使用combiner,什么情况下不可以?
combiner是发生在map的最后一个阶段,其原理也是一个小型的reducer,主要作用是减少输出到reduce的个数,减少reducer的输入,提高reducer 的执行效率。注意: mapper 的输出为combiner的输入,reducer的输入为combiner的输出。
求平均数的时候就不需要用combiner,因为不会减少reduce执行数量。在其他的时候,可以依据情况,使用combiner,来减少map 的输出数量,减少拷贝到reduce的文件,从而减轻reduce的压力,节省网络开销,提升执行效率。
9、combiner 既然可以汇总,能不能用combiner取代reduce函数?
不可以,虽然combiner可以帮我们减少mapper和reduce之间的数据传输量,对mapper到reduce的数据进行局部汇总,减轻reduce的工作量和减少网络IO,但是我们仍然需要用reduce函数来处理不同map输出的具有相同键的记录。
10、Combiner和 Reducer的区别是什么?
Combiner仅仅只是对map任务汇总,没有进行相关的计算,reduce是参与相关计算的
11、MapReduce的输出文件个数由什么决定?
分区和reduce数目以及block的大小与输出文件的大小
12、MapReduce 中 Mapper数量由什么决定?
key的数量、输入文件的大小、集群资源
13、MapReduce中排序发生在哪几个阶段?这些排序是否可以避免,为什么?
一个 MapReduce 作业由 Map 阶段和 Reduce 阶段两部分组成,这两阶段会对数据排序,从这个意义上说,MapReduce 框架本质就是一个 Distributed Sort。
在 Map 阶段,Map Task 会在本地磁盘输出一个按照 key 排序(采用的是快速排序)的文件(中间可能产生多个文件,但最终会合并成一个),在 Reduce 阶段,每个 Reduce Task 会对收到的数据排序,这样,数据便按照 Key 分成了若干组,之后以组为单位交给 reduce()处理。
很多人的误解在 Map 阶段,如果不使用 Combiner便不会排序,这是错误的,不管你用不用 Combiner,Map Task 均会对产生的数据排序(如果没有 Reduce Task,则不会排序,实际上 Map 阶段的排序就是为了减轻 Reduce端排序负载)。
14、现在有下列这些数据
A:B,C,D,F,E,O
B:A,C,E,K
C:F,A,D,I
D:A,E,F,L
E:B,C,D,M,L
F:A,B,C,D,E,O,M
G:A,C,D,E,F
H:A,C,D,E,O
I:A,O
J:B,O
K:A,C,D
L:D,E,F
M:E,F,G
O:A,H,I,J
在这些数据中,找出有共同好友的users
(1)对于这样一个usr(A),他的好友数 list为(A:B,C,D,F,E,O)
(2)假设有另一个usr©,她的好友数list为(C:A,B,E)
分组如下:
(AB)->(ABCDFEO)
(AC)->(ABCDFEO)
(AD)->(ABCDFEO)
(AF)->(ABCDFEO)
(AE)->(ABCDFEO)
15、某学校现有最近的一次月考数据,需要对数据进行统计分析,需求如下:
数据解释:
数据字段个数不固定:
第一个是课程名称,共四门课程,computer,math,English,algorithm
第二个是学生姓名,后面是每次考试的分数。
统计需求:
1)统计每门课程的参考人数和课程平均分
2)求出每门课程参考学生平均分最高的课程名称:课程和平均分。
解析
第一问:
1)启动环境
2)创建文件
<1>创建student类,重写方法
<2>创造有参无参构造函数
<3>生成个属性的的get、set方法
<4>重写tostring()方法
<5>重写readFields()方法
<6>重写write()方法
3)创建StuMapper类
4)创建StuReducer类
5)运行mapReduce
<1>创建StuMr类
<2>运行
<3>查看效果:这里面被方框包裹着的即是每一个同学的平均分
第二问:
1)整体的框架
2)比较特殊的是Sreducer
<1>求出每一科的成绩综合,num用于计算有多少同学。便于下面求取平局数。
<2>求出这四个科目的最大值的最大值
<3>选取四个科目中最大的部分,这里之所以只有if没有“else if”是因为可能会出现平均分相同的问题,所以每一个科目都需要遍历一遍。
2)运行及查看
16、请简述MapReduce的执行流程?
MapReduce运行的时候,会通过Mapper运行的任务读取HDFS中的数据文件,然后调用自己的方法处理数据,最后输出。Reduce 任务会接受mapper任务输出的数据,作为自己的输入数据,调用自己的方法,最后输出到HDFS的文件中。
一个MapReduce的作业执行流程是:1)代码编写;2)作业配置;3)作业提交;4)Map任务的分配和执行;4)处理中间结果;5)Reduce任务的分配与执行;6)作业完成。
17、题干:某大型电商公司从后台服务器收集到一周的商品消费数据,经过数据清洗得到数据如下表consumption.log,假如你是该公司一员开发工程师,需要你利用Hadoop集群为公司存储、计算、分析这些数据,分析结果。需求如下:
1)每种商品的销售总金额,并降序排序;
2)每种商品销售额最多的三周。
提示:
1.consumption.log部分数据如下(具体样本数据,考试时发放),共8个字段:
week1,A0001,10,20
week1,A0002,8.5,15
week1,A0003,9.2,30
week1,B0001,10.5,50
week2,A0001,11,30
week2,A0002,8,20
week2,A0003,9.2,20
week2,B0001,10,55
答案
第一问:
1)启动环境以及数据上传
<1>启动环境
<2>使用FileZilla软件上传数据
2)实现comsum类
3)实现commapper类
4)实现Commapper类
<1>创建sum哈希表,记录每一个产品的两周的销售额
<2>将sum.entrySet()转换成list重写compare方法降序
<3>累加并传输
5)实现ComMr类
6)运行与查看
<1>运行
<2>查看效果
第二问:
1)实现类:将上一题的代码复制到本题文件下:
<1>修改commapper
<2>修改ComReduce
获取每一个作品每一周的销售量
将获取后的数据进行排序,只取前三条
2)运行与查看效果
<1>运行
<2>查看效果
Hive总结
- 简述Hive排序优化的几种方式及作用范围?
Order by:全局排序;
Sort by:局部排序;
Distribute by:控制map中的输出在reducer中如何划分的
Cluster by:对某一列既想要采用sort by又想采用distribute by,那么可以直接使用cluster by,排序默认只能是升序 - 简述自定义UDF函数的定义步骤?
自定义UDF函数–>重写evaluate自定义方法,并实现相关逻辑–>打包–>jar包加入hive–>创建UDF临时函数并执行临时函数 - 简述Hive的四种常见的数据导入方式?
从本地文件系统中导入数据到hive表---->从HDFS上导入数据到hive表---->从别的表中查询出相应的数据并导入到hive表---->在创建表的时候通过从别的表中查询出相应的记录插入到所创建的表中---->通化sqoop将mysql库导入到hive表。 - 简述Hive的几种常见导出数据方式(至少两种)?
导出到本地文件系统---->导出到HDFS中---->导出到hive的另一个表中---->通过sqoop导出。
Hbase总结
1.简述使用MR从HBase中读取和插入数据需要分别继承哪个类,并简述其作用?
TableMapper和TableReducer;
TableMapper:实现map方法,对HBase表的操作;
TableReducer:实现reduce方法。
2.请简述HBase Admin中常用的基本接口,并简述其作用?
Boolean isMasterRunning():通过这个接口检查master是否正在运行。用户也可以通过客户端程序在实例化HBascAdmin类之前直接调用该接口确实其可以与master通讯
HConnection getConnection():返回连接实例
Configuration getConfiguration():访问创建HBaseAdmin实例时使用到的配置实例,用户可以通过修改这个实例中的变量达到改变HBaseAdminAPL调用时依赖的配置的目的。
close():关闭HBaseAdmin.实例的所有资源,包括与远程服务器的连接。