博客

学院

下载

GitChat

论坛

问答

商城

VIP

活动

招聘

ITeye

码云

CSTO

 写博客

 发Chat

登录 注册

4-Druid数据摄入-1

翻译

2017年11月19日 12:06:50

标签:

Druid

.

.

一、数据格式

【1】Data Formats http://druid.io/docs/0.10.1/ingestion/data-formats.html (1)摄入规范化数据:JSON、CSV、TSV (2)自定义格式 Regex parser or the JavaScript parsers 来解析数据 (3)其他格式 http://druid.io/docs/0.10.1/development/extensions.html 【2】Configuration 对数据格式进行配置dataSchema中的parseSpec字段 具体见: http://druid.io/docs/0.10.1/ingestion/data-formats.html

二、数据schema

主要是摄入的规则ingestion Spec 摄入规则主要包含3个部分

{

“dataSchema”

:

{ … },

“ioConfig”

:

{ … },

“tuningConfig”

:

{ … }

}

Field

Type

Description

Required

dataSchema

JSON Object

标识摄入数据的schema,不同specs可共享

yes

ioConfig

JSON Object

标识data从哪来,到哪去。根据不同的ingestion method不同

yes

tuningConfig

JSON Object

标识如何调优不同的ingestion parameters。根据不同的ingestion method不同

no

DataSchema

“dataSchema”

:

{

“dataSource”

:

“wikipedia” ,

“parser”

:

{

“type”

:

“string” ,

“parseSpec”

:

{

“format”

:

“json” ,

“timestampSpec”

:

{

“column”

:

“timestamp” ,

“format”

:

“auto”

},

“dimensionsSpec”

:

{

“dimensions” :

[

“page” ,

“language” ,

“user” ,

“unpatrolled” ,

“newPage” ,

“robot” ,

“anonymous” ,

“namespace” ,

“continent” ,

“country” ,

“region” ,

“city” ,

{

“type” :

“long” ,

“name” :

“countryNum”

},

{

“type” :

“float” ,

“name” :

“userLatitude”

},

{

“type” :

“float” ,

“name” :

“userLongitude”

}

],

“dimensionExclusions”

:

[],

“spatialDimensions”

:

[]

}

}

},

“metricsSpec”

:

[{

“type”

:

“count” ,

“name”

:

“count”

},

{

“type”

:

“doubleSum” ,

“name”

:

“added” ,

“fieldName”

:

“added”

},

{

“type”

:

“doubleSum” ,

“name”

:

“deleted” ,

“fieldName”

:

“deleted”

},

{

“type”

:

“doubleSum” ,

“name”

:

“delta” ,

“fieldName”

:

“delta”

}],

“granularitySpec”

:

{

“segmentGranularity”

:

“DAY” ,

“queryGranularity”

:

“NONE” ,

“intervals”

:

[

“2013-08-31/2013-09-01”

]

}

}

Field

Type

Description

Required

dataSource

String

要摄入的datasource名称,Datasources可看做为表

yes

parser

JSON Object

ingested data如何解析

yes

metricsSpec

JSON Object array

aggregators 器列表

yes

granularitySpec

JSON Object

如何建立.segments,如何上卷数据

yes

Parser

“parser”

:

{

“type”

:

“string” ,

“parseSpec”

:

{

“format”

:

“json” ,

“timestampSpec”

:

{

“column”

:

“timestamp” ,

“format”

:

“auto”

},

“dimensionsSpec”

:

{

“dimensions” :

[

“page” ,

“language” ,

“user” ,

“unpatrolled” ,

“newPage” ,

“robot” ,

“anonymous” ,

“namespace” ,

“continent” ,

“country” ,

“region” ,

“city” ,

{

“type” :

“long” ,

“name” :

“countryNum”

},

{

“type” :

“float” ,

“name” :

“userLatitude”

},

{

“type” :

“float” ,

“name” :

“userLongitude”

}

],

“dimensionExclusions”

:

[],

“spatialDimensions”

:

[]

}

}

}

type 默认为string,其他数据格式见: extensions list .

String Parser

Field

Type

Description

Required

type

String

一般为string,或在Hadoop indexing job中使用hadoopyString

no

parseSpec

JSON Object

标识格式format和、imestamp、dimensions

yes

ParseSpec

两个功能:

String Parser用parseSpec判定将要处理rows的数据格式( JSON, CSV, TSV) 所有的Parsers 用parseSpec判定将要处理rows的 timestamp 和 dimensionsAll format字段默认为tsv格式

JSON ParseSpec

Field

Type

Description

Required

format

String

json .

no

timestampSpec

JSON Object

timestamp的列和format

yes

dimensionsSpec

JSON Object

数据的dimensions

yes

flattenSpec

JSON Object

标识嵌套JSON如何打平的配置,详见 Flattening JSON

no

JSON Lowercase ParseSpec

将输入的JSON数据小写处理

Field

Type

Description

Required

format

String

T jsonLowercase .

yes

timestampSpec

JSON Object

timestamp的列和format

yes

dimensionsSpec

