基于ClickHouse的百亿级广告平台实时数仓构建实战

  M V P   S p a r k   o f f e r   J a v a   o f f e r   J a v a  


  |  

  5 1 0 0     |   1 0  



问题背景



我们公司是一个每天百亿增量数据的互联网广告公司,作为大数据专家我主要的职责是负责系统的优化和迭代,在系统优化和迭代中,我和我们的团队一直努力寻求一种既能快速完成数据分析又能节省服务器资源的数据解决方案。

广 线 S 3 线 S 3 A P I S 3 S 3 C S V T X T P a r q u e t O R C

1


A t h e n a S p a r k H a d o o p B I  

便 A t h e n a S Q L

T B 2 0 线 线

2



梳理分析,解决问题



线


3



7 3 4



C l i c k H o u s e p r o j e c t i o n

 

S t a r t R o c k s C l i c k H o u s e

 

  1. 线 K a f k a S Q L C l i c k H o u s e

  2. C l i c k H o u s e K a f k a P r o j e c t

  3. C l i c k H o u s e B I

 


4



 

解决问题的核心关键点


S t a r R o c k s C l i c k H o u s e C l i c k H o u s e C l i c k H o u s e  

  1. C l i c k H o u s e 5 0 T B 1 4 0 亿 S t a r R o c k s

  2. C l i c k H o u s e K a f k a S 3 H T T P J D B C

  3. C l i c k H o u s e M y S Q L M o n g o D B C l i c k H o u s e

  4. p r o j e c t

5


 

C l i c k H o u s e C l i c k H o u s e


仓。

 

线 线 K a f k a M y S Q L M o n g o D B

1 M y S Q L 使 J D B C


CREATE TABLE user_table(    `id` Int32,    `user_name` String,    `height` Float32,    `password` Nullable(String))ENGINE JDBC('jdbc:mysql://localhost:3306/?user=root&password=root', 'test', 'test')

c o d e 1


M y S Q L C l i c k H o u s e C l i c k H o u s e M y S Q L

SELECT * FROM user_table

c o d e 2


 

M y S Q L

INSERT INTO user_table(`id`, `user_name`) VALUES(1,'alex')

c o d e 3

 


2 M o n g o D B

CREATE TABLE [IF NOT EXISTS] testdb.test_collection(    id UInt64,    name String,) ENGINE = MongoDB(127.0.0.1:27017, testdb, test_collection, 'your_user_name', 'your_password');

c o d e 4

 

便

SELECT COUNT() FROM test_collection;

c o d e 5

 

3 S 3

CREATE TABLE s3_table (name String, value UInt32)     ENGINE=S3(')    SETTINGS input_format_with_names_use_header = 0;

c o d e 6


 

S 3  

INSERT INTO s3_table VALUES ('a', 1), ('b', 2), ('c', 3);

c o d e 7


 

使 S 3

SELECT * FROM s3_table LIMIT 2;

c o d e 8


 

4 )   K a f k a C l i c k H o u s e K a f k a 便 K a f k a C l i c k H o u s e C l i c k H o u s e

CREATE TABLE kafka_source_test (    level String,    type String,   name String,   time DateTime64  ) ENGINE = Kafka SETTINGS kafka_broker_list = 'localhost:9092',                            kafka_topic_list = 'test_topic',                            kafka_group_name = 'test_group',                            kafka_format = 'JSONEachRow',                            kafka_num_consumers = 4;

c o d e 9


 

l o c a l h o s t : 9 0 9 2 t o p i c t e s t _ t o p i c K a f k a t e s t _ g r o u p C l i c k H o u s e C l i c k H o u s e k a f k a _ s o u r c e _ t e s t K a f k a T o p i c k a f k a _ s o u r c e _ t e s t

  SELECT * FROM kafka_source_test LIMIT 5

c o d e 1 0


 

C l i c k H o u s e K a f k a


析。

 

C l i c k H o u s e p r o j e c t i o n C l i c k H o u s e T B


便 据。

 

S Q L C l i c k H o u s e

p r o j e c t i o n C l i c k H o u s e

