如何快速地把HDFS中的數(shù)據(jù)導(dǎo)入ClickHouse

如何快速地把HDFS中的數(shù)據(jù)導(dǎo)入ClickHouse

3739fb5b1bad134c6fc2ebccb502178d.jpeg

ClickHouse是面向OLAP的分布式列式DBMS鸡典。我們部門目前已經(jīng)把所有數(shù)據(jù)分析相關(guān)的日志數(shù)據(jù)存儲(chǔ)至ClickHouse這個(gè)優(yōu)秀的數(shù)據(jù)倉(cāng)庫(kù)之中,當(dāng)前日數(shù)據(jù)量達(dá)到了300億陪毡。

之前介紹的有關(guān)數(shù)據(jù)處理入庫(kù)的經(jīng)驗(yàn)都是基于實(shí)時(shí)數(shù)據(jù)流讹开,數(shù)據(jù)存儲(chǔ)在Kafka中侠姑,我們使用Java或者Golang將數(shù)據(jù)從Kafka中讀取篷就、解析汹粤、清洗之后寫入ClickHouse中命斧,這樣可以實(shí)現(xiàn)數(shù)據(jù)的快速接入。然而在很多同學(xué)的使用場(chǎng)景中嘱兼,數(shù)據(jù)都不是實(shí)時(shí)的国葬,可能需要將HDFS或者是Hive中的數(shù)據(jù)導(dǎo)入ClickHouse。有的同學(xué)通過編寫Spark程序來實(shí)現(xiàn)數(shù)據(jù)的導(dǎo)入芹壕,那么是否有更簡(jiǎn)單胃惜、高效的方法呢。

目前開源社區(qū)上有一款工具Waterdrop哪雕,項(xiàng)目地址https://github.com/InterestingLab/waterdrop,可以快速地將HDFS中的數(shù)據(jù)導(dǎo)入ClickHouse鲫趁。

HDFS to ClickHouse

假設(shè)我們的日志存儲(chǔ)在HDFS中斯嚎,我們需要將日志進(jìn)行解析并篩選出我們關(guān)心的字段,將對(duì)應(yīng)的字段寫入ClickHouse的表中。

Log Sample

我們?cè)贖DFS中存儲(chǔ)的日志格式如下堡僻, 是很常見的Nginx日志

10.41.1.28 github.com 114.250.140.241 0.001s "127.0.0.1:80" [26/Oct/2018:03:09:32 +0800] "GET /InterestingLab/waterdrop HTTP/1.1" 200 0 "-" - "Dalvik/2.1.0 (Linux; U; Android 7.1.1; OPPO R11 Build/NMF26X)" "196" "-" "mainpage" "443" "-" "172.16.181.129"

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, 
    pool String
) ENGINE = MergeTree PARTITION BY date ORDER BY date SETTINGS index_granularity = 16384

Waterdrop with ClickHouse

接下來會(huì)給大家詳細(xì)介紹,我們?nèi)绾瓮ㄟ^Waterdrop滿足上述需求钉疫,將HDFS中的數(shù)據(jù)寫入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é)果寫入ClickHouse、Elasticsearch或者Kafka中客税。

Prerequisites

首先我們需要安裝Waterdrop况褪,安裝十分簡(jiǎn)單,無需配置系統(tǒng)環(huán)境變量

  1. 準(zhǔn)備Spark環(huán)境
  2. 安裝Waterdrop
  3. 配置Waterdrop

以下是簡(jiǎn)易步驟更耻,具體安裝可以參照Quick Start

cd /usr/local
wget https://archive.apache.org/dist/spark/spark-2.2.0/spark-2.2.0-bin-hadoop2.7.tgz
tar -xvf https://archive.apache.org/dist/spark/spark-2.2.0/spark-2.2.0-bin-hadoop2.7.tgz
wget https://github.com/InterestingLab/waterdrop/releases/download/v1.1.1/waterdrop-1.1.1.zip
unzip waterdrop-1.1.1.zip
cd waterdrop-1.1.1