JSON Object

数据的dimensions

yes

CSV ParseSpec

使用String Parser 加载CSV,Strings用net.sf.opencsv library. parsed

Field

Type

Description

Required

format

String

csv .

yes

timestampSpec

JSON Object

timestamp的列和format

yes

dimensionsSpec

JSON Object

数据的dimensions

yes

listDelimiter

String

多值dimensions的分割符

no (default == ctrl+A)

columns

JSON array

数据列

yes

TimestampSpec

Field

Type

Description

Required

column

String

timestamp的列

yes

format

String

iso, millis, posix, auto or any Joda time format.

no (default == ‘auto’

DimensionsSpec

Field

Type

Description

Required

dimensions

JSON array

dimension schema 对象或dimension names,标识维度列,否则将timestamp列外的所以string列作为维度列

yes

dimensionExclusions

JSON String array

ingestion之外的dimensions

no (default == []

spatialDimensions

JSON Object array

spatial dimensions

no (default == []

Dimension Schema

dimension schema标识要摄入dimension的type和name,不特殊标识type时为string

“dimensionsSpec”

:

{

“dimensions” :

[

“page” ,

“language” ,

“user” ,

“unpatrolled” ,

“newPage” ,

“robot” ,

“anonymous” ,

“namespace” ,

“continent” ,

“country” ,

“region” ,

“city” ,

{

“type” :

“long” ,

“name” :

“countryNum”

},

{

“type” :

“float” ,

“name” :

“userLatitude”

},

{

“type” :

“float” ,

“name” :

“userLongitude”

}

],

“dimensionExclusions”

:

[],

“spatialDimensions”

:

[]

}

GranularitySpec

“granularitySpec”

:

{

“segmentGranularity”

:

“DAY” ,

“queryGranularity”

:

“NONE” ,

“intervals”

:

[

“2013-08-31/2013-09-01”

]

}

granularity spec 默认是uniform,可以通过type字段配置,目前支持uniform和 arbitrary types

Uniform Granularity Spec

标识uniform intervals.

Field

Type

Description

Required

segmentGranularity

string

建立segments的周期

no (default == ‘DAY’)

queryGranularity

string

可query结果的最小granularity,数据已这个granularity在segment中granularity

例如: “minute” 说明 data已分钟级别的granularity聚合,也就是当 (minute(timestamp), dimensions)

tuple中有collisions时,将用aggregators聚合值,而不是对各个rows排序

no (default == ‘NONE’)

rollup

boolean

rollup or not

no (default == true)

intervals

string

raw data摄入的intervals列表,对于real-time摄取忽略

yes for batch, no for real-time

Arbitrary Granularity Spec

按照segments的大小决定intervals,不支持real-time

Field

Type

Description

Required

queryGranularity

string

同上

no (default == ‘NONE’)

rollup

boolean

rollup or not

no (default == true)

intervals

string

同上

yes for batch, no for real-time

三、Schema Design

Druid将规范化后的数据分为3类:a timestamp, a dimension, or a measure (or a metric/aggregator as they are known in Druid).

更多信息:

Timestamp每行必须,数据以时间分区,每个query有一个时间filter ,Query results 可以用时间分桶( minutes, hours, days, and so on) Dimensions可以filtered或者grouped by,一般是单Strings,Strings数组,单Longs,单Floats Metrics可以aggregated,可排序 一般生产tables(datasources)少于100个维度列,100个metrics

Numeric dimensions

数据类型的维度 (Long or Float) 必须在dimensionsSpec中标识,否则默认是字符串,数值型列在group时快,但由于没有索引在过滤时慢, Dimension Schema .

High cardinality dimensions (e.g. unique IDs)

实际中count-distinct不需要,对IDs列排序将杀掉 roll-up ,影响压缩,再aggregations带着排序的IDS,增加性能减少存储,Druid’s hyperUnique aggregator 基于Hyperloglog, here .

Nested dimensions

不支持嵌套维度,下面

{“foo”:{“bar”: 3}}

在索引前转化为:

{“foo_bar”: 3}

Counting the number of ingested events

count aggregator 在数据摄入阶段计算摄入的数据量,在查询时用 longSum aggregator.,根据这个计算结果决定roll-up 的速率

ingestion spec:

… “metricsSpec” : [ { “type” : “count”, “name” : “count” }, … :

按照如下查询摄入的量

… “aggregations”: [ { “type”: “longSum”, “name”: “numIngestedEvents”, “fieldName”: “count” }, …

Schema-less dimensions

dimensions在spec缺失时,所有非timestamp 的列作为string型作为维度

Including the same column as a dimension and a metric

一个列作为维度,同时由于去重计算需要,也作为hyperUnique,作为metric,这需要在ETL组织时就增加出来,

ETL中复制一列=:

{“device_id_dim”:123, “device_id_met”:123}

在metricsSpec :

{ “type” : “hyperUnique”, “name” : “devices”, “fieldName” : “device_id_met” }

device_id_dim 自动作为维度

四、Schema Changes

datasources可以在任何时间改变,支持segments中存在不同的schemas

Replacing Segments

segments标识:datasource, interval, version, and partition number.partition number只在同一个granularity产生多个segments时可见,如hourly segments,在一个小时中的数据量超出一个segment存储范围,同一小时产生多个segments,以partition number区分

foo_2015-01-01/2015-01-02_v1_0 foo_2015-01-01/2015-01-02_v1_1 foo_2015-01-01/2015-01-02_v1_2

dataSource = foo, interval = 2015-01-01/2015-01-02, version = v1, partitionNum = 0. 如果此时用新的schema索引数据,新产生的segment有更高的version id。

foo_2015-01-01/2015-01-02_v2_0 foo_2015-01-01/2015-01-02_v2_1 foo_2015-01-01/2015-01-02_v2_2

Druid是批量构建索引的(either Hadoop-based or IndexTask-based),保证interval-by-interval间的原子性更新,例如直到 2015-01-01/2015-01-02 间隔内的 v2 segments加载到集群中后吗,queries才不再使用 v1 segments,此时v1从集群中卸载。

updates是夸过个segment的,指示在每个interval内是原子性的,不是整个更新的如下:

foo_2015-01-01/2015-01-02_v1_0 foo_2015-01-02/2015-01-03_v1_1 foo_2015-01-03/2015-01-04_v1_2

v2 segments 完全更新前,混存:

foo_2015-01-01/2015-01-02_v1_0 foo_2015-01-02/2015-01-03_v2_1 foo_2015-01-03/2015-01-04_v1_2

此时的查询可以命中V1和V2的混合

In this case, queries may hit a mixture of v1 and v2 segments.

Different Schemas Among Segments

datasource的segments可以有不同的schemas,如果一个stringcolumn (dimension) 在一个segment A中存在,另一个B不存在,认为B中该维度为null。对于numeric column,Aggregations跳过这条

 目前您尚未登录,请 登录 或 注册 后进行评论

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

hjw199089

.

原创

115

粉丝

13

喜欢

7

评论

3

.

等级:

访问量:

6万+

积分:

2143

排名:

2万+

.

博主最新文章

更多文章

.

Calcite-[1]-Tutorial-2

.

Hive和sparksql中的dayofweek

.

Presto-[16]-Presto UDFs开发

.

数据资产与驱动基石

.

好书推荐-Designing Data-Intensive Applications

.

.

文章分类

[1]Hive

13篇

.

[2]Tools

8篇

.

[3]Spark

31篇

.

[4]Scala

3篇

.

[5]Mysql

2篇

.

[6]sparkMLib

5篇

.

[7]python

3篇

.

[8]Hadoop

7篇

.

[9]Java

15篇

.

[10]book-favorite

4篇

.

[11]设计模式

5篇

.

[12]Kafka

3篇

.

[13]spark streaming

13篇

.

[14]storm

11篇

.

[15]Data Mining

1篇

.

[16]统计学习方法

1篇

.

[17]Redis

5篇

.

[18]机器学习

17篇

.

[19]DataStruct

1篇

.

[20]Basic

5篇

.

[21]Druid

7篇

.

[22]Calcite

6篇

.

[23]Presto

17篇

.

[24]Alluxio

1篇

.

展开 

文章存档

2018年4月

2篇

.

2018年3月

1篇

.

2018年2月

3篇

.

2018年1月

13篇

.

2017年12月

33篇

.

2017年11月

9篇

.

2017年10月

4篇

.

2017年9月

9篇

.

2017年8月

4篇

.

2017年7月

23篇

.

2017年6月

6篇

.

2017年5月

28篇

.

2017年4月

5篇

.

2017年3月

8篇

.

2017年2月

6篇

.

2017年1月

12篇

.

2016年12月

14篇

.

2016年10月

1篇

.

2016年9月

1篇

.

2016年7月

1篇

.

展开 

博主热门文章

sublime中分号替换成换行

 11152

spark-DataFrame学习记录-[2]解决spark-dataframe的JOIN操作之后产生重复列(Reference ‘***’ is ambiguous问题解决) …

 3643

spark-DataFrame学习记录-[3]以Json字符串构建RDD转DF

 3573

hive-随机取样

 2904

基于sparkMLlib的机器学习_[1]_基本数据类型[2]向量标签LabeledPoint

 2736

Spark SQL中防止数据倾斜sqlContext.sql中添加distribute by rand()

 2189

spark-spark-SparkSQL的3种Join实现(转)

 1566

Spark Streaming场景应用-Kafka数据读取方式

 1520

iterm 分屏切换快捷键与配色设置

 1515

Spark SQL通过JDBC连接MySQL读写数据

 1427

联系我们

请扫描二维码联系客服

webmaster@csdn.net 400-660-0108

QQ客服

客服论坛

关于 招聘 广告服务

百度

©1999-2018 CSDN版权所有

京ICP证09002463号

经营性网站备案信息

网络110报警服务

中国互联网举报中心

北京互联网违法和不良信息举报中心

.

.

.

.

.

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长! 登录 注册 . . 