云服务器内容精选

  • 运行任务 登录Spark客户端节点,执行如下命令: source 客户端安装目录/bigdata_env source 客户端安装目录/Hudi/component_env 编译构建样例代码后可以使用spark-submit提交命令,执行命令后会依次执行写入、更新、查询、删除等操作: 运行Java样例程序: spark-submit --class com.huawei.bigdata.hudi.examples.HoodieWriteClientExample /opt/example/hudi-java-examples-1.0.jar hdfs://hacluster/tmp/example/hoodie_java hoodie_java 其中:“/opt/example/hudi-java-examples-1.0.jar”为jar包路径,“hdfs://hacluster/tmp/example/hoodie_java”为Hudi表的存储路径,“ hoodie_java”为Hudi表的表名。 运行Scala样例程序: spark-submit --class com.huawei.bigdata.hudi.examples.HoodieDataSourceExample /opt/example/hudi-scala-examples-1.0.jar hdfs://hacluster/tmp/example/hoodie_scala hoodie_scala 其中:“/opt/example/hudi-scala-examples-1.0.jar”为jar包路径,“hdfs://hacluster/tmp/example/hoodie_scala”为Hudi表的存储路径,“ hoodie_Scala”为Hudi表的表名。 运行Python样例程序: spark-submit /opt/example/HudiPythonExample.py hdfs://hacluster/tmp/huditest/example/python hudi_trips_cow 其中:“hdfs://hacluster/tmp/huditest/example/python”为Hudi表的存储路径,“ hudi_trips_cow”为Hudi表的表名。
  • 打包项目 将user.keytab、krb5.conf 两个文件上传客户端所在服务器上。 通过IDEA自带的Maven工具,打包项目,生成jar包。具体操作请参考在Linux环境中调测Spark应用。 编译打包前,样例代码中的user.keytab、krb5.conf文件路径需要修改为该文件所在客户端服务器的实际路径。 运行Python样例代码无需通过Maven打包,只需要上传user.keytab、krb5.conf 文件到客户端所在服务器上。 将打包生成的jar包上传到Spark客户端所在服务器的任意目录(例如“ /opt/example/” )下。
  • 返回结果 参数 描述 path_num 指定目录的子目录数量 file_num 指定目录的文件数量 storage_size 该目录的Size(bytes) storage_size(unit) 该目录的Size(KB) storage_path 指定目录的完整FS绝对路径 space_consumed 返回文件/目录在集群中占用的实际空间,即它考虑了为集群设置的复制因子 quota 名称配额(名称配额是对当前目录树中的文件和目录名称数量的硬性限制) space_quota 空间配额(空间配额是对当前目录树中的文件所使用的字节数量的硬性限制)
  • 参数描述 表1 参数描述 参数 描述 是否必填 op 生成compaction计划(op指定为“schedule”),或者执行已经生成的compaction计划(op指定为“run”) 是 table 需要查询表的表名,支持database.tablename格式 否 path 需要查询表的路径 否 timestamp 在op指定为“run”时,可以指定timestamp来执行该时间戳对应的compaction计划以及该时间戳之前未执行的compaction计划 否
  • 参数描述 表1 参数描述 参数 描述 table_name 需要清理无效数据文件的Hudi表的表名,必选。 op_type 命令运行模式,可选,默认值为dry_run,取值:dry_run、repair、undo、query。 dry_run:显示需要清理的无效数据文件。 repair:显示并清理无效的数据文件。 undo:恢复已清理的数据文件 query:显示已执行清零操作的备份目录。 backup_path 运行模式为undo时有效,需要恢复数据文件的备份目录,必选。 start_time 运行模式为dry_run、repair时有效,产生无效数据文件的开始时间,可选,默认不限制开始时间。 end_time 运行模式为dry_run、repair时有效,产生无效数据文件的结束时间,可选,默认不限制结束时间。
  • 回答 原因: Hudi表数据含有Decimal类型数据。 初始入库BULK_INSET方式会使用Spark内部parquet文件的写入类进行写入,Spark对不同精度的Decimal类型处理是不同的。 UPSERT操作时,Hudi使用Avro兼容的parquet文件写入类进行写入,这个和Spark的写入方式是不兼容的。 解决方案: 执行BULK_INSERT时指定设置“hoodie.datasource.write.row.writer.enable = false”,使hoodie采用Avro兼容的parquet文件写入类进行写入。
  • 示例 alter table h0 add columns(ext0 string); alter table h0 add columns(new_col int not null comment 'add new column' after col1); alter table complex_table add columns(col_struct.col_name string comment 'add new column to a struct col' after col_from_col_struct);
  • Hudi表类型 Copy On Write 写时复制表也简称cow表,使用parquet文件存储数据,内部的更新操作需要通过重写原始parquet文件完成。 优点:读取时,只读取对应分区的一个数据文件即可,较为高效。 缺点:数据写入的时候,需要复制一个先前的副本再在其基础上生成新的数据文件,这个过程比较耗时。且由于耗时,读请求读取到的数据相对就会滞后。 Merge On Read 读时合并表也简称mor表,使用列格式parquet和行格式Avro两种方式混合存储数据。其中parquet格式文件用于存储基础数据,Avro格式文件(也可叫做log文件)用于存储增量数据。 优点:由于写入数据先写delta log,且delta log较小,所以写入成本较低。 缺点:需要定期合并整理compact,否则碎片文件较多。读取性能较差,因为需要将delta log和老数据文件合并。
  • 参数描述 表1 CREATE TABLE参数描述 参数 描述 database_name Database名称,由字母、数字和下划线(_)组成。 table_name Database中的表名,由字母、数字和下划线(_)组成。 columnTypeList 以逗号分隔的带数据类型的列表。列名由字母、数字和下划线(_)组成。 using 参数hudi,定义和创建Hudi table。 table_comment 表的描述信息。 location_path HDFS路径,指定该路径Hudi 表会创建为外表。 options_list Hudi table属性列表。
  • 示例 创建非分区表 create table if not exists hudi_table0 ( id int, name string, price double ) using hudi options ( type = 'cow', primaryKey = 'id', preCombineField = 'price' ); 创建分区表 create table if not exists hudi_table_p0 ( id bigint, name string, ts bigint, dt string, hh string ) using hudi options ( type = 'cow', primaryKey = 'id', preCombineField = 'ts' ) partitioned by (dt, hh); 在指定路径下创建表 create table if not exists h3( id bigint, name string, price double ) using hudi options ( primaryKey = 'id', preCombineField = 'price' ) location '/path/to/hudi/h3';
  • 注意事项 Hudi当前不支持使用char、varchar、tinyint、smallint类型,建议使用string或int类型。 Hudi当前只有int、bigint、float、double、decimal、string、date、timestamp、boolean、binary类型支持设置默认值。 Hudi表必须指定primaryKey与preCombineField。 在指定路径下创建表时,如果路径下已存在Hudi表,则建表时不需要指定列。
  • 参数描述 表1 CREATE TABLE As SELECT参数描述 参数 描述 database_name Database名称,由字母、数字和下划线(_)组成。 table_name Database中的表名,由字母、数字和下划线(_)组成。 using 参数hudi,定义和创建Hudi table。 table_comment 表的描述信息。 location_path HDFS路径,指定该路径Hudi表会创建为外表。 options_list Hudi table属性列表。 query_statement select查询表达式
  • 示例 创建分区表 create table h2 using hudi options (type = 'cow', primaryKey = 'id') partitioned by (dt) as select 1 as id, 'a1' as name, 10 as price, 1000 as dt; 创建非分区表 create table h3 using hudi as select 1 as id, 'a1' as name, 10 as price; 从parquet表加载数据到hudi表 # 创建parquet表 create table parquet_mngd using parquet options(path=’hdfs:///tmp/parquet_dataset/*.parquet’); # CTAS创建hudi表 create table hudi_tbl using hudi location 'hdfs:///tmp/hudi/hudi_tbl/' options ( type = 'cow', primaryKey = 'id', preCombineField = 'ts' ) partitioned by (datestr) as select * from parquet_mngd;
  • DDL与DML并发 表2 支持的DDL与DML并发操作 DDL操作 insert into update delete set/reset add Y Y Y Y rename N N Y N change type N N Y N change comment Y Y Y Y drop N N Y N 执行不支持的DDL与DML并发操作时会发生异常“cannot evolution schema implicitly, actions such as rename, delete, and type change were found”。
  • DDL并发 表1 支持的DDL并发操作 DDL操作 add rename change type change comment drop add Y Y Y Y Y rename Y Y Y Y Y change type Y Y Y Y Y change comment Y Y Y Y Y drop Y Y Y Y N 对同一列并发执行DDL操作需要注意以下两点: 不能对同一列并发执行drop,否则只能成功执行第一个drop随后发生异常“java.lang.UnsupportedOperationException: cannot evolution schema implicitly, the column for which the update operation is performed does not exist.”。 drop与rename、change type和change comment并发执行时,drop必须是最后执行,否则只能执行drop以及drop之前的命令,执行drop之后的命令会发生异常“java.lang.UnsupportedOperationException: cannot evolution schema implicitly, the column for which the update operation is performed does not exist.”。