【Druid】(六)Apache Druid 数据摄入

一、数据格式

  1. 摄入规范化数据:JSON、CSV、TSV
  2. 自定义格式
  3. 其他格式

二、配置

主要是摄入的规则 Ingestion Spec

Ingestion Spec(数据格式描述)是Druid对要索引数据的格式以及如何索引该数据格式的一个统一描述,它是一个JSON文件,一般由三部分组成。

FieldTypeDescriptionRequired
dataSchemaJSON Object标识摄入数据的schema,dataSchema 是固定的,不随数据消费方式改变。不同specs 可共享 。yes
ioConfigJSON Object标识data 从哪来,到哪去。数据消费方式不同,ioConfig也不相同。yes
tuningConfigJSON Object标识如何调优不同的ingestion parameters 。根据不同的 ingestion method 不同。no
{
"dataSchema" : {...},
"ioConfig" : {...},
"tuningConfig" : {...}
}

2.1 DataSchema

第一部分的dataSchema描述了数据的格式,如何解析该数据,典型结构如下。

{
    "dataSource": <name_of_dataSource>,
    "parser": {
        "type": <>,
        "parseSpec": {
            "format": <>,
            "timestampSpec": {},
            "dimensionsSpec": {}
        }
    },
    "metricsSpec": {},
    "granularitySpec": {}
}
FieldTypeDescriptionRequired
dataSourceString要摄入的datasource 名称,Datasources 可看做为表yes
parserJSON Objectingested data 如何解析yes
metricsSpecJSON Object arrayaggregators(聚合器) 器列表yes
granularitySpecJSON Object数据聚合设置,指定segment 的存储粒度和查询粒度yes
2.1.1 parser

parser部分决定了数据如何被正确地解析,metricsSpec定义了数据如何被聚集计算,granularitySpec定义了数据分片的粒度、查询的粒度。

对于parser,type有两个选项:string和hadoopString,后者用于Hadoop索引的 job。parseSpec是数据格式解析的具体定义。

(1)string parser

FieldTypeDescriptionRequired
typeString一般为string,或在Hadoop indexing job 中使用hadoopyStringno
parseSpecJSON Object标识格式format 和、imestamp、dimensionsyes

parseSpec 两个功能:

  • String Parser 用parseSpec 判定将要处理rows 的数据格式( JSON, CSV, TSV)
  • 所有的Parsers 用parseSpec 判定将要处理rows 的timestamp 和dimensionsAll

JSON ParseSpec

FieldTypeDescriptionRequired
formatStringjsonno
timestampSpecJSON Object指明时间戳列名和格式yes
dimensionsSpecJSON Object指明维度的设置yes
flattenSpecJSON Object若json 有嵌套层级,则需要指定no

CSV ParseSpec

FieldTypeDescriptionRequired
formatStringcsv.yes
timestampSpecJSON Object指明时间戳列名和格式yes
dimensionsSpecJSON Object指明维度的设置yes
listDelimiterString多值dimensions 的分割符no(default = ctrl+A)
columnsJSON arraycsv 的数据列名yes

TSV ParseSpec

FieldTypeDescriptionRequired
formatStringtsv.yes
timestampSpecJSON Object指明时间戳列名和格式yes
dimensionsSpecJSON Object指明维度的设置yes
listDelimiterString多值dimensions 的分割符no(default = ctrl+A)
columnsJSON arraytsv 的数据列名yes
delimiterString数据之间的分隔符,默认是\tno

对于不同的数据格式,可能还有额外的parseSpec选项。

TimestampSpec

FieldTypeDescriptionRequired
columnStringtimestamp 的列yes
formatStringiso, millis, posix, auto or Joda time,时间戳格式no (default = ‘auto’)

DimensionsSpec

FieldTypeDescriptionRequired
dimensionsJSON数组描述数据包含哪些维度。每个维度可以只是个字符串,或者可以额外指明维度的属性,例如 “dimensions”: [ “dimenssion1”, “dimenssion2”, “{“type”: “long”, “name”: “dimenssion3”} ],默认是string类型。yes
dimensionExclusionsJSON字符串数组数据消费时要剔除的维度。no (default == [])
spatialDimensionsJSON对象数组空间维度名列表,主要用于地理几何运算no (default == [])
2.1.2 metricsSpec

metricsSpec是一个JSON对象数组,定义了一些聚合器(aggregators)。聚合器通常有如下的结构。

