rainit2006 / My_AWS-Cloud

0 stars 0 forks source link

Hive和ORC格式 #3

Open rainit2006 opened 7 years ago

rainit2006 commented 7 years ago

rainit2006 commented 6 years ago

ORC 格式 ORCファイルはHiveの処理に最適化された列指向のファイルフォーマットです。HiveのテーブルデータをORCファイルにするだけで様々な最適化が行われ、クエリの実行速度を大幅に改善することができます。

ORC文件不仅仅是一种列式文件存储格式,最重要的是有着很高的压缩比,并且对于MapReduce来说是可切分(Split)的。因此,在Hive中使用ORC作为表的文件存储格式,不仅可以很大程度的节省HDFS存储资源,而且对数据的查询和处理性能有着非常大的提升,因为ORC较其他文件格式压缩比高,查询任务的输入数据量减少,使用的Task也就减少了。 对性能提升的另一个方面是通过在ORC文件中为每一个字段建立一个轻量级的索引,来判定一个文件中是否满足WHERE子句中的过滤条件。比如:当执行HQL语句”SELECT COUNT(1) FROM lxw1234_orc WHERE id = 0”时候,先从ORC文件的metadata中读取索引信息,快速定位到id=0所在的offsets,如果从索引信息中没有发现id=0的信息,则直接跳过该文件。详见后面介绍。 image

HiveでORCファイルを使うには、まずORC形式で保存するためのテーブルを作成します。作り方はCREATE TABLE時のSTORED句にORCを指定するだけです。以下はsnappy圧縮のORCテーブルを作成しています。

CREATE TABLE table_orc(
    customerID int, name string, age int
) STORED AS ORC tblproperties("orc.compress"="SNAPPY");

次に既存のTEXTフォーマットなどで保存されているテーブルから、INSERT INTO TABLE文で今作ったORCテーブルにINSERTします。 INSERT INTO TABLE table_orc SELECT * FROM table_text;

rainit2006 commented 6 years ago

Java API 写 Hive Orc文件 http://lxw1234.com/archives/2015/08/464.htm

利用Apache的 OrcSerde类和Writable类 把数据转换成ORC格式。

package com.lxw1234.test;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat;
import org.apache.hadoop.hive.ql.io.orc.OrcSerde;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.OutputFormat;
import org.apache.hadoop.mapred.RecordWriter;
import org.apache.hadoop.mapred.Reporter;

/**
 * lxw的大数据田地 -- http://lxw1234.com
 * @author lxw.com
 *
 */
public class TestOrcWriter {

    public static void main(String[] args) throws Exception {       
        JobConf conf = new JobConf();
        FileSystem fs = FileSystem.get(conf);
        Path outputPath = new Path("/tmp/lxw1234/orcoutput/lxw1234.com.orc");
        StructObjectInspector inspector = 
                (StructObjectInspector) ObjectInspectorFactory
                .getReflectionObjectInspector(MyRow.class,
                        ObjectInspectorFactory.ObjectInspectorOptions.JAVA);
        OrcSerde serde = new OrcSerde();
        OutputFormat outFormat = new OrcOutputFormat();
        RecordWriter writer = outFormat.getRecordWriter(fs, conf,
                outputPath.toString(), Reporter.NULL);
        writer.write(NullWritable.get(),
                serde.serialize(new MyRow("张三",20), inspector));
        writer.write(NullWritable.get(),
                serde.serialize(new MyRow("李四",22), inspector));
        writer.write(NullWritable.get(),
                serde.serialize(new MyRow("王五",30), inspector));
        writer.close(Reporter.NULL);
        fs.close();
        System.out.println("write success .");
    }

    static class MyRow implements Writable {
        String name;
        int age;

        MyRow(String name,int age){
            this.name = name;
            this.age = age;
        }
        @Override
        public void readFields(DataInput arg0) throws IOException {
            throw new UnsupportedOperationException("no write");
        }
        @Override
        public void write(DataOutput arg0) throws IOException {
            throw new UnsupportedOperationException("no read");
        }

    }

}

将上面的程序打包成orc.jar,上传至Hadoop客户端机器,

执行命令:

export HADOOP_CLASSPATH=/usr/local/apache-hive-0.13.1-bin/lib/hive-exec-0.13.1.jar:$HADOOP_CLASSPATH

hadoop jar orc.jar com.lxw1234.test.TestOrcWriter

执行成功后,在HDFS上查看该文件:

