hudi最新的0.9版本经过众人千呼万唤,终于在9月份出来了。hudi可以兼容在hadoop基础之上存储海量数据,不仅可以进行批处理,还可以在数据湖上进行流处理,即离线与实时结合。并且同时提供了2种原生语义:
不仅支持近实时写入和分析,还支持Spark、Presto、Trino、Hive 等的 SQL 读/写、事务回滚和并发控制、快照查询/增量查询、可插入索引等。更多介绍请参考Apache hudi官网
hudi0.8版本与flinksql的兼容性不好,里面没有对connector='hudi’的实现,在github上可以看到0.9版本有相关的实现了。
flink-conf.yaml中,需要开启checkpoint,其配置如下:
execution.checkpointing.interval: 3000sec
state.backend: rocksdb
state.checkpoints.dir: hdfs://hadoop0:9000/flink-checkpoints
state.savepoints.dir: hdfs://hadoop0:9000/flink-savepoints
第一步:启动hadoop集群,进入$HADOOP_HOME,执行:
./sbin/start-dfs.sh
在启动hadoop集群之前,建议先同步集群的时间,不然在后面操作hudi时会报错,可以使用如下命令同步。
ntpdate time1.aliyun.com
第二步:启动hive节点,进入$HIVE_HOME/conf,执行命令:
nohup hive --service metastore
nohup hiveserver2 &
启动hive后,执行beeline -u jdbc:hive2://hadoop0:10000命令是可以正常进入hive的。如果没有,可能需要检查hive-site.xml的配置或者查看启动日志。
第三步:启动flink节点,进入$FLINK_HOME/bin,执行命令:
./start-cluster.sh
在此之前,可以设置taskmanager的数量和slot的数量,hudi官网上是将taskmanager的数量设置为4,一个taskmanager有一个slot。当然也可以根据服务器的配置和数据量大小而定;
此外,$FLINK_HMOE/lib/目录下还需引入下面几个包:
flink-connector-hive_2.11-1.12.2.jar
flink-hadoop-compatibility_2.11-1.12.2.jar
flink-sql-connector-hive-3.1.2_2.11-1.12.2.jar
hive-exec-3.1.2.jar
hudi-flink-bundle_2.11-0.9.0.jar
第一步:启动flink-sql客户端,在$FLINK_HOME/bin目录执行:
export HADOOP_CLASSPATH=`$HADOOP_HOME/bin/hadoop classpath`
./sql-client.sh embedded
hudi0.9官网上执行是的./sql-client.sh embedded -j …/lib/hudi-flink-bundle_2.11-0.9.0.jar shell这条命令,用flink sql插入数据时会报错,导致jobmanager挂掉,目前在hudi0.10已经修复了这个bug。
第二步:建表和插入数据
use catalog myhive; --指定catalog,也可以不指定
CREATE TABLE tb_hudi_0901_tmp30 (
uuid VARCHAR(20) PRIMARY KEY NOT ENFORCED,
name VARCHAR(10),
age INT,
ts TIMESTAMP(3),
`partition` VARCHAR(20)
)
PARTITIONED BY (`partition`)
WITH (
'connector' = 'hudi',
'path' = 'hdfs://hadoop0:9000/hudi/tb_hudi_0901_tmp30',
'write.tasks'='1',
'compaction.async.enabled' = 'false',
'compaction.tasks'='1',
'table.type' = 'MERGE_ON_READ' ) ;
INSERT INTO tb_hudi_0901_tmp30 VALUES ('id1','Danny',23,TIMESTAMP '1970-01-01 00:00:01','part1'),
('id2','Stephen',33,TIMESTAMP '1970-01-01 00:00:02','part1'),
('id3','Julian',53,TIMESTAMP '1970-01-01 00:00:03','part1'),
('id4','Fabian',31,TIMESTAMP '1970-01-01 00:00:04','part1'),
('id5','Sophia',18,TIMESTAMP '1970-01-01 00:00:05','part1'),
('id7','Bob',44,TIMESTAMP '1970-01-01 00:00:07','part1');
效果如下图所示:
在这里,实验用的是离线压缩,compaction.async.enabled设置了false,也可以在线压缩。如果是在线压缩,批环境实验还没有成功,但是在流环境下,接kafka作为数据源,触发checkpoint是可以的,默认是当触发5次checkpoint时会生成压缩计划,然后调度对应的压缩任务,在hdfs便可以看到生成parquet文件了,这个是至关重要的,没有生成parquet文件,在hive里面是查不到数据了。如图所示:
第三步:建立hive外部表
CREATE EXTERNAL TABLE hudi_tb_test_copy4 (
`_hoodie_commit_time` string,
`_hoodie_commit_seqno` string,
`_hoodie_record_key` string,
`_hoodie_partition_path` string,
`_hoodie_file_name` string,
`uuid` STRING,
`name` STRING,
`age` bigint,
`ts` bigint) PARTITIONED BY (`partition` string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT 'org.apache.hudi.hadoop.HoodieParquetInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION 'hdfs://hadoop0:9000/hudi/tb_hudi_0901_tmp30';
CREATE EXTERNAL TABLE hudi_tb_test_copy4 (
`_hoodie_commit_time` string,
`_hoodie_commit_seqno` string,
`_hoodie_record_key` string,
`_hoodie_partition_path` string,
`_hoodie_file_name` string,
`uuid` STRING,
`name` STRING,
`age` bigint,
`ts` bigint) PARTITIONED BY (`partition` string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT 'org.apache.hudi.hadoop.realtime.HoodieParquetRealtimeInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION 'hdfs://hadoop0:9000/hudi/tb_hudi_0901_tmp30';
alter table hudi_tb_test_copy4 add if not exists partition(`partition`='part1') location 'hdfs://hadoop0:9000/hudi/tb_hudi_0901_tmp30/part1';
在hudi0.9版本也可以不用手动建立hive外部表,可以自动生成的,可惜目前还没有打通这个环节…
第四步:beeline查询数据
add jar hdfs://hadoop0:9000/jar/hudi-hadoop-mr-bundle-0.9.0.jar;
set hive.input.format = org.apache.hudi.hadoop.hive.HoodieCombineHiveInputFormat;
效果如下图所示:export JAVA_HOME=/usr/java/jdk1.8.0_181
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export HDFS_ZKFC_USER=root
export HDFS_JOURNALNODE_USER=root
add jar hdfs://hadoop0:9000/jar/hudi-hadoop-mr-bundle-0.9.0.jar;
这里只列出了印象较深刻的一些问题。。。最后用一句话结尾
世事洞明皆学问,人情练达即文章~~~