如何将Hive中的数据导入到Druid中

Apache Druid是一个实时OLAP型数据库,现在有一个需求就是将Hive中的一张大表,导入到Druid中,然后应用层直接查询Druid。
接下来就是将Hive中的数据导入到Druid的详细步骤:

我的方案是直接从HDFS上将源文件直接load过去

0. 系统基本信息

Druid版本0.18
hadoop版本cdh集成的2.6.0
使用的是Druid的single-server中的micro-quickstart模式

1. Druid准备hadoop依赖

1.1 配置文件准备

Druid从hdfs上读数据,还要将hadoop的配置文件拷贝到Druid的配置目录下。

在$DRUID_HOME/conf/druid/single-server/micro-quickstart/_common
下创建一个文件夹hadoop-xml

然后将以下几个文件拷贝进去

$ ll
total 28
-rw-r--r-- 1 bigdata bigdata 3850 Apr 28 08:34 core-site.xml
-rw-r--r-- 1 bigdata bigdata 2942 Apr 28 08:34 hdfs-site.xml
-rw-r--r-- 1 bigdata bigdata 5039 Apr 28 08:34 mapred-site.xml
-rw-r--r-- 1 bigdata bigdata 5529 Apr 28 08:34 yarn-site.xml

这一步参考官方文档:
http://druid.apache.org/docs/latest/tutorials/tutorial-batch-hadoop.html#configure-druid-to-use-hadoop

1.2 Druid深度存储位置更换

这一步就是更换Druid的segment和log的存储位置,默认是local本地存储。
打开 conf/druid/single-server/micro-quickstart/_common/common.runtime.properties文件,更改以下配置

#
# Deep storage
#

# For local disk (only viable in a cluster if this is a network mount):
#druid.storage.type=local
#druid.storage.storageDirectory=var/druid/segments

# For HDFS:
druid.storage.type=hdfs
druid.storage.storageDirectory=/druid/segments

#
# Indexing service logs
#

# For local disk (only viable in a cluster if this is a network mount):
#druid.indexer.logs.type=file
#druid.indexer.logs.directory=var/druid/indexing-logs

# For HDFS:
druid.indexer.logs.type=hdfs
druid.indexer.logs.directory=/druid/indexing-logs

这一步操作完后重启Druid节点。

2.Hive表格要求

因为要直接从hdfs上load数据,而hdfs上的文件如果内容是json格式的还好处理一些,但是hive表在hdfs上存储的文件是没有Schema的,所以就要按照一定的格式进行字段切分。然后在Druid的配置文件进行映射,hive默认的列分割符是\u0001,这个在Druid里边是不识别的,所以要导入的Hive表最好是其他分隔符,比如我的hive边列分隔符指定的是\t

3. 从页面直接添加数据源

以上步骤做完了就开始load数据

3.1 打开http://hostname:8888选择Load data
3.2 load数据

在右侧Source type以及Paths上填写相应的信息后点击Apply之后就加载进了数据

3.3 Parse data

点击Parse data后会有如下报错信息,不要怕,这是因为我们的schema信息还没有配置,Druid解析失败。

Error: Cannot construct instance of `org.apache.druid.data.input.impl.DelimitedInputFormat`, 
problem: If columns field is not set, the first row of your data must have your header and
 hasHeaderRow must be set to true. at [Source: (org.eclipse.jetty.server.HttpInputOverHTTP);
 line: 1, column: 198] (through reference chain: org.apache.druid.indexing.overlord.sampler.IndexTaskSamplerSpec["spec"]-
 >org.apache.druid.indexing.common.task.IndexTask$IndexIngestionSpec["ioConfig"]-
 >org.apache.druid.indexing.common.task.IndexTask$IndexIOConfig["inputFormat"])

然后在右边工具栏,input format选择tsv,Find columns from header选择False(默认),Skip header rows写0(默认),再Columns栏里填写Hive表中对应的列信息,Delimiter不填(注:不能写\t,直接在框里打一个Tab空格,或者直接不写系统会自动识别并填入),List delimiter不填,接下来点击Apply就出现了以下内容,Schema信息就配置好了

3.4 Parse time

time字段是Druid中必须要指定的,因此Druid也可以作为时序数据库,这一步系统一般会默认给我们选择一个字段作为time字段,如果这个字段不是我们想要的就需要我们自己指定,拉动进度,点击我们这指定的time字段的表头,右边信息栏就会有相应的信息,格式默认是auto,如果时间格式是固定的话,我们也可以直接指定。

