Open rainit2006 opened 7 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的信息,则直接跳过该文件。详见后面介绍。
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;
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>
数据仓库和数据库 数据库:传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。 数据仓库:数据仓库系统的主要应用主要是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数据库,主要适用于海量明细数据(十亿、百亿)的随机实时查询,如日志明细、交易清单、轨迹行为等。
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查询数据;
OLAP 和 OLTP
このOLTPデータベースは、日々増えてくデータを確実に登録し、小さいサイズのデータ取得依頼に対し迅速に応える事に特化しています。また、大量に発生する読書きアクセスに対して同時で実行する機能を持っています。一般的なECサイトやソーシャルゲーム、社内システムではOLTPデータベースであることが多く、データベースの商品名ではORACLEデータベースなどが有名です。
OLAP的基本操作 OLAP的操作是以查询——也就是数据库的SELECT操作为主,但是查询可以很复杂,比如基于关系数据库的查询可以多表关联,可以使用COUNT、SUM、AVG等聚合函数。OLAP正是基于多维模型定义了一些常见的面向分析的操作类型是这些操作显得更加直观。 OLAP的多维分析操作包括:钻取(Drill-down)、上卷(Roll-up)、切片(Slice)、切块(Dice)以及旋转(Pivot)
CUBE 操作 https://technet.microsoft.com/ja-jp/library/ms175939(v=sql.90).aspx CUBE 操作は、SELECT ステートメントの GROUP BY 句で指定されます。選択リストには、ディメンション列と集計関数式が格納されます。GROUP BY 句により、ディメンション列と WITH CUBE キーワードが指定されます。結果セットには、各ディメンション列の値のすべての可能な組み合わせが、その組み合わせに対応した行の集計値と共に格納されます。
たとえば、Inventory という単純なテーブルに次のエントリが格納されているとします。 次のクエリでは、Item と Color の可能なすべての組み合わせについて、それぞれの Quantity の小計を含む結果セットが返されます。
SELECT Item, Color, SUM(Quantity) AS QtySum
FROM Inventory
GROUP BY Item, Color WITH CUBE
以下に結果セットを示します。 下記の行は、Item ディメンションの値として Chair を持つすべての行の小計を示しています。Color ディメンションの値として返される null は、この行によって報告された集計値が、Color ディメンションの値に基づいていないことを示しています。
使用 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
数据库中视图的作用 视图是从一个或几个基本表(或视图)导出的表。它与基本表不同,是一个虚表。数据库只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。所以基本表中的数据发生变化,从视图中查询出的数据也就随之改变了。从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化。
合理地使用视图能够带来许多好处:
Apache Kylin kylin是一款开源的分布式数据分析工具,基于hadoop之上的sql查询接口,能支持超大规模的数据分析。响应时间在亚秒级别,其核心是预计算,计算结果存放在hbase中。
预计算 对于超大数据集的复杂查询,既然现场计算需要花费较长时间,那么根据空间换时间的原理,我们就可以提前将所有可能的计算结果计算并存储下来,从而实现超大数据集的秒级多维分析查询.
Kylin的预计算是如何实现的 将数据源Hive表中的数据按照指定的维度和指标 由计算引擎MapReduce离线计算出所有可能的查询结果(即Cube)存储到HBase中。