vim config/waterdrop-env.sh
# 指定Spark安裝路徑
SPARK_HOME=${SPARK_HOME:-/usr/local/spark-2.2.0-bin-hadoop2.7}

Waterdrop Pipeline

我們僅需要編寫一個(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ù)源,如下是從HDFS文件中讀取text格式數(shù)據(jù)的配置案例讶隐。

input {
    hdfs {
        path = "hdfs://nomanode:8020/rowlog/accesslog"
        table_name = "access_log"
        format = "text"
    }
}

Filter

在Filter部分起胰,這里我們配置一系列的轉(zhuǎn)化,包括正則解析將日志進(jìn)行拆分巫延、時(shí)間轉(zhuǎn)換將HTTPDATE轉(zhuǎn)化為ClickHouse支持的日期格式效五、對(duì)Number類型的字段進(jìn)行類型轉(zhuǎn)換以及通過SQL進(jìn)行字段篩減等

filter {
    # 使用正則解析原始日志
    grok {
        source_field = "raw_message"
        pattern = '%{IP:ha_ip}\\s%{NOTSPACE:domain}\\s%{IP:remote_addr}\\s%{NUMBER:request_time}s\\s\"%{DATA:upstream_ip}\"\\s\\[%{HTTPDATE:timestamp}\\]\\s\"%{NOTSPACE:method}\\s%{DATA:url}\\s%{NOTSPACE:http_ver}\"\\s%{NUMBER:status}\\s%{NUMBER:body_bytes_send}\\s%{DATA:referer}\\s%{NOTSPACE:cookie_info}\\s\"%{DATA:user_agent}\"\\s%{DATA:uid}\\s%{DATA:session_id}\\s\"%{DATA:pool}\"\\s\"%{DATA:tag2}\"\\s%{DATA:tag3}\\s%{DATA:tag4}'
    }
    # 將"dd/MMM/yyyy:HH:mm:ss Z"格式的數(shù)據(jù)轉(zhuǎn)換為
    # "yyyy/MM/dd HH:mm:ss"格式的數(shù)據(jù)
    date {
        source_field = "timestamp"
        target_field = "datetime"
        source_time_format = "dd/MMM/yyyy:HH:mm:ss Z"
        target_time_format = "yyyy/MM/dd HH:mm:ss"
    }
    # 使用SQL篩選關(guān)注的字段,并對(duì)字段進(jìn)行處理
    # 甚至可以通過過濾條件過濾掉不關(guān)心的數(shù)據(jù)
    sql {
        table_name = "access"
        sql = "select substring(date, 1, 10) as date, datetime, hostname, url, http_code, float(request_time), int(data_size), domain from access"
    }
}

Output

最后我們將處理好的結(jié)構(gòu)化數(shù)據(jù)寫入ClickHouse

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"
    }
}

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 {
    hdfs {
        path = "hdfs://nomanode:8020/rowlog/accesslog"
        table_name = "access_log"
        format = "text"
    }
}
filter {
    # 使用正則解析原始日志
    grok {
        source_field = "raw_message"
        pattern = '%{IP:ha_ip}\\s%{NOTSPACE:domain}\\s%{IP:remote_addr}\\s%{NUMBER:request_time}s\\s\"%{DATA:upstream_ip}\"\\s\\[%{HTTPDATE:timestamp}\\]\\s\"%{NOTSPACE:method}\\s%{DATA:url}\\s%{NOTSPACE:http_ver}\"\\s%{NUMBER:status}\\s%{NUMBER:body_bytes_send}\\s%{DATA:referer}\\s%{NOTSPACE:cookie_info}\\s\"%{DATA:user_agent}\"\\s%{DATA:uid}\\s%{DATA:session_id}\\s\"%{DATA:pool}\"\\s\"%{DATA:tag2}\"\\s%{DATA:tag3}\\s%{DATA:tag4}'
    }
    # 將"dd/MMM/yyyy:HH:mm:ss Z"格式的數(shù)據(jù)轉(zhuǎn)換為
    # "yyyy/MM/dd HH:mm:ss"格式的數(shù)據(jù)
    date {
        source_field = "timestamp"
        target_field = "datetime"
        source_time_format = "dd/MMM/yyyy:HH:mm:ss Z"
        target_time_format = "yyyy/MM/dd HH:mm:ss"
    }
    # 使用SQL篩選關(guān)注的字段畏妖,并對(duì)字段進(jìn)行處理
    # 甚至可以通過過濾條件過濾掉不關(guān)心的數(shù)據(jù)
    sql {
        table_name = "access"
        sql = "select substring(date, 1, 10) as date, datetime, hostname, url, http_code, float(request_time), int(data_size), domain from access"
    }
}
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ù)寫入ClickHouse半夷。這里我們以本地模式為例。

