大数据:ClickHouse-HDFS集成
Posted DataStreamTalk
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据:ClickHouse-HDFS集成相关的知识,希望对你有一定的参考价值。
ClickHouse是目前最火爆的开源OLAP引擎,其优秀的大数据实时分析性能让人惊叹。而HDFS是海量数据可靠存储的通用标准。那么,如何将HDFS中的海量数据快速有效的加载到ClickHouse中呢?
一、将HDFS文件数据同步到ClickHouse
步骤1:hive/ClickHouse建表
hive表
create table data_warehouse.hdfs_parquet_file_test_tb
(
`dim1_col` int,
`dim2_col` int,
`metrics_col` int
)
STORED AS parquet
ClickHouse表
CREATE TABLE ch_hdfs.hdfs_parquet_file_test_tb (
`dim1_col` Int32,
`dim2_col` Int32,
`metrics_col` Int32
)
engine = ReplacingMergeTree()
order by (dim1_col,dim2_col)
;
步骤2:下载hdfs文件
进入sparksql或hive-sql客户端,先获取hive表的hdfs文件位置目录
sparksql > desc formatted data_warehouse.hdfs_parquet_file_test_tb
;
进入shell终端,获取hive表的hdfs数据文件路径
$ /usr/local/hadoop-current/bin/hdfs dfs -ls hdfs://hdfs_cluster/data/hive/warehouse/data_warehouse/hdfs_parquet_file_test_tb
Found 1 items
-rwxrwxrwx 3 pgxl pgxl 626349087 2020-11-05 16:21 hdfs://hdfs_cluster/data/hive/warehouse/data_warehouse/hdfs_parquet_file_test_tb/000000_0
下载hdfs文件
hdfs dfs -get hdfs://hdfs_cluster/data/hive/warehouse/data_warehouse/hdfs_parquet_file_test_tb/000000_0
步骤3:hdfs文件传输
先压缩再传输到ClickHouse服务器,然后解压
步骤4:hdfs文件加载到ClickHouse
解压后的hdfs文件位置
/home/admin/hdfs_parquet_file_test_tb.parquet
shell命令加载hdfs文件数据到ClickHouse
clickhouse-client -u user_name --password --database="ch_hdfs" --query="insert into ch_hdfs.hdfs_parquet_file_test_tb FORMAT Parquet" < /home/admin/hdfs_parquet_file_test_tb.parquet
终极简洁版命令
如果ClickHouse服务器上安装了hadoop客户端,那么上述操作可以简化成一条指令:
{HADOOP_HOME}/bin/hdfs dfs -cat hdfs://hdfs_cluster/data/hive/warehouse/data_warehouse/hdfs_parquet_file_test_tb/000000_0 | \
clickhouse-client -u user_name --password --database="ch_hdfs" \
--query="insert into ch_hdfs.hdfs_parquet_file_test_tb FORMAT Parquet"
实际效果
上述示例的hdfs原始文件大小600M,数据记录800万,加载到ClickHouse仅几秒钟就执行完毕。
HDFS文件建议采用parquet等压缩格式,效果更好
HDFS-orc文件采用上述方式导入时会报错,提示如下:
Code: 8. DB::Exception: Column "dim1_col" is not presented in input data
二、HDFS表引擎实战
ClickHouse提供了HDFS表引擎,可以直接集成外部的HDFS数据。
HDFS表引擎建表语法示例
CREATE TABLE hdfs_engine_table
(name String, value UInt32)
ENGINE=HDFS('hdfs://hdfs1:9000/other_storage', 'TSV')
step1:Hadoop配置文件准备
将文件 {hadoop安装目录}/etc/hadoop/hdfs-site.xml 从hadoop目录拷贝到 ClickHouse 服务器的 /etc/clickhouse-server/hdfs-site.xml
step2: ClickHouse 服务配置更改
编辑 /etc/init.d/clickhouse-server 文件,增加一行:
export LIBHDFS3_CONF=/etc/clickhouse-server/hdfs-site.xml
step3:配置修改完毕后,重启 ClickHouse 服务
step4:通过HDFS表引擎集成HDFS示例
创建Hive表
create table data_warehouse.hdfs_parquet_file_test_tb
(
`dim1_col` int,
`dim2_col` int,
`metrics_col` int
)
STORED AS parquet
查看hive表的hdfs文件目录
sparksql > desc formatted data_warehouse.hdfs_parquet_file_test_tb;
...
| Location | hdfs://hdfs_cluster/data/hive/warehouse/data_warehouse/hdfs_parquet_file_test_tb
...
导入数据到Hive表
采用HDFS表引擎在ClickHouse库中创建映射表
HDFS表引擎需要指定hive表的文件hdfs目录,上一步已经获取。
CREATE TABLE ch_hdfs.parquet_file_test_with_hdfs_engine (
`dim1_col` Int32,
`dim2_col` Int32,
`metrics_col` Int32
)
ENGINE=HDFS('hdfs://hdfs_cluster/data/hive/warehouse/wedw/opendata/jwy_anhao_dict_service_detail_parquet_df/*', 'Parquet')
;
查询ClickHouse库的HDFS引擎表
select *
from ch_hdfs.parquet_file_test_with_hdfs_engine
limit 10;
通过HDFS引擎表将hdfs数据抽取到 MergeTree 引擎表
insert into ch_hdfs.hdfs_sink_table
select *
from ch_hdfs.parquet_file_test_with_hdfs_engine;
注意事项
HDFS引擎表适用于将存储在HDFS的hive表加载到ClickHouse中,不依赖第三方ETL工具,非常方便
hive表建议采用parquet格式存储,orc格式支持有点问题,而普通text格式的压缩比太低,转换效率不高
hive表中列如果存在null值,ClickHouse的HDFS引擎表对应列要采用Nullable类型
大数据量转换时注意设置ClickHouse操作账号的内存使用配额,过小的话可能报错(无法分配足够的内存)
以上是关于大数据:ClickHouse-HDFS集成的主要内容,如果未能解决你的问题,请参考以下文章