簡介
工作中我們遇到了把Hive數(shù)據(jù)同步到Clickhouse的業(yè)務需求,一開始我們寫Spark任務矮男,用SparkSQL讀Hive,再用JDBC寫入到Clickhouse。
后來奋姿,隨著要同步的表越來越多,每次都寫Spark任務素标,成本就顯得有些高了称诗。于是,寫了一個通用的Spark任務头遭,指定Hive表寓免、字段,指定Clickhouse表计维、字段袜香,每次指定不同的參數(shù)。
再后來鲫惶,業(yè)務越來越復雜困鸥,不僅是簡單的同步,而是要支持更復雜的SQL剑按,結果進行數(shù)據(jù)類型轉(zhuǎn)換疾就、值轉(zhuǎn)化等,然后再插入Clickhouse艺蝴。
這不是ETL要干的事兒嗎猬腰?!
當然猜敢,繼續(xù)增強之前的Spark姑荷,完全可以實現(xiàn)這個功能。但是說到ETL缩擂,不是有專業(yè)強大的Logstash嗎鼠冕,為什么要重復造輪子?
經(jīng)過一番調(diào)研胯盯,還真有人寫了Logstash插件懈费,用來導出數(shù)據(jù)到Clickhouse:logstash-output-clickhouse
輸出端搞定了,輸入端怎么搞呢博脑?很建達憎乙,用JDBC插件就可以了。
輸入
input {
jdbc {
jdbc_driver_library => "/data/jars/hive-jdbc-1.1.0-cdh5.7.4.jar,/data/jars/libthrift-0.9.2.jar,/data/jars/httpclient-4.2.5,/data/jars/httpcore-4.2.5.jar,/data/jars/hive-service-1.1.0-cdh5.7.4.jar,/data/jars/hive-common-1.1.0-cdh5.7.4.jar,/data/jars/hive-metastore-1.1.0-cdh5.7.4.jar,/data/jars/hadoop-common-2.6.0-cdh5.7.4.jar,/data/jars/commons-logging-1.2.jar,/data/jars/slf4j-api-1.7.5.jar,/data/jars/slf4j-log4j12-1.7.5.jar,/data/jars/log4j-1.2.17.jar"
jdbc_driver_class => "org.apache.hive.jdbc.HiveDriver"
jdbc_connection_string => "jdbc:hive2://ip:port/db
jdbc_user => ""
jdbc_password => ""
parameters => {"n" => 100}
statement => "select id, reg_time from db.table limit :n"
#schedule => "* * * * *"
}
}
如上叉趣,配置jdbc連接信息即可泞边。
需要說明的是,相關的jar包比較多疗杉,需要給全了阵谚,否則會有各種ClassNotFoundException。完整的jar列表為:
-rw-r--r-- 1 root root 61829 Sep 21 2016 commons-logging-1.2.jar
-rw-r--r-- 1 root root 3438469 Sep 21 2016 hadoop-common-2.6.0-cdh5.7.4.jar
-rw-r--r-- 1 root root 302545 Sep 21 2016 hive-common-1.1.0-cdh5.7.4.jar
-rw-r--r-- 1 root root 96208 Sep 21 2016 hive-jdbc-1.1.0-cdh5.7.4.jar
-rw-r--r-- 1 root root 5498220 Sep 21 2016 hive-metastore-1.1.0-cdh5.7.4.jar
-rw-r--r-- 1 root root 2050189 Sep 21 2016 hive-service-1.1.0-cdh5.7.4.jar
-rw-r--r-- 1 root root 433368 Sep 21 2016 httpclient-4.2.5.jar
-rw-r--r-- 1 root root 227708 Sep 21 2016 httpcore-4.2.5.jar
-rw-r--r-- 1 root root 227712 Sep 21 2016 libthrift-0.9.2.jar
-rw-r--r-- 1 root root 489884 Sep 21 2016 log4j-1.2.17.jar
-rw-r--r-- 1 root root 26084 Sep 21 2016 slf4j-api-1.7.5.jar
-rw-r--r-- 1 root root 8869 Sep 21 2016 slf4j-log4j12-1.7.5.jar
這些jar最好與hive環(huán)境版本一致,我們用的是CDH版梢什,所以都是從CDH目錄下找到的jar闻牡。
輸出
Clickhouse插件使用說明參考:https://github.com/mikechris/logstash-output-clickhouse
主要說下安裝過程。
說明文檔里說的bin/logstash-plugin install logstash-output-clickhouse
方式绳矩,沒有安裝成功罩润,所以只能自己編譯安裝。
先clone源碼翼馆,然后進入源碼根路徑:
git clone https://github.com/mikechris/logstash-output-clickhouse.git
cd logstash-output-clickhouse
編譯:
gem build logstash-output-clickhouse.gemspec
此時割以,若沒有安裝ruby環(huán)境,按照提示安裝一下应媚,再編譯严沥。
編譯成功后,會多出一個文件
-rw-r--r-- 1 root root 8704 Aug 28 11:27 logstash-output-clickhouse-0.1.0.gem
安裝:
logstash-plugin install logstash-output-clickhouse-0.1.0.gem
logstash的安裝就不多說了中姜,按照logstash官方文檔安裝就可以了消玄。
此時,如果logstash版本是5.x丢胚,可能會遇到一個錯誤:
Validating ./logstash-output-clickhouse/logstash-output-clickhouse-0.1.0.gem
Installing logstash-output-clickhouse
Plugin version conflict, aborting
ERROR: Installation Aborted, message: Bundler could not find compatible versions for gem "logstash-mixin-http_client":
In snapshot (Gemfile.lock):
logstash-mixin-http_client (= 5.2.0)
In Gemfile:
logstash-mixin-http_client (< 6.0.0, >= 5.0.0) java
logstash-mixin-http_client (< 6.0.0, >= 5.1.0) java
logstash-output-clickhouse (= 0.1.0) java depends on
logstash-mixin-http_client (< 7.0.0, >= 6.0.0) java
Running `bundle update` will rebuild your snapshot from scratch, using only
the gems in your Gemfile, which may resolve the conflict.
按照提示翩瓜,修改gemfile:
vim logstash-output-clickhouse/logstash-output-clickhouse.gemspec
修改logstash-mixin-http_client的版本:
# Gem dependencies
s.add_runtime_dependency "logstash-core-plugin-api", ">= 1.60", "<= 2.99"
#s.add_runtime_dependency "logstash-mixin-http_client", ">= 6.0.0", "< 7.0.0"
s.add_runtime_dependency "logstash-mixin-http_client", ">= 5.0.0", "< 6.0.0"
原來是>6且<7,改成>5且<6携龟。
然后兔跌,再次編譯、安裝峡蟋,就可以了坟桅。
按照文檔中的使用說明,配置Clickhouse連接信息即可:
output {
#stdout { codec => json }
#stdout { codec => json_lines }
clickhouse {
http_hosts => ["http://127.0.0.1:8123/"]
table => "default.table"
request_tolerance => 1
#flush_size => 1000
#pool_max => 1000
mutations => {
id => id
reg_time => reg_time
}
}
}
數(shù)據(jù)轉(zhuǎn)化
這部分工作可以放在filter里處理蕊蝗,各種filter插件就不說了仅乓,參考logstash官方文檔吧。