选择之后点击Apply,预览一下数据:

3.5 Transforms

Druid可以对每行列值执行转换,从而创建新的派生列或更改现有列
这一步是可选的,我们的应用场景没有相关需求,直接跳过。

3.6 Filter

制定规则过滤掉不需要的数据
这一步是可选的,我们的应用场景没有相关需求,直接跳过。

3.7 Configure schema

这一步是最最最关键的,详细可以查看官网相关资料
https://druid.apache.org/docs/0.18.0/ingestion/schema-design.html

界面是这样子的:

右侧有两个选项Explicitly specify dimension listRollup

Explicitly specify dimension list:选择是否显式指定维度列表,官网是这样解释的:
选择是否要设置维度指标的明确列表。明确设置维度和指标可以带来更好的压缩和性能。如果禁用此选项,则Druid将尝试自动检测数据中的字段并将其视为单独的列。
Rollup:
如果启用Rollup,则Druid会尝试在索引之前为数据进行预聚合以节省存储空间。主时间戳将被截断为指定的查询粒度,并且包含相同字符串字段值的行将被聚合在一起。
如果启用Rollup,则必须指定哪些列是维度(要对其进行分组和过滤的字段),哪些是度量(要对其进行汇总的字段)。

我们使用Druid想要查询快,这两个选项是必须开启的。
还有一个选项是Query granularity,这是用来指定查询粒度的,系统提供了5种选择,我们的应用场景粒度到天就够了。

到这一步后,就该调整维度和度量信息了,系统会默认给我们指定一些维度和度量的列,往往这些都不是我们想要的,如下图,列名为count或者sum_开头的就是系统自动给指定的度量列,按照图示方法就行度量列修改或者删除。
当然要是将维度列修改为度量列这是同样的方法。

3.8 Partition

这一步是指定segment分区设置,类型可以选择统一的或者任意,一般按照时间查询的比较多,我们这里也是指定按照天来分区segment,设置好后实际上segment也是按照每个分区一个文件来存储的,类似于Hive中的分区。

然后设置一下每个segment最大的行,以及所有segment中等待推送的最大的行数,关于这两个参数,想进一步了解可以查看官网的详细解释。

当然还可以二级分区,在这里指定分区类型活分片数以及分区维度。

3.9 Tune

这一步是可选的,作用是微调Druid将如何提取数据

3.10 Publish

在这一步对整个DataSource进行配置,需要更改的是DataSource name以及是否追加到现有的DataSource。

3.11 Edit spec

编辑摄取规范,到这一步,Druid会根据我们之前的设置,自动生成一个json串,数据的加载将会按照json串中的配置进行,如果之前的步骤都是按照需求设置的,这一步就是预览一下不用修改,就可以直接提交了。

{
  "type": "index_parallel",
  "spec": {
    "ioConfig": {
      "type": "index_parallel",
      "inputSource": {
        "type": "hdfs",
        "paths": "/user/hive/warehouse/xxx.db/xxx"
      },
      "inputFormat": {
        "type": "tsv",
        "findColumnsFromHeader": false,
        "columns": [
          "id",
          "group_id",
       .........
          "flag"
        ]
      },
      "appendToExisting": false
    },
    "tuningConfig": {
      "type": "index_parallel",
      "partitionsSpec": {
        "type": "dynamic"
      },
      "forceGuaranteedRollup": false
    },
    "dataSchema": {
      "dataSource": "demo_test",
      "granularitySpec": {
        "type": "uniform",
        "queryGranularity": "DAY",
        "rollup": true
      },
      "timestampSpec": {
        "column": "create_date",
        "format": "yyyy-MM-dd HH:mm:ss"
      },
      "dimensionsSpec": {
        "dimensions": [
          "beautician_id",
          "beautician_name",
      ........
          "update_date",
          "remarks"
        ]
      },
      "metricsSpec": [
        {
          "name": "count",
          "type": "count"
        },
.............
        {
          "name": "sum_post_fee",
          "type": "longSum",
          "fieldName": "post_fee"
        }
      ]
    }
  }
}

4. 选择ingestion,查看数据load进度

直到status变为SUCCESS状态后,就可以查询数据了。

5. 查询数据

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,295评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,928评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,682评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,209评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,237评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,965评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,586评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,487评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,016评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,136评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,271评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,948评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,619评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,139评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,252评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,598评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,267评论 2 358