ClickHouse集成HDFS (4)
一 HDFS (在clickhouse 上创建表格插入数据,将数据存储在hdfs端)=>不提倡使用这种方法
1 先在 clickhouse shell客户端建立一个HDFS 类型的表格
// 建表
create table tb_hdfs(
id Int32,
name String,
gender String)
engine=HDFS('hdfs://doit03:8020/cch','CSV'); //CVS是hdfs的shell客户端上装有数据的文件的文件类型
2 克隆一个当前正在使用的机器 ,将 hdfs 开启
start-all.sh
3 向创建的clickhouse 客户端的 tb_hdfs 表中插入数据
insert into tb_hdfs values(1,'zss','M'),(2,'lii','F');
4 可能会出现提示说 /cch 文件打不开" Unable to open HDFS file:" 可能因为clickhouse端只有写的权限 ,其他的权限不够 ,所有需要去 hdfs 的shell客户端将 /cch文件的权限打开 ,如下 ;
// 将hdfs 上根目录下的所有文件的所有权限全部打开
hdfs dfs -chmod -R 777 / ()
5 回到clickhouse 的shell客户端 ,继续向 clickhouse 的tb_hdfs 表中插入数据
6 查询数据 :
select * from tb_hdfs;
┌─id─┬─name─┬─gender─┐
│ 1 │ zss │ M │
│ 2 │ lii │ F │
└────┴──────┴──────┘
7 去数据存储的路径下查看数据存储情况 :
cd /var/lib/clickhouse/data/default
8 查看后 ,没有看到tb_hdfs 这个新建的表格 ;
9 但是tb_hdfs这个表里面的数据在hdfs web端上cch中存储着 ;
注 : 在clickhouse 上创建表格插入数据,将数据存储在hdfs端 ,这个方法不建议使用
二 FROM(从hdfs的shell客户端获得数据 ,直接以对应的数据格式将数据传输/拉取/读取到 clickhouse shell客户端)
使用的是集成引擎 HDFS ,和HDFS集成 ,直接读取/拉取 hdfs 上的数据
基本的语法语句 : (从表的引擎和集成引擎里面取数据)==>直接读取引擎中的数据
需要在一个机器上克隆出两个机器处理 ,一个操作hdfs的shell客户端 ,一个操作 clickhouse 的shell客户端 ,一个在机器的普通操作端
1 在 hdfs shell客户端的根目录下
hdfs dfs -mkdir /hdfs
2 在机器的 /root/
vi app.csv // 创建文件并向里面编辑以下内容
1,URL1,2020-07-21,click // (id Int ,url String ,ctime Date, event String)
2,URL1,2020-07-21,show
3,URL1,2020-07-21,click
4,URL1,2020-07-21,show
5,URL1,2020-07-21,click
6,URL1,2020-07-21,click
:wq! //退出编辑模式后,保存退出
3 将集群 /root/app.csv 文件上传到 hdfs shell客户端的 /hdfs 文件夹上
hdfs dfs -put app.csv /hdfs
4 在 clickhouse 客户端上直接读取hdfs shell客户端上 /hdfs/app.csv 的数据
select * from hdfs('hdfs://doit03:8020/hdfs/app.csv','CSV','id Int8,url String,ctime Date,event String');
┌─id─┬─url──┬──────ctime─┬─event─┐
│ 1 │ URL1 │ 2020-07-21 │ click │
│ 2 │ URL1 │ 2020-07-21 │ show │
│ 3 │ URL1 │ 2020-07-21 │ click │
│ 4 │ URL1 │ 2020-07-21 │ show │
│ 5 │ URL1 │ 2020-07-21 │ click │
│ 6 │ URL1 │ 2020-07-21 │ click │
└───┴─────┴──────────┴─────┘
6 rows in set. Elapsed: 0.077 sec. //获取数据速度很快 ,用时 0.077s .
三 在hive 的shell客户端上读取 hdfs/app.csv 的数据
与 clickhouse 比较一下速度
1 启动 hive
// 根据提示 ,一步步将一下内容输入
hiveserver2 & // 开启服务端 / 开启元数据库 ???
beeline
!connect jdbc:hive2://doit03:10000 // 开启客户端 (也可以 在hive jar包下的 bin目录下 , 输入 hive 开启客户端)
root // 用户名
123456 //密码
show databases // 查看hive中数据库情况
2 建一个 hive 表
create external table tb_hive(
id int,
url string,
ctime string,
event string)
row format delimited fields terminated by ','
location 'hdfs://doit03:8020/hdfs';
3 查询 hive 中表创建的情况
select * from tb_hive;
// 结果如下 :
1 URL1 2020-07-21 click
2 URL1 2020-07-21 show
3 URL1 2020-07-21 click
4 URL1 2020-07-21 show
5 URL1 2020-07-21 click
6 URL1 2020-07-21 click
Time taken: 2.25 seconds, Fetched: 6 row(s)
总结 : 经过比较,速度相差不多 ,但是 hive shell客户端上读取hdfs上的 hdfs/app.csv 数据的速度还是比 clickhouse shell客户端上读取hdfs上 hdfs/app.csv 数据的速度要慢一点 .
五 比较聚合速度 ==>clickhouse 和 hive 进行比较
1 clickhouse shell客户端上聚合(查询数据)
select count(1),event from hdfs('hdfs://doit03:8020/hdfs/app.csv','CSV','id Int8,url String,ctime Date,event String') group by event;
// 查询结果 :
┌─count(1)─┬─event─┐
│ 4 │ click │
│ 2 │ show │
└───────┴──────┘
2 rows in set. Elapsed: 0.132 sec. ===>聚合速度用时 : 0.132s .
2 hive shell客户端上聚合(查询数据)
select count(1),event from tb_hive group by event;
// 查询结果
3 click
1 click
2 show
Time taken: 91.786 seconds, Fetched: 3 row(s) ===>聚合速度用时 : 91.786s .
总结 :
处理同样的数据 ,用一样的算法 ,clickhouse 处理数据 特别快 ,hive处理数据特别慢 ,clickhouse 比 hive处理数据快上百倍有余 .