在公司分享的一次Kylin培训

/ Hadoop / 没有评论 / 52浏览

2018年12月12号,在公司内部给大家带来了一次Kylin技术分享,主要介绍了Hadoop体系,Kylin基本知识,最后进行Kylin流式构建的实战。特此记录。

Hadoop起源与生态

简单介绍Hadoop体系,便于大家对大数据体系有个认识

Hadoop起源

hadoop

Google三篇论文

google paper

Hadoop生态的发展

Hadoop体系

hadoop base

当然,远远不止图上的这些,还有更多的组件一起组成了Hadoop大家庭:

大数据时代的数据分析

Hadoop体系在数据分析领域的所作所为

ETL与数据仓库

通过ETL定时抽取数据(RDBMS)到大数据平台(HDFS/Hive)

很高的延时性,小时/天级别

场景:抽取业务数据到hive进行数据分析,把结果再存到Hive/HBase/RDBMS/NOSQL等

流式的数据分析

通过流式处理,在大数据平台进行数据分析

较低的延时性,分钟/小时级别

场景:日志分析(ELK)、业务分析(Storm/Spark Streaming/Flink + Kafka)把分析结果写入Hive/HBase/RDBMS/NOSQL等

还存在哪些不足呢

补充

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引擎

kylin desc

预计算

事先将各维度组合计算出来,查询时直接拿结果,速度提升百倍。

kylin pre

Cube

维度组合成的数据立方体

kylin cube

基本概念(介绍)

一个简单的案例

以kylin_sales_cube为例,介绍kap中的model、cube。

Kylin流式构建

见ppt