- hive的计算是通过什么实现的
hive是搭建在Hadoop集群上的一个SQL引擎,它将SQL语句转化成了MapReduce程序在Hadoop上运行,所以hive的计算引擎是MapReduce,底层存储采用的是HDFS。
- 为什么不用Java的序列化serilazable
Java的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校验信息,header,继承体系等),不便于在网络中高效传输。所以,hadoop自己开发了一套序列化机制(Writable),特点如下:
1.紧凑
紧凑的格式能让我们充分利用网络带宽,而带宽是数据中心最稀缺的资源
2.快速
进程通信形成了分布式系统的骨架,所以需要尽量减少序列化和反序列化的性能开销,这是基本的;
3.可扩展
协议为了满足新的需求变化,所以控制客户端和服务器过程中,需要直接引进相应的协议,这些是新协议,原序列化方式能支持新的协议报文;
4.互操作
能支持不同语言写的客户端和服务端进行交互;
- MapReduce工作流程
1>输入分片(input split):在进行map计算之前,mapreduce会根据输入文件计算输入分片(input split),每个输入分片(input split)针对一个map任务,输入分片(input split)存储的并非数据本身,而是一个分片长度和一个记录数据的位置的数组,输入分片(input split)往往和hdfs的block(块)关系很密切,假如我们设定hdfs的块的大小是64mb,如果我们输入有三个文件,大小分别是3mb、65mb和127mb,那么mapreduce会把3mb文件分为一个输入分片(input split),65mb则是两个输入分片(input split)而127mb也是两个输入分片(input split),换句话说我们如果在map计算前做输入分片调整,例如合并小文件,那么就会有5个map任务将执行,而且每个map执行的数据大小不均,这个也是mapreduce优化计算的一个关键点。
2>map阶段:就是我们写的map函数,map函数效率相对好控制,而且一般map操作都是本地化操作也就是在数据存储节点上进行;map函数每次处理一行数据,map主要用于数据的分组,为下一步reduce的运算做数据准备,map的输出就是reduce的输入。
3>combiner阶段:combiner阶段是可选的,combiner是一个本地化的reduce操作,它是map运算的后续操作,主要是在map计算出中间文件前做一个简单的合并重复key值的操作,使传入reduce的文件变小,这样就提高了宽带的传输效率,毕竟hadoop计算力宽带资源往往是计算的瓶颈也是最为宝贵的资源,但是combiner操作是有风险的,使用它的原则是combiner的输入不会影响到reduce计算的最终输入,例如:如果计算只是求总数,最大值,最小值可以使用combiner,但是做平均值计算使用combiner的话,最终的reduce计算结果就会出错。
4>Partitioner阶段,一个Partitioner对应一个reduce作业,如果我们mapreduce操作只有一个reduce操作,那么Partitioner就只有一个,Partitioner因此就是reduce的输入分片,这个我们可以编程控制,主要是根据实际key和value的值,根据实际业务类型或者为了更好的reduce负载均衡要求进行,这是提高reduce效率的一个关键所在。
5>reduce阶段:我们编写的reduce函数,reduce的输入是map的输出,reduce是主要的逻辑运算阶段,我们绝大部分业务逻辑都是在reduce阶段完成的,并把最终结果存储在hdfs上的。
- 如何决定一一个job中需要多少个maptask和reducetask ?
一、影响map个数,即split个数的因素主要有:
1)HDFS块的大小,即HDFS中dfs.block.size的值。如果有一个输入文件为1024m,当块为256m时,会被划分为4个split;当块为128m时,会被划分为8个split。
2)文件的大小。当块为128m时,如果输入文件为128m,会被划分为1个split;当块为256m,会被划分为2个split。
3)文件的个数。FileInputFormat按照文件分割split,并且只会分割大文件,即那些大小超过HDFS块的大小的文件。如果HDFS中dfs.block.size设置为64m,而输入的目录中文件有100个,则划分后的split个数至少为100个。
4)splitsize的大小。分片是按照splitszie的大小进行分割的,一个split的大小在没有设置的情况下,默认等于hdfs block的大小。但应用程序可以通过两个参数来对splitsize进行调节。
map个数的计算公式如下:
splitsize=max(minimumsize,min(maximumsize,blocksize))。
如果没有设置minimumsize和maximumsize,splitsize的大小默认等于blocksize
二、reduce端的个数取决于用户的需求,默认是有一个reduce,可以在代码中声明【由分区决定】
reduce的输出个数
- 手写Word Count的Mapper和Reducer
public static class WCMapper extends Mapper<LongWritable, Text,Text, IntWritable>{
Text k1 = new Text();
IntWritable v1 = new IntWritable(1);
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
String[] strings = line.split("\\s+");
for (String s : strings) {
k1.set(s);
context.write(k1,v1);
}
}
}
public static class WCReducer extends Reducer<Text, IntWritable,Text, IntWritable> {
int count;
IntWritable v2 = new IntWritable();
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
count = 0;
for (IntWritable value : values) {
count += value.get();
}
v2.set(count);
context.write(key,v2);
}
}
- hive内部表和外部表的区别?
分别从创建和删除两方面说:
创建:
外部表需要使用external关键字指定,需要使用location指定存储数据的位置
内部表不需要指定数据存储的路径,直接将数据存储在默认的目录下
删除:
外部表的数据由hdfs管理,元数据由hive管理,删除的时候只删除元数据,不删除表数据
内部表的数据和元数据均有hive来管理,删除的时候全部删除
- hive的元数据和存储引|擎
元数据包括表的名字,列、分区,目录等其他属性信息,存储在存储引擎中。
默认使用Derby数据库,缺点:一次只能打开一个会话。
可以使用MySQL,优点:允许多用户访问。
- 请谈- - -下hive的特点是什么? hive和RDBMS有什么异同?
hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
数据库:用户与数据库交互,提交 SQL 语句后,马上见到执行结果;存放业务数据;数据库提出范式的概念是为了解决数据冗余和耦合的问题;数据库给业务数据提供存储支撑。
数据仓库:不与用户交互;存放历史数据;反范式设计,专门引入冗余数据,保证数据完整。数据仓库面向分析,里面存放的数据用来做分析和挖掘
- Hive数据倾斜原因
key分布不均匀
业务数据本身的特性
SQL语句造成数据倾斜
- 从架构设计、部署方式、使用方法、应用场景等方面,比较tfs、hdfs、fastdfs、 Tachyon的异同。