大数据: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集成的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段13——Vue的状态大管家

VSCode自定义代码片段13——Vue的状态大管家

如何绕过将数据模型传递给片段参数以避免事务太大异常?

大数据-kafka学习——集成SpringBoot

炫酷 CSS 背景效果的 10 个代码片段

登录成功后向片段或页面传递数据