{
    "type": <type>,
    "name": <output_name>,
    "fieldName": <metric_name>
}
FieldTypeDescriptionRequired
dimensionsStringcount,longSum 等聚合函数类型yes
fieldNameString聚合函数运用的列名no
nameString聚合后指标的列名yes

一些简单的聚合函数:

count 、longSum、longMin、longMax、doubleSum、doubleMin、doubleMax

2.1.3 GranularitySpec

聚合支持两种聚合方式:uniform和arbitrary,前者以一个固定的时间间隔聚合数据,后者尽量保证每个segments大小一致,时间间隔是不固定的。目前uniform是默认选项。

FieldTypeDescriptionRequired
typeStringuniformyes
segmentGranularitystringsegment 的存储粒度,HOUR DAY 等yes
queryGranularitystring最小查询粒度MINUTE HOURyes
intervalsJSON Object array数据消费时间间隔 ,可选,对于流式数据 pull 方式而言可以忽略no
"dataSchema" : {
	"dataSource" : "wikipedia",
	"parser" : {
		"type" : "string",
		"parseSpec" : {
			"format" : "json",
			"dimensionsSpec" : {
				"dimensions" : [
					"channel",
					"cityName",
					"comment",
					"countryIsoCode",
					"countryName",
					"isAnonymous",
					"isMinor",
					"isNew",
					"isRobot",
					"isUnpatrolled",
					"metroCode",
					"namespace",
					"page",
					"regionIsoCode",
					"regionName",
					"user",
					{ "name" : "commentLength", "type" : "long" },
					{ "name" : "deltaBucket", "type" : "long" },
					"flags",
					"diffUrl",
					{ "name": "added", "type": "long" },
					{ "name": "deleted", "type": "long" },
					{ "name": "delta", "type": "long" }
				]
			},
			"timestampSpec": {
				"column": "timestamp",
				"format": "iso"
			}
		}
	},
	"metricsSpec" : [],
	"granularitySpec" : {
		"type" : "uniform",
		"segmentGranularity" : "day",
		"queryGranularity" : "none",
		"intervals" : ["2016-06-27/2016-06-28"],
		"rollup" : false
	}
}

2.2 ioConfig

ioConfig 指明了真正具体的数据源

FieldTypeDescriptionRequired
typeStringalways be ‘realtime’.yes
firehoseJSON Object指明数据源,例如本地文件 kafkayes
plumberJSON ObjectWhere the data is going.yes

不同的firehose 的格式不太一致,以kafka 为例:

{
	firehose : {
		consumerProps : {
			auto.commit.enable : false
			auto.offset.reset : largest
			fetch.message.max.bytes : 1048586
			group.id : druid-example
			zookeeper.connect : localhost:2181
				zookeeper.connect.timeout.ms : 15000
				zookeeper.session.timeout.ms : 15000
				zookeeper.sync.time.ms : 5000
		},
		feed : wikipedia
		type : kafka-0.8
	}
}

ioConfig 的案例:

"ioConfig" : {
	"type" : "index",
	"firehose" : {
		"type" : "local",
		"baseDir" : "quickstart/",
		"filter" : "wikipedia-2016-06-27-sampled.json"
	},
	"appendToExisting" : false
}

2.3 tuningConfig

tuningConfig 这部分配置是优化数据输入的过程

FieldTypeDescriptionRequired
typeStringrealtimeno
maxRowsInMemoryInteger在存盘之前内存中最大的存储行数,指的是聚合后的行数indexing 所需Maximum heap memory= maxRowsInMemory * (2 +maxPendingPersists).no (default ==75000)
windowPeriodISO 8601 Period String默认10 分钟,最大可容忍时间窗口,超过窗口,数据丢弃no (default ==PT10m)
intermediatePersistPeriodISO 8601 Period String多长时间数据临时存盘一次no (default ==PT10m)
basePersistDirectoryString临时存盘目录no (default == javatmp dir)
versioningPolicyObject如何为segment 设置版本号no (default == basedon segment start time)
rejectionPolicyObject数据丢弃策略no (default ==‘serverTime’)
maxPendingPersistsInteger最大同时存盘请求数,达到上限,输入将会暂停no (default == 0)
shardSpecObject分片设置no (default ==‘NoneShardSpec’)
buildV9DirectlyBoolean是否直接构建V9 版本的索引no (default == true)
persistThreadPriorityint存盘线程优先级no (default == 0)
mergeThreadPriorityint存盘归并线程优先级no (default == 0)
reportParseExceptionsBoolean是否汇报数据解析错误no (default == false)
"tuningConfig" : {
	"type" : "index",
	"targetPartitionSize" : 5000000,
	"maxRowsInMemory" : 25000,
	"forceExtendableShardSpecs" : true
}

