Druid——Hadoop-based Batch Ingestion

来源:互联网 发布:微盘外汇交易平台源码 编辑:程序博客网 时间:2024/06/07 08:46

druid导入历史数据有两种方法:

1.import

直接向metadata中insert segments.

参考文档: http://druid.io/docs/0.9.2-rc2/operations/insert-segment-to-db.html

2.Hadoop-based Batch Ingestion

通过提交一个hadoop ingest task到overlord,可以直接从文件导入数据,也可以从datasource导入数据,还可以用作merge segments。

参考文档:

  • http://druid.io/docs/0.9.2-rc2/ingestion/batch-ingestion.html
  • http://druid.io/docs/0.9.2-rc2/ingestion/update-existing-data.html
  • http://druid.io/docs/0.9.2-rc2/operations/other-hadoop.html

 

步骤:

1.根据需求写出hadoop task配置文件

(1) 从datasource导入数据

数据源m_006和m_001中数据完全一致,因此二者可以相互导入用作恢复历史数据。

eg: reindexing_006_to_001.json的具体配置如下,可将001中2016-11-20T00:00:00.000Z/2016-11-21T00:00:00.000Z内的数据导入006中。

{
    "type":"index_hadoop",
    "spec": {
        "dataSchema": {   // 与kafka indexing service 中的supervisor配置基本一致
            "dataSource":"m_006",
            "granularitySpec": {
                "queryGranularity":"NONE",
                "segmentGranularity":"HOUR",    //导入到006的数据的segment生成粒度
                "type":"uniform",
                "intervals": [
                    "2016-11-20T00:00:00.000Z/2016-11-21T00:00:00.000Z"  // 需导入数据的时间范围
                ]
            },
            "metricsSpec": [
                 {
                    "name":"count",
                    "type":"count"
                }
            ],
            "parser": {
                "parseSpec": {
                    "dimensionsSpec": {
                        "dimensionExclusions": [

                        ],
                        "dimensions": [
                            "db",
                            "table",
                            "area"
                        ],
                        "spatialDimensions": [

                        ]
                    },
                    "format":"json",
                    "timestampSpec": {
                        "column":"timestamp",
                        "format":"auto"
                    }
                },
                "type":"hadoopyString"
            }
        },
        "ioConfig": {
            "type":"hadoop",
            "inputSpec": {
                "type":"dataSource",
                "ingestionSpec": {
                    "dataSource":"m_001", // 从哪个datasource导入数据
                    "intervals": [
                        "2016-11-20T00:00:00.000Z/2016-11-21T00:00:00.000Z"
                    ]
                },
                "paths":"/druid/segments/m_001"  //hdfs上的存放路径
            }
        },
        "tuningConfig": {
            "type":"hadoop",
            "jobProperties": {
                "mapreduce.jobtracker.staging.root.dir":"/druid/hadoop",
                "yarn.app.mapreduce.am.staging-dir":"/druid/hadoop/hadoop-yarn/staging",
                "mapreduce.map.memory.mb":"2048",
                "mapreduce.reduce.memory.mb":"2048",
                "mapreduce.job.classloader":"true"  //很重要!必须加,让本task用druid中的hadoop-dependencies,而不是hadoop集群的配置
            }
        }
    }
,
    "hadoopDependencyCoordinates": [
        "org.apache.hadoop:hadoop-client:2.7.2"
    ]

}

(2) merge segments

将同一数据源中的数据reindex,且增大新的segment生成粒度,例如把一天的数据reindex,新的segmentGranularity改为“DAY”,则可将改天的所有segment合并为一个segment。

"granularitySpec": {
        "queryGranularity":"NONE",
        "segmentGranularity":"DAY",
        "type":"uniform",
        "intervals": [
            "2016-11-20T00:00:00.000Z/2016-11-21T00:00:00.000Z"
        ]
    }

}

注意:不能对同一个datasource同一天的数据做多次merge,例如对006先merge 2016-11-20T00:00:00 ~ 2016-11-20T06:00:00,然后merge 2016-11-20T06:00:00 ~ 2016-11-20T12:00:00。

因为第一次merge时生成的segment时间间隔是2016-11-20T00:00:00.000Z/2016-11-21T00:00:00.000Z(记为seg1),第二次merge时取到的数据是seg1,在seg1中没有任何06:00:00 ~ 12:00:00的数据。所以建议此种merge方法只用作把一整天的数据合并。

2.把该task提交到overlord上

eg: curl http://100.0.0.1:8090/druid/indexer/v1/task -H "Content-Type:application/json" -X POST --data @reindexing_006_to_001.json

注意事项

1. druid内部与hadoop交互有两种

1)Use HDFS for deep storage using the druid-hdfs-storage extension,用于存储,即实时数据写入HDFS,以及从HDFS读取数据到historical用于查询,路径“../druid/extensions/druid-hdfs-storage/*

2)Batch-load data from Hadoop using Map/Reduce jobs,用于本文所写的Hadoop batch ingest,路径“../druid/hadoop-dependencies/*”。

当此处hadoop版本与运行MR jobs的hadoop集群版本不同时会出错,exitCode = 1(MR job启动失败)、exitCode = 143(MR job fail)。

解决方法:将druid源码中pom.xml中的<hadoop.compile.version>2.7.2</hadoop.compile.version>修改为与集群版本相同,重新编译和部署即可。

2. 当前版本的druid coordinator不会自动删除historical上的旧版本数据,而上述的reindex方法不会自动修改metadata中已存在的segment,所以多次reindex / import / merge 都需要手动设置不需要或旧版本的segment used = 1。

0 0