[liuxiaowen@dev tmp]$ hadoop fs -ls /tmp/lxw1234/orcoutput/
Found 1 items
-rw-r--r--   2 liuxiaowen supergroup        312 2015-08-18 18:09 /tmp/lxw1234/orcoutput/lxw1234.com.orc

在Hive中建立外部表,路径指向该目录,并设置文件格式为ORC:

CREATE EXTERNAL TABLE lxw1234(
name STRING,
age INT
) stored AS ORC 
location '/tmp/lxw1234/orcoutput/';

在Hive中查询该表数据:

hive> desc lxw1234;
OK
name                    string                                      
age                     int                                         
Time taken: 0.148 seconds, Fetched: 2 row(s)
hive> select * from lxw1234;
OK
张三    20
李四    22
王五    30
Time taken: 0.1 seconds, Fetched: 3 row(s)
hive> 
rainit2006 commented 6 years ago

数据仓库和数据库 数据库:传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。 数据仓库:数据仓库系统的主要应用主要是OLAP(On-Line Analytical Processing),支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。

一般需要 3-5 年左右的时间,随着业务指数级的增长,数据量的会陡增,公司角色也开始多了起来,开始有了 CEO、CMO、CIO,大家需要面临的问题越来越复杂,越来越深入。高管们关心的问题,从最初非常粗放的:“昨天的收入是多少”、“上个月的 PV、UV 是多少”,逐渐演化到非常精细化和具体的用户的集群分析,特定用户在某种使用场景中,例如“20~30岁女性用户在过去五年的第一季度化妆品类商品的购买行为与公司进行的促销活动方案之间的关系”。

这类非常具体,且能够对公司决策起到关键性作用的问题,基本很难从业务数据库从调取出来。 原因在于: 业务数据库中的数据结构是为了完成交易而设计的,不是为了而查询和分析的便利设计的。 业务数据库大多是读写优化的,即又要读(查看商品信息),也要写(产生订单,完成支付)。 因此对于大量数据的读(查询指标,一般是复杂的只读类型查询)是支持不足的。 而怎么解决这个问题,此时我们就需要建立一个数据仓库了,公司也算开始进入信息化阶段了。 数据仓库的作用在于:数据结构为了分析和查询的便利; 只读优化的数据库,即不需要它写入速度多么快,只要做大量数据的复杂查询的速度足够快就行了

数据库 比较流行的有:MySQL, Oracle, SqlServer等 数据仓库 比较流行的有:AWS Redshift, Greenplum, Hive等


Hive和HBase的区别 Hbase: Hadoop database 的简称,也就是基于Hadoop数据库,是一种NoSQL数据库,主要适用于海量明细数据(十亿、百亿)的随机实时查询,如日志明细、交易清单、轨迹行为等。 image

Hive:Hive是Hadoop数据仓库,严格来说,不是数据库,主要是让开发人员能够通过SQL来计算和处理HDFS上的结构化数据,适用于离线的批量数据计算。

通过元数据来描述Hdfs上的结构化文本数据,通俗点来说,就是定义一张表来描述HDFS上的结构化文本,包括各列数据名称,数据类型是什么等,方便我们处理数据,当前很多SQL ON Hadoop的计算引擎均用的是hive的元数据,如Spark SQL、Impala等;基于第一点,通过SQL来处理和计算HDFS的数据,Hive会将SQL翻译为Mapreduce来处理数据;

在大数据架构中,Hive和HBase是协作关系,数据流一般如下图: -- 通过ETL工具将数据源抽取到HDFS存储; -- 通过Hive清洗、处理和计算原始数据; -- HIve清洗处理后的结果,如果是面向海量数据随机查询场景的可存入Hbase 数据应用从HBase查询数据; image

  1. Hive中的表是纯逻辑表,就只是表的定义等,即表的元数据。Hive本身不存储数据,它完全依赖HDFS和MapReduce。这样就可以将结构化的数据文件映射为为一张数据库表,并提供完整的SQL查询功能,并将SQL语句最终转换为MapReduce任务进行运行。 而HBase表是物理表,适合存放非结构化的数据。
  2. Hive是基于MapReduce来处理数据,而MapReduce处理数据是基于行的模式;HBase处理数据是基于列的而不是基于行的模式,适合海量数据的随机访问。
  3. HBase的表是疏松的存储的,因此用户可以给行定义各种不同的列;而Hive表是稠密型,即定义多少列,每一行有存储固定列数的数据。
  4. Hive使用Hadoop来分析处理数据,而Hadoop系统是批处理系统,因此不能保证处理的低迟延问题;而HBase是近实时系统,支持实时查询。
  5. Hive不提供row-level的更新,它适用于大量append-only数据集(如日志)的批任务处理。而基于HBase的查询,支持和row-level的更新。
  6. Hive提供完整的SQL实现,通常被用来做一些基于历史数据的挖掘、分析。而HBase不适用与有join,多级索引,表关系复杂的应用场景。