C l i c k H o u s e 使 使 h t t p s : / / c l i c k h o u s e . c o m / d o c s / e n /

  1 .

C l i c k H o u s e T B C l i c k H o u s e


6

 


k a f k a _ s o u r c e _ t e s t t y p e

CREATE TABLE statistics_type_day(    type String,    day Date,    type_count UInt32)ENGINE = SummingMergeTree()ORDER BY (type, day)

c o d e 1 1

 

 

使 S u m m i n g M e r g e T r e e

k a f k a _ s o u r c e _ t e s t s t a t i s t i c s _ t y p e _ d a y

CREATE MATERIALIZED VIEW if not exists statistics_type_day_mv TO statistics_type_day AS SELECT type, day, count(1) type_countfrom kafka_source_testgroup by type, day

c o d e 1 2


 

k a f k a _ s o u r c e _ t e s t 便 s t a t i s t i c s _ t y p e _ d a y

select * from statistics_type_day where day='2022-03-20'

c o d e 1 3


 

2 . p r o j e c t i o n

C l i c k H o u s e p r o j e c t i o n C l i c k H o u s e p r o j e c t i o n

1 5 0 2 0

使 使 使 使 S Q L S Q L S Q L S Q L

  7


1 + 2 0 S Q L 1 S Q L 使

C l i c k H o u s e p r o j e c t i o n

p r o j e c t i o n p r o j e c t i o n p r o j e c t i o n

S Q L S Q L 便 p r o j e c t i o n C l i c k H o u s e p r o j e c t i o n

8

 

 

p r o j e c t i o n 使 p r o j e c t i o n p r o j e c t i o n

CREATE TABLE test_projection_table(    level String,   type String,   name String,   city String,   time DateTime64,    PROJECTION projection_1    (         SELECT             name,             count(1)         GROUP BY  level    ) ,     PROJECTION projection_2    (         SELECT             name,             count(1)         GROUP BY type     ) ) ENGINE = MergeTree() ORDER BY (name , level, type)

c o d e 1 4


p r o j e c t i o n _ 1 p r o j e c t i o n _ 2 p r o j e c t i o n _ 1 l e v e l p r o j e c t i o n _ 2 t y p e p r o j e c t i o n p r o j e c t i o n

ALTER TABLE test_projection_table     ADD PROJECTION projection_3    (         SELECT             count(1),             name        GROUP BY type, level     )

c o d e 1 5



p r o j e c t i o n

  1. s e l e c t     p r o j e c t i o n     s e l e c t  

  2. g r o u p   b y     p r o j e c t i o n     g r o u p   b y  

  3. w h e r e       p r o j e c i t o n     g r o u p   b y    

S Q L

select name,count() from test_projection_table where type='A' group by type

c o d e 1 6


 

S Q L p r o j e c t i o n c i t y p r o j e c t i o n


select name,city,count() from test_projection_table where type='A' group by city

c o d e 1 7

 


e x p l a i n   R e a d F r o m S t o r a g e   ( M e r g e T r e e ( w i t h   p r o j e c t i o n ) )     p r o j e c t i o n



C l i c k H o u s e C l i c k H o u s e   I n s e r t S c h e m a



C l i c k H o u s e C l i c k H o u s e


p r o j e c t i o n

 

访


C l i c k H o u s e C l i c k H o u s e S 3

9

 


 

结束语



C l i c k H o u s e 亿 广

1 0


 

S t a r R o c k s C l i c k H o u s e C l i c k H o u s e O D S D W D D W S A D S C l i c k H o u s e p r o j e c t i o n

K a f k a O D S D W D p r o j e c t i o n D W S p r o j e c t i o n

1 1




延伸思考



便

便 H a d o o p S p a r k 线 F l i n k M P P 1 S Q L 便

M y S Q L H a d o o p S p a r k

1 2

 

A C I D

C l i c k H o u s e C P U C P U C P U   S I M D   ( S i n g l e   I n s t r u c t i o n   M u l t i p l e   D a t a )   C P U    

M P P C l i c k H o u s e S t a r R o c k s


请使用浏览器的分享功能分享到微信等