如何快速地將Hive中的數(shù)據(jù)導(dǎo)入ClickHouse
ClickHouse是面向OLAP的分布式列式DBMS。我們部門(mén)目前已經(jīng)把所有數(shù)據(jù)分析相關(guān)的日志數(shù)據(jù)存儲(chǔ)至ClickHouse這個(gè)優(yōu)秀的數(shù)據(jù)倉(cāng)庫(kù)之中,當(dāng)前日數(shù)據(jù)量達(dá)到了300億。
在之前的文章如何快速地把HDFS中的數(shù)據(jù)導(dǎo)入ClickHouse中我們提到過(guò)使用Waterdrop——https://github.com/InterestingLab/waterdrop對(duì)HDFS中的數(shù)據(jù)經(jīng)過(guò)很簡(jiǎn)單的操作就可以將數(shù)據(jù)寫(xiě)入ClickHouse旧噪。HDFS中的數(shù)據(jù)一般是非結(jié)構(gòu)化的數(shù)據(jù)悬赏,那么針對(duì)存儲(chǔ)在Hive中的結(jié)構(gòu)化數(shù)據(jù),我們應(yīng)該怎么操作呢丐吓?
Hive to ClickHouse
假定我們的數(shù)據(jù)已經(jīng)存儲(chǔ)在Hive中,我們需要讀取Hive表中的數(shù)據(jù)并篩選出我們關(guān)心的字段趟据,或者對(duì)字段進(jìn)行轉(zhuǎn)換券犁,最后將對(duì)應(yīng)的字段寫(xiě)入ClickHouse的表中。
Hive Schema
我們?cè)贖ive中存儲(chǔ)的數(shù)據(jù)表結(jié)構(gòu)如下汹碱,存儲(chǔ)的是很常見(jiàn)的Nginx日志
CREATE TABLE `nginx_msg_detail`(
`hostname` string,
`domain` string,
`remote_addr` string,
`request_time` float,
`datetime` string,
`url` string,
`status` int,
`data_size` int,
`referer` string,
`cookie_info` string,
`user_agent` string,
`minute` string)
PARTITIONED BY (
`date` string,
`hour` string)
ClickHouse Schema
我們的ClickHouse建表語(yǔ)句如下粘衬,我們的表按日進(jìn)行分區(qū)
CREATE TABLE cms.cms_msg
(
date Date,
datetime DateTime,
url String,
request_time Float32,
status String,
hostname String,
domain String,
remote_addr String,
data_size Int32,
) ENGINE = MergeTree PARTITION BY date ORDER BY (date, hostnmae) SETTINGS index_granularity = 16384
Waterdrop with ClickHouse
接下來(lái)會(huì)給大家介紹,我們?nèi)绾瓮ㄟ^(guò)Waterdrop將Hive中的數(shù)據(jù)寫(xiě)入ClickHouse中咳促。
Waterdrop
Waterdrop是一個(gè)非常易用稚新,高性能,能夠應(yīng)對(duì)海量數(shù)據(jù)的實(shí)時(shí)數(shù)據(jù)處理產(chǎn)品跪腹,它構(gòu)建在Spark之上褂删。Waterdrop擁有著非常豐富的插件,支持從Kafka冲茸、HDFS屯阀、Kudu中讀取數(shù)據(jù),進(jìn)行各種各樣的數(shù)據(jù)處理轴术,并將結(jié)果寫(xiě)入ClickHouse难衰、Elasticsearch或者Kafka中。
Waterdrop的環(huán)境準(zhǔn)備以及安裝步驟這里就不一一贅述了逗栽,具體安裝步驟可以參考上一篇文章或者訪(fǎng)問(wèn)Waterdrop Docs
Waterdrop Pipeline
我們僅需要編寫(xiě)一個(gè)Waterdrop Pipeline的配置文件即可完成數(shù)據(jù)的導(dǎo)入盖袭。
配置文件包括四個(gè)部分,分別是Spark彼宠、Input鳄虱、filter和Output。
Spark
這一部分是Spark的相關(guān)配置兵志,主要配置Spark執(zhí)行時(shí)所需的資源大小醇蝴。
spark {
spark.app.name = "Waterdrop"
spark.executor.instances = 2
spark.executor.cores = 1
spark.executor.memory = "1g"
}
Input
這一部分定義數(shù)據(jù)源,如下是從Hive文件中讀取text格式數(shù)據(jù)的配置案例想罕。
input {
hive {
pre_sql = "select * from access.nginx_msg_detail"
table_name = "access_log"
}
}
看悠栓,很簡(jiǎn)單的一個(gè)配置就可以從Hive中讀取數(shù)據(jù)了。其中pre_sql
是從Hive中讀取數(shù)據(jù)SQL按价,table_name
是將讀取后的數(shù)據(jù)惭适,注冊(cè)成為Spark中臨時(shí)表的表名,可為任意字段楼镐。
需要注意的是癞志,必須保證hive的metastore是在服務(wù)狀態(tài)。
在Cluster框产、Client凄杯、Local模式下運(yùn)行時(shí)错洁,必須把hive-site.xml
文件置于提交任務(wù)節(jié)點(diǎn)的$HADOOP_CONF目錄下
Filter
在Filter部分,這里我們配置一系列的轉(zhuǎn)化戒突,我們這里把不需要的minute和hour字段丟棄屯碴。當(dāng)然我們也可以在讀取Hive的時(shí)候通過(guò)pre_sql
不讀取這些字段
filter {
remove {
source_field = ["minute", "hour"]
}
}
Output
最后我們將處理好的結(jié)構(gòu)化數(shù)據(jù)寫(xiě)入ClickHouse
output {
clickhouse {
host = "your.clickhouse.host:8123"
database = "waterdrop"
table = "nginx_log"
fields = ["date", "datetime", "hostname", "url", "http_code", "request_time", "data_size", "domain"]
username = "username"
password = "password"
}
}
Running Waterdrop
我們將上述四部分配置組合成為我們的配置文件config/batch.conf
。
vim config/batch.conf
spark {
spark.app.name = "Waterdrop"
spark.executor.instances = 2
spark.executor.cores = 1
spark.executor.memory = "1g"
}
input {
hive {
pre_sql = "select * from access.nginx_msg_detail"
table_name = "access_log"
}
}
filter {
remove {
source_field = ["minute", "hour"]
}
}
output {
clickhouse {
host = "your.clickhouse.host:8123"
database = "waterdrop"
table = "access_log"
fields = ["date", "datetime", "hostname", "uri", "http_code", "request_time", "data_size", "domain"]
username = "username"
password = "password"
}
}
執(zhí)行命令膊存,指定配置文件导而,運(yùn)行Waterdrop,即可將數(shù)據(jù)寫(xiě)入ClickHouse隔崎。這里我們以本地模式為例今艺。
./bin/start-waterdrop.sh --config config/batch.conf -e client -m 'local[2]'
Conclusion
在這篇文章中,我們介紹了如何使用Waterdrop將Hive中的數(shù)據(jù)導(dǎo)入ClickHouse中爵卒。僅僅通過(guò)一個(gè)配置文件便可快速完成數(shù)據(jù)的導(dǎo)入虚缎,無(wú)需編寫(xiě)任何代碼,十分簡(jiǎn)單技潘。
希望了解Waterdrop與ClickHouse遥巴、Elasticsearch、Kafka享幽、Hadoop結(jié)合使用的更多功能和案例,可以直接進(jìn)入項(xiàng)目主頁(yè)https://github.com/InterestingLab/waterdrop
-- Power by InterestingLab