三、从 Hadoop 加载数据

3.1 加载数据

批量摄取维基百科样本数据,文件位于quickstart/wikipedia-2016-06-27-sampled.json。使用
quickstart/wikipedia-index-hadoop.json 摄取任务文件。

bin/post-index-task --file quickstart/wikipedia-index-hadoop.json

此命令将启动Druid Hadoop 摄取任务。

摄取任务完成后,数据将由历史节点加载,并可在一两分钟内进行查询。

3.2 查询数据

在这里插入图片描述

四、从 kafka 加载数据

4.1 准备kafka

  1. 启动kafka
[chris@hadoop102 kafka]$ bin/kafka-server-start.sh config/server.properties
[chris@hadoop103 kafka]$ bin/kafka-server-start.sh config/server.properties
[chris@hadoop104 kafka]$ bin/kafka-server-start.sh config/server.properties
  1. 创建wikipedia 主题
[chris@hadoop102 kafka]$ bin/kafka-topics.sh --zookeeper hadoop102:2181 –topic
wikipedia --partitions 1 --replication-factor 1 –create
Created topic "wikipedia".
  1. 查看主题是否创建成功
[chris@hadoop102 kafka]$ bin/kafka-topics.sh --zookeeper hadoop102:2181 --list
__consumer_offsets
first
wikipedia

4.2 启动索引服务

我们将使用Druid 的Kafka 索引服务从我们新创建的维基百科主题中提取消息。要启动该服务,我们需要通过从Imply 目录运行以下命令向Druid 的overlord 提交supervisor spec

[chris@hadoop102 imply-2.7.10]$ curl -XPOST -H'Content-Type: application/json' -d
@quickstart/wikipedia-kafka-supervisor.json
http://hadoop102:8090/druid/indexer/v1/supervisor

说明:
curl 是一个利用 URL 规则在命令行下工作的文件传输工具。它支持文件的上传和下载,所以是综合传输工具。

  • -X 为HTTP 数据包指定一个方法,比如PUT、DELETE。默认的方法是GET 6.4.3
  • -H 为HTTP 数据包指定 Header 字段内容
  • -d 为POST 数据包指定要向HTTP 服务器发送的数据并发送出去,如果<data>的内容以符号@ 开头,其后的字符串将被解析为文件名,curl 命令会从这个文件中读取数据发送。

4.3 加载历史数据

启动kafka 生产者生产数据

[chris@hadoop102 kafka]$ bin/kafka-console-producer.sh --broker-list hadoop102:9092 –
-topic wikipedia < /opt/module/imply-2.7.10/quickstart/wikipedia-2016-06-27-sampled.json

说明:
< 将文件作为命令输入
可在kafka 本地看到相应的数据生成

[chris@hadoop103 logs]$ pwd
/opt/module/kafka/logs

将样本事件发布到Kafka 的wikipedia 主题,然后由Kafka 索引服务将其提取到Druid 中。你现在准备运行一些查询了!
在这里插入图片描述

4.4 加载实时数据

下载一个帮助应用程序,该应用程序将解析维基媒体的IRC 提要中的event,并将这些event发布到我们之前设置的Kafka 的wikipedia 主题中。

[chris@hadoop102 imply-2.7.10]$ curl -O
https://static.imply.io/quickstart/wikiticker-0.4.tar.gz

说明:
-O 在本地保存获取的数据时,使用它们在远程服务器上的文件名进行保存。

[chris@hadoop102 imply-2.7.10]$ tar -zxvf wikiticker-0.4.tar.gz
[chris@hadoop102 imply-2.7.10]$ cd wikiticker-0.4

现在运行带有参数的wikiticker,指示它将输出写入我们的Kafka 主题:

[chris@hadoop102 wikiticker-0.4]$ bin/wikiticker -J-Dfile.encoding=UTF-8 -out kafka –
topic Wikipedia

查询多次,对比结果的变化

在这里插入图片描述

4.5 加载自定义kafka 主题数据

可以通过编写自定义supervisor spec 来加载自己的数据集。要自定义受监督的Kafka 索引服务提取,可以将包含的quickstart/wikipedia-kafka-supervisor.json 规范复制到自己的文件中,根据需要进行编辑,并根据需要创建或关闭管理程序。没有必要自己重启Imply 或Druid 服务。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值