./bin/start-waterdrop.sh --config config/batch.conf -e client -m 'local[2]'

Conclusion

在這篇文章中迅细,我們介紹了如何使用Waterdrop將HDFS中的Nginx日志文件導(dǎo)入ClickHouse中巫橄。僅通過一個(gè)配置文件便可快速完成數(shù)據(jù)的導(dǎo)入,無需編寫任何代碼茵典。除了支持HDFS數(shù)據(jù)源之外湘换,Waterdrop同樣支持將數(shù)據(jù)從Kafka中實(shí)時(shí)讀取處理寫入ClickHouse中。我們的下一篇文章將會(huì)介紹统阿,如何將Hive中的數(shù)據(jù)快速導(dǎo)入ClickHouse中彩倚。

當(dāng)然,Waterdrop不僅僅是ClickHouse數(shù)據(jù)寫入的工具砂吞,在Elasticsearch以及Kafka等數(shù)據(jù)源的寫入上同樣可以扮演相當(dāng)重要的角色署恍。

希望了解Waterdrop和ClickHouse、Elasticsearch蜻直、Kafka結(jié)合使用的更多功能和案例盯质,可以直接進(jìn)入項(xiàng)目主頁(yè)https://github.com/InterestingLab/waterdrop

-- Power by InterestingLab

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市概而,隨后出現(xiàn)的幾起案子呼巷,更是在濱河造成了極大的恐慌,老刑警劉巖赎瑰,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件王悍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡餐曼,警方通過查閱死者的電腦和手機(jī)压储,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來源譬,“玉大人集惋,你說我怎么就攤上這事〔饶铮” “怎么了刮刑?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)养渴。 經(jīng)常有香客問我雷绢,道長(zhǎng),這世上最難降的妖魔是什么理卑? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任翘紊,我火速辦了婚禮,結(jié)果婚禮上藐唠,老公的妹妹穿的比我還像新娘霞溪。我一直安慰自己孵滞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布鸯匹。 她就那樣靜靜地躺著,像睡著了一般泄伪。 火紅的嫁衣襯著肌膚如雪殴蓬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天蟋滴,我揣著相機(jī)與錄音染厅,去河邊找鬼。 笑死津函,一個(gè)胖子當(dāng)著我的面吹牛肖粮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播尔苦,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼涩馆,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了允坚?” 一聲冷哼從身側(cè)響起魂那,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎稠项,沒想到半個(gè)月后涯雅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡展运,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年活逆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拗胜。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蔗候,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挤土,到底是詐尸還是另有隱情琴庵,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布仰美,位于F島的核電站迷殿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏咖杂。R本人自食惡果不足惜庆寺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诉字。 院中可真熱鬧懦尝,春花似錦知纷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至踊挠,卻和暖如春乍桂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背效床。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工睹酌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人剩檀。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓憋沿,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親沪猴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辐啄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容