2018年12月12号,在公司内部给大家带来了一次Kylin技术分享,主要介绍了Hadoop体系,Kylin基本知识,最后进行Kylin流式构建的实战。特此记录。
Hadoop起源与生态
简单介绍Hadoop体系,便于大家对大数据体系有个认识
Hadoop起源
Google三篇论文
Hadoop生态的发展
- 2008 – Hadoop创造了1Tb数据排序的世界纪录( 成绩是209秒,打破之前297秒的纪录)
- 2010 - Hadoop子项目HBase, Hive 和Pig完成,为Hadoop生态圈提供更强大能力
- 2011 - ZooKeeper发布
- 2013 – 基于Yarn的Hadoop 2.0 发布
- 2014 – Spark成为Apache顶级项目
Hadoop体系
当然,远远不止图上的这些,还有更多的组件一起组成了Hadoop大家庭:
- MQ(Kafka)
- 计算引擎(Impala、Presto)
- 流处理(Storm、Flink)
- indexes(Solr、ES)
- 权限(Kerberos、Ranger)
- 元数据(Atlas、Metrics)
- 可视化UI集成(Hue、Zeppelin)
- ...
大数据时代的数据分析
Hadoop体系在数据分析领域的所作所为
ETL与数据仓库
通过ETL定时抽取数据(RDBMS)到大数据平台(HDFS/Hive)
很高的延时性,小时/天级别
场景:抽取业务数据到hive进行数据分析,把结果再存到Hive/HBase/RDBMS/NOSQL等
流式的数据分析
通过流式处理,在大数据平台进行数据分析
较低的延时性,分钟/小时级别
场景:日志分析(ELK)、业务分析(Storm/Spark Streaming/Flink + Kafka)把分析结果写入Hive/HBase/RDBMS/NOSQL等
还存在哪些不足呢
-
要编写MR、Spark程序,门槛较高
举个例子
-
查询缓慢,不能交互访问(Hive、Spark SQL、Presto、Impala)
举个例子
-
BI工具的局限
补充
MR程序
public class WordCount {
public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
@Override
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// 一行数据
String line = value.toString();
// 分割成单词,每个单词的value赋值为1
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken());
// 通过上下文将结果输出,作为Reduce的输入
context.write(word, one);
}
}
}
public static class Reduce extends Reducer<Text, IntWritable, Text, LongWritable> {
@Override
public void reduce(Text key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException {
long sum = 0;
for (IntWritable val : values) {
// 累计单词出现的次数
sum += val.get();
}
// 通过上下文将结果输出
context.write(key, new LongWritable(sum));
}
}
public static void main(String[] args) throws Exception {
// 创建Configuration
Configuration conf = new Configuration();
// 创建Job
Job job = Job.getInstance(conf, "wordCount");
// 设置job的处理类
job.setJarByClass(WordCount.class);
// 设置作业的输入路径
FileInputFormat.addInputPath(job, new Path(args[0]));
// 设置Map相关的参数(主类、输出的key/value类型)
job.setMapperClass(Map.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
// 设置Reduce相关参数(主类、输出的key/value类型)
job.setReducerClass(Reduce.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class);
// 设置作业的输出路径
FileOutputFormat.setOutputPath(job, new Path(args[1]));
// 提交作业,等待完成
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
可以看到,MR程序成吨成吨写
Spark程序
object WordCountApp {
def main(args: Array[String]): Unit = {
// 创建SparkContext
val conf = new SparkConf().setAppName("WordCountApp").setMaster("local[2]")
val sc = new SparkContext(conf)
// word count
sc.textFile("/user/hue/sparkcode/wordCountInput/data.txt")
.flatMap(_.split(" "))
.map((_, 1))
.reduceByKey(_ + _)
.saveAsTextFile("/user/hue/sparkcode/wordCountResult")
}
}
Spark代码简化不少,可还是要写不少代码
SQL
select word, sum(counter) from words group by word
更希望写个sql完成数据分析~
一些不足
虽然Hive、Spark SQL、Presto等可以写SQL进行数据分析,但是无法做到秒级响应。
Kylin
Apache Kylin是一个开源的分布式的大数据分析引擎,基于Hadoop 提供多维OLAP分析能力,支持SQL接口,查询千亿数据秒级返回, 比Hive快1000倍。
定位
超大数据OLAP引擎
预计算
事先将各维度组合计算出来,查询时直接拿结果,速度提升百倍。
Cube
维度组合成的数据立方体
基本概念(介绍)
-
数据源(Hive、Kafka)
-
model(维度、度量)
事实表、维表。一张大宽表,数据量较小的维表。
星型模型、雪花模型、事实星座(打平成宽表)
-
cube(怎么样去组合这些维度、度量)
维度:
分析数据的角度,如时间,地点
度量:
测量的数据,如用户数,销售额
SQL中的维度和度量:
Group By, Where Condition => 维度
Count(), SUM(), Max()...=> 度量
-
cube 优化
维度爆炸
2 ^ n
例如A、B、C三者组合:
ABC AB AC BC A B C 0
优化手段:
衍生维度(PK推导)
聚合组(2 ^
N + M + L
—> 2 ^ N + 2 ^ M + 2 ^ L) 必须维度(减少为原来的1/2)
层级维度(M个维度的组合数,将从2M减少为M + 1)
组合维度(M个维度使用joint,可以将计算组合数从2M减少为2)
rowkeys
一个简单的案例
以kylin_sales_cube为例,介绍kap中的model、cube。
Kylin流式构建
见ppt
本文由 xinQing 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:
2018/12/15 03:59