OLAP 和 OLTP

このOLTPデータベースは、日々増えてくデータを確実に登録し、小さいサイズのデータ取得依頼に対し迅速に応える事に特化しています。また、大量に発生する読書きアクセスに対して同時で実行する機能を持っています。一般的なECサイトやソーシャルゲーム、社内システムではOLTPデータベースであることが多く、データベースの商品名ではORACLEデータベースなどが有名です。

image

OLAP的基本操作 OLAP的操作是以查询——也就是数据库的SELECT操作为主,但是查询可以很复杂,比如基于关系数据库的查询可以多表关联,可以使用COUNT、SUM、AVG等聚合函数。OLAP正是基于多维模型定义了一些常见的面向分析的操作类型是这些操作显得更加直观。 OLAP的多维分析操作包括:钻取(Drill-down)、上卷(Roll-up)、切片(Slice)、切块(Dice)以及旋转(Pivot) image image

rainit2006 commented 6 years ago

CUBE 操作 https://technet.microsoft.com/ja-jp/library/ms175939(v=sql.90).aspx CUBE 操作は、SELECT ステートメントの GROUP BY 句で指定されます。選択リストには、ディメンション列と集計関数式が格納されます。GROUP BY 句により、ディメンション列と WITH CUBE キーワードが指定されます。結果セットには、各ディメンション列の値のすべての可能な組み合わせが、その組み合わせに対応した行の集計値と共に格納されます。

たとえば、Inventory という単純なテーブルに次のエントリが格納されているとします。 image 次のクエリでは、Item と Color の可能なすべての組み合わせについて、それぞれの Quantity の小計を含む結果セットが返されます。

SELECT Item, Color, SUM(Quantity) AS QtySum
FROM Inventory
GROUP BY Item, Color WITH CUBE

以下に結果セットを示します。 image 下記の行は、Item ディメンションの値として Chair を持つすべての行の小計を示しています。Color ディメンションの値として返される null は、この行によって報告された集計値が、Color ディメンションの値に基づいていないことを示しています。 image

使用 GROUPING 区分空值 如果列中的值来自事实数据,则 GROUPING 函数返回 0;如果列中的值是 CUBE 操作所生成的 NULL,则返回 1。在 CUBE 操作中,所生成的 NULL 代表全体值。可将 SELECT 语句写成使用 GROUPING 函数将所生成的 NULL 替换为字符串 ALL。

SELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL'
ELSE ISNULL(Item, 'UNKNOWN')
END AS Item,
CASE WHEN (GROUPING(Color) = 1) THEN 'ALL'
ELSE ISNULL(Color, 'UNKNOWN')
END AS Color,
SUM(Quantity) AS QtySum
FROM Inventory
GROUP BY Item, Color WITH CUBE

多维数据集 CUBE 运算符可用于生成 n 维的多维数据集,即具有任意维数的多维数据集。只有一个维度的多维数据集可用于生成合计,例如:

SELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL'
            ELSE ISNULL(Item, 'UNKNOWN')
       END AS Item,
       SUM(Quantity) AS QtySum
FROM Inventory
GROUP BY Item WITH CUBE
GO
rainit2006 commented 6 years ago

数据库中视图的作用 视图是从一个或几个基本表(或视图)导出的表。它与基本表不同,是一个虚表。数据库只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。所以基本表中的数据发生变化,从视图中查询出的数据也就随之改变了。从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化。

合理地使用视图能够带来许多好处:

  1. 视图能简化用户操作
  2. 视图使用户能以多种角度看待同一数据 ........ http://blog.csdn.net/fm0517/article/details/5625949
rainit2006 commented 6 years ago

Apache Kylin kylin是一款开源的分布式数据分析工具,基于hadoop之上的sql查询接口,能支持超大规模的数据分析。响应时间在亚秒级别,其核心是预计算,计算结果存放在hbase中。

预计算 对于超大数据集的复杂查询,既然现场计算需要花费较长时间,那么根据空间换时间的原理,我们就可以提前将所有可能的计算结果计算并存储下来,从而实现超大数据集的秒级多维分析查询.

Kylin的预计算是如何实现的 将数据源Hive表中的数据按照指定的维度和指标 由计算引擎MapReduce离线计算出所有可能的查询结果(即Cube)存储到HBase中。