华为云用户手册

  • Structured Streaming可靠性说明 Structured Streaming通过checkpoint和WAL机制,对可重放的sources,以及支持重复处理的幂等性sinks,可以提供端到端的exactly-once容错语义。 用户可在程序中设置option("checkpointLocation", "checkpoint路径")启用checkpoint。 从checkpoint恢复时,应用程序或者配置可能发生变更,有部分变更会导致从checkpoint恢复失败,具体限制如下: 不允许source的个数或者类型发生变化。 source的参数变化,这种情况是否能被支持,取决于source类型和查询语句,例如: 速率控制相关参数的添加、删除和修改,此种情况能被支持,如:spark.readStream.format("kafka").option("subscribe", "topic")变更为spark.readStream.format("kafka").option("subscribe", "topic").option("maxOffsetsPerTrigger", ...) 修改消费的topic/files可能会出现不可预知的问题,如:spark.readStream.format("kafka").option("subscribe", "topic")变更为spark.readStream.format("kafka").option("subscribe", "newTopic") sink的类型发生变化:允许特定的几个sink的组合,具体场景需要验证确认,例如: File sink允许变更为kafka sink,kafka中只处理新数据。 kafka sink不允许变更为file sink。 kafka sink允许变更为foreach sink,反之亦然。 sink的参数变化,这种情况是否能被支持,取决于sink类型和查询语句,例如: 不允许file sink的输出路径发生变更。 允许Kafka sink的输出topic发生变更。 允许foreach sink中的自定义算子代码发生变更,但是变更结果取决于用户代码。 Projection、filter和map-like操作变更,局部场景下能够支持,例如: 支持Filter的添加和删除,如:sdf.selectExpr("a")变更为sdf.where(...).selectExpr("a").filter(...) Output schema相同时,projections允许变更,如:sdf.selectExpr("stringColumn AS json").writeStream变更为sdf.select(to_json(...).as("json")).writeStream Output schema不相同时,projections在部分条件下允许变更,如:sdf.selectExpr("a").writeStream变更为sdf.selectExpr("b").writeStream,只有当sink支持“a”到“b”的schema转换时才不会出错。 状态操作的变更,在部分场景下会导致状态恢复失败: Streaming aggregation:如sdf.groupBy("a").agg(...)操作中,不允许分组键或聚合键的类型或者数量发生变化。 Streaming deduplication:如:sdf.dropDuplicates("a")操作中,不允许分组键或聚合键的类型或者数量发生变化。 Stream-stream join:如sdf1.join(sdf2, ...)操作中,关联键的schema不允许发生变化,join类型不允许发生变化,其他join条件的变更可能导致不确定性结果。 任意状态计算:如sdf.groupByKey(...).mapGroupsWithState(...)或者sdf.groupByKey(...).flatMapGroupsWithState(...)操作中,用户自定义状态的schema或者超时类型都不允许发生变化;允许用户自定义state-mapping函数变化,但是变更结果取决于用户代码;如果需要支持schema变更,用户可以将状态数据编码/解码成二进制数据以支持schema迁移。 Source的容错性支持列表 Sources 支持的Options 容错支持 说明 File source path:必填,文件路径 maxFilesPerTrigger:每次trigger最大文件数(默认无限大) latestFirst:是否有限处理新文件(默认值: false) fileNameOnly:是否以文件名作为新文件校验,而不是使用完整路径进行判断(默认值: false) 支持 支持通配符路径,但不支持以逗号分隔的多个路径。 文件必须以原子方式放置在给定的目录中,这在大多数文件系统中可以通过文件移动操作实现。 Socket Source host:连接的节点ip,必填 port:连接的端口,必填 不支持 - Rate Source rowsPerSecond:每秒产生的行数,默认值1 rampUpTime:在达到rowsPerSecond速度之前的上升时间 numPartitions:生成数据行的并行度 支持 - Kafka Source 参见https://archive.apache.org/dist/spark/docs/3.3.1/structured-streaming-kafka-integration.html 支持 - Sink的容错性支持列表 Sinks 支持的output模式 支持Options 容错性 说明 File Sink Append Path:必须指定 指定的文件格式,参见DataFrameWriter中的相关接口 exactly-once 支持写入分区表,按时间分区用处较大 Kafka Sink Append, Update, Complete 参见:https://archive.apache.org/dist/spark/docs/3.3.1/structured-streaming-kafka-integration.html at-least-once 参见https://archive.apache.org/dist/spark/docs/3.3.1/structured-streaming-kafka-integration.html Foreach Sink Append, Update, Complete None 依赖于ForeachWriter实现 参见https://archive.apache.org/dist/spark/docs/3.3.1/structured-streaming-programming-guide.html#using-foreach ForeachBatch Sink Append, Update, Complete None 依赖于算子实现 参见https://spark.apache.org/docs/latest/structured-streaming-programming-guide.html#using-foreach-and-foreachbatch Console Sink Append, Update, Complete numRows:每轮打印的行数,默认20 truncate:输出太长时是否清空,默认true 不支持容错 - Memory Sink Append, Complete None 不支持容错,在complete模式下,重启query会重建整个表 -
  • Structured Streaming不支持的功能 不支持多个流聚合。 不支持limit、first、take这些取N条Row的操作。 不支持Distinct。 只有当output mode为complete时才支持排序操作。 有条件地支持流和静态数据集之间的外连接。 不支持部分DataSet上立即运行查询并返回结果的操作: count():无法从流式Dataset返回单个计数,而是使用ds.groupBy().count()返回一个包含运行计数的streaming Dataset。 foreach():使用ds.writeStream.foreach(...)代替。 show():使用输出console sink代替。
  • Structured Streaming支持的功能 支持对流式数据的ETL操作。 支持流式DataFrames或Datasets的schema推断和分区。 流式DataFrames或Datasets上的操作:包括无类型,类似SQL的操作(比如select、where、groupBy),以及有类型的RDD操作(比如map、filter、flatMap)。 支持基于Event Time的聚合计算,支持对迟到数据的处理。 支持对流式数据的去除重复数据操作。 支持状态计算。 支持对流处理任务的监控。 支持批流join,流流join。 当前JOIN操作支持列表如下: 左表 右表 支持的Join类型 说明 Static Static 全部类型 即使在流处理中,不涉及流数据的join操作也能全部支持 Stream Static Inner 支持,但是无状态 Left Outer 支持,但是无状态 Right Outer 不支持 Full Outer 不支持 Stream Stream Inner 支持,左右表可选择使用watermark或者时间范围进行状态清理 Left Outer 有条件的支持,左表可选择使用watermark进行状态清理,右表必须使用watermark+时间范围 Right Outer 有条件的支持,右表可选择使用watermark进行状态清理,左表必须使用watermark+时间范围 Full Outer 不支持
  • ClickHouse应用开发流程介绍 开发流程中各阶段的说明如图1和表1所示。 图1 ClickHouse应用程序开发流程 表1 ClickHouse应用开发的流程说明 阶段 说明 参考文档 了解基本概念 在开始开发应用前,需要了解ClickHouse的基本概念。 基本概念 准备开发和运行环境 ClickHouse的应用程序支持多种语言开发,主要为Java语言,推荐使用IntelliJ IDEA工具,请根据指导完成开发环境配置。 准备ClickHouse应用开发和运行环境 根据场景开发工程 提供样例工程,帮助用户快速了解ClickHouse各部件的编程接口。 导入并配置ClickHouse样例工程 运行程序及查询结果 用户可以直接通过运行结果查看应用程序运行情况。 在本地Windows环境中调测ClickHouse应用( MRS 3.3.0之前版本) 在Linux环境中调测ClickHouse应用(MRS 3.3.0之前版本) 父主题: ClickHouse开发指南(安全模式)
  • 查看调测结果 ClickHouse应用程序运行完成后,可通过以下方式查看程序运行情况: 通过运行结果查看程序运行情况。 通过ClickHouse日志获取应用运行情况。 即查看当前jar文件所在目录的“logs/clickhouse-example.log”日志文件,例如“客户端安装目录/JDBC/logs/clickhouse-example.log”。 jar包运行结果如下: 2021-06-10 20:53:56,028 | INFO | main | Current load balancer is 10.112.17.150:21426 | com.huawei.clickhouse.examples.Util.insertData(Util.java:128)2021-06-10 20:53:58,247 | INFO | main | Inert batch time is 1442 ms | com.huawei.clickhouse.examples.Util.insertData(Util.java:145)2021-06-10 20:53:59,649 | INFO | main | Inert batch time is 1313 ms | com.huawei.clickhouse.examples.Util.insertData(Util.java:145)2021-06-10 20:54:05,872 | INFO | main | Inert batch time is 6132 ms | com.huawei.clickhouse.examples.Util.insertData(Util.java:145)2021-06-10 20:54:10,223 | INFO | main | Inert batch time is 4272 ms | com.huawei.clickhouse.examples.Util.insertData(Util.java:145)2021-06-10 20:54:11,614 | INFO | main | Inert batch time is 1300 ms | com.huawei.clickhouse.examples.Util.insertData(Util.java:145)2021-06-10 20:54:12,871 | INFO | main | Inert batch time is 1200 ms | com.huawei.clickhouse.examples.Util.insertData(Util.java:145)2021-06-10 20:54:14,589 | INFO | main | Inert batch time is 1663 ms | com.huawei.clickhouse.examples.Util.insertData(Util.java:145)2021-06-10 20:54:16,141 | INFO | main | Inert batch time is 1500 ms | com.huawei.clickhouse.examples.Util.insertData(Util.java:145)2021-06-10 20:54:17,690 | INFO | main | Inert batch time is 1498 ms | com.huawei.clickhouse.examples.Util.insertData(Util.java:145)2021-06-10 20:54:19,206 | INFO | main | Inert batch time is 1468 ms | com.huawei.clickhouse.examples.Util.insertData(Util.java:145)2021-06-10 20:54:19,207 | INFO | main | Inert all batch time is 22626 ms | com.huawei.clickhouse.examples.Util.insertData(Util.java:148)2021-06-10 20:54:19,208 | INFO | main | Current load balancer is 10.112.17.150:21426 | com.huawei.clickhouse.examples.Util.exeSql(Util.java:58)2021-06-10 20:54:20,231 | INFO | main | Execute query:select * from mutong1.testtb_all order by age limit 10 | com.huawei.clickhouse.examples.Util.exeSql(Util.java:63)2021-06-10 20:54:21,266 | INFO | main | Execute time is 1035 ms | com.huawei.clickhouse.examples.Util.exeSql(Util.java:67)2021-06-10 20:54:21,267 | INFO | main | Current load balancer is 10.112.17.150:21426 | com.huawei.clickhouse.examples.Util.exeSql(Util.java:58)2021-06-10 20:54:21,815 | INFO | main | Execute query:select toYYYYMM(date),count(1) from mutong1.testtb_all group by toYYYYMM(date) order by count(1) DESC limit 10 | com.huawei.clickhouse.examples.Util.exeSql(Util.java:63)2021-06-10 20:54:22,897 | INFO | main | Execute time is 1082 ms | com.huawei.clickhouse.examples.Util.exeSql(Util.java:67)2021-06-10 20:54:22,898 | INFO | main | nameagedate | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:144)2021-06-10 20:54:22,898 | INFO | main | huawei_26602021-12-19 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:144)2021-06-10 20:54:22,899 | INFO | main | huawei_250002021-12-29 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:144)2021-06-10 20:54:22,899 | INFO | main | huawei_898002021-12-16 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:144)2021-06-10 20:54:22,899 | INFO | main | huawei_67102021-12-29 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:144)2021-06-10 20:54:22,899 | INFO | main | huawei_222502021-12-12 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:144)2021-06-10 20:54:22,899 | INFO | main | huawei_604002021-12-14 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:144)2021-06-10 20:54:22,899 | INFO | main | huawei_729402021-12-10 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:144)2021-06-10 20:54:22,899 | INFO | main | huawei_113302021-12-25 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:144)2021-06-10 20:54:22,900 | INFO | main | huawei_316102021-12-21 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:144)2021-06-10 20:54:22,900 | INFO | main | huawei_399202021-11-25 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:144)2021-06-10 20:54:22,900 | INFO | main | toYYYYMM(date)count() | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:144)2021-06-10 20:54:22,900 | INFO | main | 2019102247 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:144)2021-06-10 20:54:22,900 | INFO | main | 2021052213 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:144)2021-06-10 20:54:22,900 | INFO | main | 2018012208 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:144)2021-06-10 20:54:22,900 | INFO | main | 2018032204 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:144)2021-06-10 20:54:22,901 | INFO | main | 2018102167 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:144)2021-06-10 20:54:22,901 | INFO | main | 2018052166 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:144)2021-06-10 20:54:22,901 | INFO | main | 2019012164 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:144)2021-06-10 20:54:22,901 | INFO | main | 2019082145 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:144)2021-06-10 20:54:22,901 | INFO | main | 2019122143 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:144)2021-06-10 20:54:22,901 | INFO | main | 2021072137 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:144)
  • 查看调测结果 ClickHouse应用程序运行完成后,可通过以下方式查看程序运行情况: 通过运行结果查看程序运行情况。 通过ClickHouse日志获取应用运行情况,即“logs”目录下的日志文件:clickhouse-example.log。 运行clickhouse-examples的完整样例后,控制台显示部分运行结果如下: 2023-09-19 16:20:48,344 | INFO | main | loadBalancerIPList is 192.168.5.132, loadBalancerHttpPort is 21422, user is ck_user, clusterName is default_cluster, isSec is true, password is Admin12!. | com.huawei.clickhouse.examples.Demo.main(Demo.java:42)2023-09-19 16:20:48,350 | INFO | main | ckLbServerList current member is 0, ClickhouseBalancer is 192.168.5.132:21422 | com.huawei.clickhouse.examples.Demo.getCkLbServerList(Demo.java:110)2023-09-19 16:20:48,436 | INFO | main | Current load balancer is 192.168.5.132:21422 | com.huawei.clickhouse.examples.Util.exeSql(Util.java:68)2023-09-19 16:20:50,781 | INFO | main | Execute query:drop table if exists testdb.testtb on cluster default_cluster no delay | com.huawei.clickhouse.examples.Util.exeSql(Util.java:73)2023-09-19 16:20:51,504 | INFO | main | Execute time is 723 ms | com.huawei.clickhouse.examples.Util.exeSql(Util.java:77)2023-09-19 16:20:51,511 | INFO | main | Current load balancer is 192.168.5.132:21422 | com.huawei.clickhouse.examples.Util.exeSql(Util.java:68)2023-09-19 16:20:51,897 | INFO | main | Execute query:drop table if exists testdb.testtb_all on cluster default_cluster no delay | com.huawei.clickhouse.examples.Util.exeSql(Util.java:73)2023-09-19 16:20:52,421 | INFO | main | Execute time is 524 ms | com.huawei.clickhouse.examples.Util.exeSql(Util.java:77)2023-09-19 16:20:52,422 | INFO | main | Current load balancer is 192.168.5.132:21422 | com.huawei.clickhouse.examples.Util.exeSql(Util.java:68)2023-09-19 16:20:52,946 | INFO | main | Execute query:create database if not exists testdb on cluster default_cluster | com.huawei.clickhouse.examples.Util.exeSql(Util.java:73)2023-09-19 16:20:53,405 | INFO | main | Execute time is 458 ms | com.huawei.clickhouse.examples.Util.exeSql(Util.java:77)2023-09-19 16:20:53,406 | INFO | main | Current load balancer is 192.168.5.132:21422 | com.huawei.clickhouse.examples.Util.exeSql(Util.java:68)2023-09-19 16:20:53,757 | INFO | main | Execute query:create table testdb.testtb on cluster default_cluster (name String, age UInt8, date Date)engine=ReplicatedMergeTree('/clickhouse/tables/{shard}/testdb.testtb','{replica}') partition by toYYYYMM(date) order by age | com.huawei.clickhouse.examples.Util.exeSql(Util.java:73)2023-09-19 16:20:54,243 | INFO | main | Execute time is 485 ms | com.huawei.clickhouse.examples.Util.exeSql(Util.java:77)2023-09-19 16:20:54,244 | INFO | main | Current load balancer is 192.168.5.132:21422 | com.huawei.clickhouse.examples.Util.exeSql(Util.java:68)2023-09-19 16:20:54,640 | INFO | main | Execute query:create table testdb.testtb_all on cluster default_cluster as testdb.testtb ENGINE = Distributed(default_cluster,testdb,testtb, rand()); | com.huawei.clickhouse.examples.Util.exeSql(Util.java:73)2023-09-19 16:20:55,175 | INFO | main | Execute time is 535 ms | com.huawei.clickhouse.examples.Util.exeSql(Util.java:77)2023-09-19 16:20:55,175 | INFO | main | Current load balancer is 192.168.5.132:21422 | com.huawei.clickhouse.examples.Util.insertData(Util.java:143)2023-09-19 16:20:58,868 | INFO | main | Insert batch time is 503 ms | com.huawei.clickhouse.examples.Util.insertData(Util.java:160)2023-09-19 16:21:01,015 | INFO | main | Insert batch time is 631 ms | com.huawei.clickhouse.examples.Util.insertData(Util.java:160)2023-09-19 16:21:02,521 | INFO | main | Inert all batch time is 4163 ms | com.huawei.clickhouse.examples.Util.insertData(Util.java:164)2023-09-19 16:21:02,522 | INFO | main | Current load balancer is 192.168.5.132:21422 | com.huawei.clickhouse.examples.Util.exeSql(Util.java:68)2023-09-19 16:21:03,051 | INFO | main | Execute query:select * from testdb.testtb_all order by age limit 10 | com.huawei.clickhouse.examples.Util.exeSql(Util.java:73)2023-09-19 16:21:03,430 | INFO | main | Execute time is 379 ms | com.huawei.clickhouse.examples.Util.exeSql(Util.java:77)2023-09-19 16:21:03,433 | INFO | main | Current load balancer is 192.168.5.132:21422 | com.huawei.clickhouse.examples.Util.exeSql(Util.java:68)2023-09-19 16:21:03,760 | INFO | main | Execute query:select toYYYYMM(date),count(1) from testdb.testtb_all group by toYYYYMM(date) order by count(1) DESC limit 10 | com.huawei.clickhouse.examples.Util.exeSql(Util.java:73)2023-09-19 16:21:04,361 | INFO | main | Execute time is 600 ms | com.huawei.clickhouse.examples.Util.exeSql(Util.java:77)2023-09-19 16:21:04,362 | INFO | main | nameagedate | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:158)2023-09-19 16:21:04,362 | INFO | main | huawei_9122021-04-20 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:158)2023-09-19 16:21:04,362 | INFO | main | huawei_17152021-05-23 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:158)2023-09-19 16:21:04,363 | INFO | main | huawei_5242021-04-15 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:158)2023-09-19 16:21:04,363 | INFO | main | huawei_13392020-07-04 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:158)2023-09-19 16:21:04,363 | INFO | main | huawei_3492021-06-27 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:158)2023-09-19 16:21:04,363 | INFO | main | huawei_15502020-06-26 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:158)2023-09-19 16:21:04,363 | INFO | main | huawei_11532020-08-14 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:158)2023-09-19 16:21:04,363 | INFO | main | huawei_12562021-12-19 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:158)2023-09-19 16:21:04,363 | INFO | main | huawei_19572021-10-31 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:158)2023-09-19 16:21:04,363 | INFO | main | huawei_0572020-03-01 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:158)2023-09-19 16:21:04,363 | INFO | main | toYYYYMM(date)count() | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:158)2023-09-19 16:21:04,364 | INFO | main | 2021053 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:158)2023-09-19 16:21:04,364 | INFO | main | 2021102 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:158)2023-09-19 16:21:04,364 | INFO | main | 2021042 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:158)2023-09-19 16:21:04,364 | INFO | main | 2020082 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:158)2023-09-19 16:21:04,364 | INFO | main | 2020072 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:158)2023-09-19 16:21:04,364 | INFO | main | 2021062 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:158)2023-09-19 16:21:04,364 | INFO | main | 2020121 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:158)2023-09-19 16:21:04,364 | INFO | main | 2021091 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:158)2023-09-19 16:21:04,364 | INFO | main | 2020031 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:158)2023-09-19 16:21:04,365 | INFO | main | 2020111 | com.huawei.clickhouse.examples.Demo.queryData(Demo.java:158)2023-09-19 16:21:05,044 | INFO | main | Name is: huawei_9, age is: 12 | com.huawei.clickhouse.examples.ClickhouseJDBCHaDemo.queryData(ClickhouseJDBCHaDemo.java:78)2023-09-19 16:21:05,044 | INFO | main | Name is: huawei_17, age is: 15 | com.huawei.clickhouse.examples.ClickhouseJDBCHaDemo.queryData(ClickhouseJDBCHaDemo.java:78)2023-09-19 16:21:05,045 | INFO | main | Name is: huawei_5, age is: 24 | com.huawei.clickhouse.examples.ClickhouseJDBCHaDemo.queryData(ClickhouseJDBCHaDemo.java:78)2023-09-19 16:21:05,045 | INFO | main | Name is: huawei_13, age is: 39 | com.huawei.clickhouse.examples.ClickhouseJDBCHaDemo.queryData(ClickhouseJDBCHaDemo.java:78)2023-09-19 16:21:05,045 | INFO | main | Name is: huawei_3, age is: 49 | com.huawei.clickhouse.examples.ClickhouseJDBCHaDemo.queryData(ClickhouseJDBCHaDemo.java:78)2023-09-19 16:21:05,045 | INFO | main | Name is: huawei_15, age is: 50 | com.huawei.clickhouse.examples.ClickhouseJDBCHaDemo.queryData(ClickhouseJDBCHaDemo.java:78)2023-09-19 16:21:05,045 | INFO | main | Name is: huawei_11, age is: 53 | com.huawei.clickhouse.examples.ClickhouseJDBCHaDemo.queryData(ClickhouseJDBCHaDemo.java:78)2023-09-19 16:21:05,045 | INFO | main | Name is: huawei_12, age is: 56 | com.huawei.clickhouse.examples.ClickhouseJDBCHaDemo.queryData(ClickhouseJDBCHaDemo.java:78)2023-09-19 16:21:05,045 | INFO | main | Name is: huawei_19, age is: 57 | com.huawei.clickhouse.examples.ClickhouseJDBCHaDemo.queryData(ClickhouseJDBCHaDemo.java:78)2023-09-19 16:21:05,046 | INFO | main | Name is: huawei_0, age is: 57 | com.huawei.clickhouse.examples.ClickhouseJDBCHaDemo.queryData(ClickhouseJDBCHaDemo.java:78)Process finished with exit code 0
  • 查看调测结果 IoTDB应用程序运行完成后,可通过IntelliJ IDEA运行结果查看应用程序运行情况。 JDBCExample样例程序运行结果如下所示: ...--------------------------Time root.sg.d1.s1 root.company.line2.device1.temperature root.company.line2.device1.speed root.company.line2.device2.speed root.company.line2.device2.status root.company.line1.device1.spin root.company.line1.device1.status root.company.line1.device2.temperature root.company.line1.device2.power root.sg1.d1.s3 root.sg1.d1.s1 root.sg1.d1.s2 0, null, null, null, null, null, null, null, null, null, 1.0, 1.0, 1.01, null, null, null, null, null, null, null, null, null, 1.0, 1.0, 1.02, null, null, null, null, null, null, null, null, null, 1.0, 1.0, 1.03, null, null, null, null, null, null, null, null, null, 1.0, 1.0, 1.04, null, null, null, null, null, null, null, null, null, 1.0, 1.0, 1.05, null, null, null, null, null, null, null, null, null, 1.0, 1.0, 1.06, null, null, null, null, null, null, null, null, null, 1.0, 1.0, 1.07, null, null, null, null, null, null, null, null, null, 1.0, 1.0, 1.08, null, null, null, null, null, null, null, null, null, 1.0, 1.0, 1.09, null, null, null, null, null, null, null, null, null, 1.0, 1.0, 1.010, null, null, null, null, null, null, null, null, null, 1.0, 1.0, 1.0----------------------------------------------------count(root.sg.d1.s1) count(root.company.line2.device1.temperature) count(root.company.line2.device1.speed) count(root.company.line2.device2.speed) count(root.company.line2.device2.status) count(root.company.line1.device1.spin) count(root.company.line1.device1.status) count(root.company.line1.device2.temperature) count(root.company.line1.device2.power) count(root.sg1.d1.s3) count(root.sg1.d1.s1) count(root.sg1.d1.s2) 8237, 1, 1, 1, 1, 1, 1, 1, 1, 101, 101, 101----------------------------------------------------Time count(root.sg.d1.s1) count(root.company.line2.device1.temperature) count(root.company.line2.device1.speed) count(root.company.line2.device2.speed) count(root.company.line2.device2.status) count(root.company.line1.device1.spin) count(root.company.line1.device1.status) count(root.company.line1.device2.temperature) count(root.company.line1.device2.power) count(root.sg1.d1.s3) count(root.sg1.d1.s1) count(root.sg1.d1.s2) 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 1920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 2040, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 2060, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 2080, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 20-------------------------- FlinkIoTDBSink样例程序运行结果如下所示: ...19:53:41.532 [flink-akka.actor.default-dispatcher-9] DEBUG org.apache.flink.runtime.resourcemanager.StandaloneResourceManager - Received heartbeat from 5153e4ff24b25b13225f1bf67a4312d8.19:53:41.800 [flink-akka.actor.default-dispatcher-9] DEBUG org.apache.flink.runtime.jobmaster.JobMaster - Trigger heartbeat request.19:53:41.800 [flink-akka.actor.default-dispatcher-10] DEBUG org.apache.flink.runtime.taskexecutor.TaskExecutor - Received heartbeat request from 5153e4ff24b25b13225f1bf67a4312d8.19:53:41.802 [flink-akka.actor.default-dispatcher-9] DEBUG org.apache.flink.runtime.jobmaster.JobMaster - Received heartbeat from 7d6ef313-3f78-4cee-bbb1-e234dcac6d30.19:53:42.988 [pool-3-thread-1] DEBUG org.apache.iotdb.flink.IoTDBSink - send event successfully19:53:42.988 [pool-6-thread-1] DEBUG org.apache.iotdb.flink.IoTDBSink - send event successfully19:53:42.990 [pool-4-thread-1] DEBUG org.apache.iotdb.flink.IoTDBSink - send event successfully19:53:45.990 [pool-7-thread-1] DEBUG org.apache.iotdb.flink.IoTDBSink - send event successfully19:53:45.992 [pool-9-thread-1] DEBUG org.apache.iotdb.flink.IoTDBSink - send event successfully19:53:45.994 [pool-5-thread-1] DEBUG org.apache.iotdb.flink.IoTDBSink - send event successfully IoTDB Kafka样例程序运行结果如下所示: Producer.java ...[2022-01-15 15:12:34,221] INFO New Producer: start. (com.huawei.bigdata.iotdb.Producer)[2022-01-15 15:12:39,369] INFO [Producer clientId=DemoProducer] Cluster ID: uDtuaWS_QUK02EtuZQ4Xew (org.apache.kafka.clients.Metadata)[2022-01-15 15:12:57,077] INFO The Producer have send 100 messages. (com.huawei.bigdata.iotdb.Producer)[2022-01-15 15:13:04,691] INFO The Producer have send 200 messages. (com.huawei.bigdata.iotdb.Producer)[2022-01-15 15:13:11,355] INFO The Producer have send 300 messages. (com.huawei.bigdata.iotdb.Producer)[2022-01-15 15:13:17,758] INFO The Producer have send 400 messages. (com.huawei.bigdata.iotdb.Producer)[2022-01-15 15:13:24,335] INFO The Producer have send 500 messages. (com.huawei.bigdata.iotdb.Producer)[2022-01-15 15:13:30,739] INFO The Producer have send 600 messages. (com.huawei.bigdata.iotdb.Producer)[2022-01-15 15:13:37,267] INFO The Producer have send 700 messages. (com.huawei.bigdata.iotdb.Producer) KafkaConsumerMultThread.java ...[2022-01-15 15:19:27,563] INFO Consumer Thread-1 partitions:1 record: sensor_29,1642231023769,1.000000 offsets: 828 (com.huawei.bigdata.iotdb.KafkaConsumerMultThread)[2022-01-15 15:19:27,612] INFO Consumer Thread-1 partitions:1 record: sensor_31,1642231023769,1.000000 offsets: 829 (com.huawei.bigdata.iotdb.KafkaConsumerMultThread)[2022-01-15 15:19:27,612] INFO Consumer Thread-0 partitions:0 record: sensor_8,1642231023769,1.000000 offsets: 842 (com.huawei.bigdata.iotdb.KafkaConsumerMultThread)[2022-01-15 15:19:27,665] INFO Consumer Thread-1 partitions:1 record: sensor_32,1642231023769,1.000000 offsets: 830 (com.huawei.bigdata.iotdb.KafkaConsumerMultThread)[2022-01-15 15:19:27,665] INFO Consumer Thread-0 partitions:0 record: sensor_9,1642231023769,1.000000 offsets: 843 (com.huawei.bigdata.iotdb.KafkaConsumerMultThread)[2022-01-15 15:19:27,732] INFO Consumer Thread-1 partitions:1 record: sensor_33,1642231023769,1.000000 offsets: 831 (com.huawei.bigdata.iotdb.KafkaConsumerMultThread)[2022-01-15 15:19:27,732] INFO Consumer Thread-0 partitions:0 record: sensor_11,1642231023769,1.000000 offsets: 844 (com.huawei.bigdata.iotdb.KafkaConsumerMultThread)[2022-01-15 15:19:27,786] INFO Consumer Thread-0 partitions:0 record: sensor_12,1642231023769,1.000000 offsets: 845 (com.huawei.bigdata.iotdb.KafkaConsumerMultThread)[2022-01-15 15:19:27,786] INFO Consumer Thread-1 partitions:1 record: sensor_35,1642231023769,1.000000 offsets: 832 (com.huawei.bigdata.iotdb.KafkaConsumerMultThread)
  • 准备本地应用开发环境 在进行应用开发时,要准备的开发和运行环境如表1所示。 表1 开发环境 准备项 说明 操作系统 开发环境:Windows系统,支持Windows7以上版本。 运行环境:Linux系统。 如需在本地调测程序,运行环境需要和集群业务平面网络互通。 安装JDK 开发和运行环境的基本配置,版本要求如下: 服务端和客户端仅支持集群自带的OpenJDK,不允许替换。 对于客户应用需引用SDK类的Jar包运行在客户应用进程中的: X86客户端: Oracle JDK:支持1.8版本; IBM JDK:支持1.8.0.7.20和1.8.0.6.15版本。 ARM客户端: OpenJDK:支持1.8.0_272版本(集群自带JDK,可通过集群客户端安装目录中“JDK”文件夹下获取)。 毕昇JDK:支持1.8.0_272版本。 说明: 基于安全考虑,服务端只支持TLS V1.2及以上的加密协议。 IBM JDK默认只支持TLS V1.0,若使用IBM JDK,请配置启动参数“com.ibm.jsse2.overrideDefaultTLS”为“true”,设置后可以同时支持TLS V1.0/V1.1/V1.2,详情可参考https://www.ibm.com/support/knowledgecenter/zh/SSYKE2_8.0.0/com.ibm.java.security.component.80.doc/security-component/jsse2Docs/matchsslcontext_tls.html#matchsslcontext_tls。 毕昇JDK详细信息可参考https://www.hikunpeng.com/zh/developer/devkit/compiler/jdk。 安装和配置IntelliJ IDEA 开发环境的基本配置,建议使用2019.1或其他兼容版本。 说明: 若使用IBM JDK,请确保IntelliJ IDEA中的JDK配置为IBM JDK。 若使用Oracle JDK,请确保IntelliJ IDEA中的JDK配置为Oracle JDK。 若使用Open JDK,请确保IntelliJ IDEA中的JDK配置为Open JDK。 不同的IntelliJ IDEA不要使用相同的workspace和相同路径下的示例工程。 安装Maven 开发环境的基本配置。用于项目管理,贯穿软件开发生命周期。 华为提供开源镜像站,各服务样例工程依赖的Jar包通过华为开源镜像站下载,剩余所依赖的开源Jar包请直接从Maven中央库或者其他用户自定义的仓库地址下载,详情请参考配置华为开源镜像仓。 7-zip 用于解压“*.zip”和“*.rar”文件,支持7-Zip 16.04版本。 父主题: 准备Doris应用开发环境
  • 配置运行环境网络 用于程序调测或运行的节点,需要与MRS集群内节点网络互通,同时配置hosts 域名 信息。 场景一:配置本地Windows开发环境与MRS集群节点内网络互通。 登录 FusionInsight Manager,在“主页”右上方单击“下载客户端”,“选择客户端类型”设置为“仅配置文件”,单击“确定”,等待客户端文件包生成后根据浏览器提示下载客户端到本地并解压。 例如,客户端配置文件压缩包为“FusionInsight_Cluster_1_Services_Client.tar”,解压后得到“FusionInsight_Cluster_1_Services_ClientConfig_ConfigFiles.tar”,继续解压该文件。 复制解压目录下的“hosts”文件中的内容到本地hosts文件中。 在应用开发过程中,如需在本地Windows系统中调测应用程序,需要确保本地节点能与“hosts”文件中所列出的各主机在网络上互通。 Windows本地hosts文件存放路径举例:“C:\WINDOWS\system32\drivers\etc\hosts”。 场景二:配置Linux环境与MRS集群节点内网络互通。 在节点中安装MRS集群客户端。 例如客户端安装目录为“/opt/client”。 获取配置文件: 登录FusionInsight Manager,在“主页”右上方单击“下载客户端”,“选择客户端类型”设置为“仅配置文件”,勾选“仅保存到如下路径”,单击“确定”,下载客户端配置文件至集群主 OMS 点。 以root登录主OMS节点,进入客户端配置文件所在路径(默认为“/tmp/FusionInsight-Client/”)。 例如客户端软件包为“FusionInsight_Cluster_1_Services_Client.tar”,下载路径为主管理节点的“/tmp/FusionInsight-Client”: cd /tmp/FusionInsight-Client tar -xvf FusionInsight_Cluster_1_Services_Client.tar tar -xvf FusionInsight_Cluster_1_Services_ClientConfig_ConfigFiles.tar cd FusionInsight_Cluster_1_Services_ClientConfig_ConfigFiles 检查客户端节点网络连接。 在安装客户端过程中,系统会自动配置客户端节点“hosts”文件,建议检查“/etc/hosts”文件内是否包含集群内节点的主机名信息,如未包含,需要手动复制解压目录下的“hosts”文件中的内容到客户端所在节点的hosts文件中,确保本地机器能与集群各主机在网络上互通。
  • 删除Doris表 本章节介绍删除Doris表样例代码。 以下代码片段在“JDBCExample”类中。 以Java JDBC方式执行SQl语句删除集群中的dbName.tableName表。 String dropSql = "drop table " + dbName + "." + tableName; public static void execDDL(Connection connection, String sql) throws Exception { try (PreparedStatement statement = connection.prepareStatement(sql)) { statement.execute(); } catch (Exception e) { logger.error("Execute sql {} failed.", sql, e); throw new Exception(e); }} 父主题: Doris JDBC接口调用样例程序
  • 代码样例 以下为代码片段示例: package com.huawei.bigdata.iotdb;import org.apache.iotdb.udf.api.UDTF;import org.apache.iotdb.udf.api.access.Row;import org.apache.iotdb.udf.api.collector.PointCollector;import org.apache.iotdb.udf.api.customizer.config.UDTFConfigurations;import org.apache.iotdb.udf.api.customizer.parameter.UDFParameters;import org.apache.iotdb.udf.api.customizer.strategy.RowByRowAccessStrategy;import org.apache.iotdb.udf.api.type.Type;import java.io.IOException;public class UDTFExample implements UDTF { @Override public void beforeStart(UDFParameters parameters, UDTFConfigurations configurations) { configurations.setAccessStrategy(new RowByRowAccessStrategy()).setOutputDataType(Type.INT32); } @Override public void transform(Row row, PointCollector collector) throws IOException { collector.putInt(row.getTime(), -row.getInt(0)); }}
  • Doris应用开发开发流程介绍 开发流程中各阶段的说明如下图所示。 图1 Doris应用程序开发流程 表1 Doris应用开发的流程说明 阶段 说明 参考文档 准备开发环境 在进行应用开发前,需首先准备开发环境,推荐使用Java语言进行开发,使用IntelliJ IDEA工具,同时完成JDK、Maven等初始配置。 准备本地应用开发环境 准备连接集群配置文件 应用程序开发或运行过程中,需通过集群相关配置文件信息连接MRS集群,配置文件通常包括用于安全认证的用户文件,可从已创建好的MRS集群中获取相关内容。 用于程序调测或运行的节点,需要与MRS集群内节点网络互通,同时配置hosts域名信息。 准备连接Doris集群配置文件 配置并导入样例工程 Doris提供了不同场景下的多种样例程序,用户可获取样例工程并导入本地开发环境中进行程序学习。 配置并导入JDBC样例工程 配置并导入SpringBoot样例工程 配置安全认证 使用JDBC或SpringBoot接口连接Doris时,需配置具有Doris管理员权限的用户进行安全认证。 根据业务场景开发程序 根据实际业务场景开发程序,调用组件接口实现对应功能。 Doris JDBC接口调用样例程序 编译并运行程序 将开发好的程序编译运行,用户可在本地Windows开发环境中进行程序调测运行,也可以将程序编译为Jar包后,提交到Linux节点上运行。 调测Doris应用 父主题: Doris开发指南(普通模式)
  • 创建Doris连接 以下代码片段在“JDBCExample”类的“createConnection”方法中。 USER和PASSWD为在创建连接时用于进行安全认证的用户名和密码。 Class.forName(JDBC_DRIVER);String dbUrl = String.format(DB_URL_PATTERN, HOST, PORT);connection = DriverManager.getConnection(dbUrl, USER, PASSWD); 父主题: Doris JDBC接口调用样例程序
  • 创建Doris数据库 本章节介绍创建Doris数据库样例代码。 以下代码片段在“JDBCExample”类中。 以Java JDBC方式执行SQL语句在集群中创建dbName变量对应的数据库。 String createDatabaseSql = "create database if not exists " + dbName;public static void execDDL(Connection connection, String sql) throws Exception { try (PreparedStatement statement = connection.prepareStatement(sql)) { statement.execute(); } catch (Exception e) { logger.error("Execute sql {} failed.", sql, e); throw new Exception(e); }} 父主题: Doris JDBC接口调用样例程序
  • Doris应用开发流程介绍 开发流程中各阶段的说明如下图所示。 图1 Doris应用程序开发流程 表1 Doris应用开发的流程说明 阶段 说明 参考文档 准备开发环境 在进行应用开发前,需首先准备开发环境,推荐使用Java语言进行开发,使用IntelliJ IDEA工具,同时完成JDK、Maven等初始配置。 准备本地应用开发环境 准备连接集群配置文件 应用程序开发或运行过程中,需通过集群相关配置文件信息连接MRS集群,配置文件通常包括用于安全认证的用户文件,可从已创建好的MRS集群中获取相关内容。 用于程序调测或运行的节点,需要与MRS集群内节点网络互通,同时配置hosts域名信息。 准备连接Doris集群配置文件 配置并导入样例工程 Doris提供了不同场景下的多种样例程序,用户可获取样例工程并导入本地开发环境中进行程序学习。 配置并导入JDBC样例工程 配置并导入SpringBoot样例工程 配置安全认证 使用JDBC或SpringBoot接口连接Doris时,需配置具有Doris管理员权限的用户进行安全认证。 根据业务场景开发程序 根据实际业务场景开发程序,调用组件接口实现对应功能。 Doris JDBC接口调用样例程序 编译并运行程序 将开发好的程序编译运行,用户可在本地Windows开发环境中进行程序调测运行,也可以将程序编译为Jar包后,提交到Linux节点上运行。 调测Doris应用 父主题: Doris开发指南(安全模式)
  • 准备本地应用开发环境 在进行应用开发时,要准备的开发和运行环境如表1所示。 表1 开发环境 准备项 说明 操作系统 开发环境:Windows系统,支持Windows 7以上版本。 运行环境:Windows系统或Linux系统。 如需在本地调测程序,运行环境需要和集群业务平面网络互通。 安装JDK 开发和运行环境的基本配置。版本要求如下: 服务端和客户端仅支持自带的OpenJDK,版本为1.8.0_272,不允许替换。 对于客户应用需引用SDK类的Jar包运行在客户应用进程中的。 X86客户端:Oracle JDK:支持1.8版本;IBM JDK:支持1.8.5.11版本。 说明: 基于安全考虑,服务端只支持TLS V1.2及以上的加密协议。 IBM JDK默认只支持TLS V1.0,若使用IBM JDK,请配置启动参数“com.ibm.jsse2.overrideDefaultTLS”为“true”,设置后可以同时支持TLS V1.0/V1.1/V1.2,详情参见https://www.ibm.com/support/knowledgecenter/zh/SSYKE2_8.0.0/com.ibm.java.security.component.80.doc/security-component/jsse2Docs/matchsslcontext_tls.html#matchsslcontext_tls。 安装和配置IntelliJ IDEA 用于开发IoTDB应用程序的工具,建议使用2019.1或其他兼容版本。 说明: 若使用IBM JDK,请确保IntelliJ IDEA中的JDK配置为IBM JDK。 若使用Oracle JDK,请确保IntelliJ IDEA中的JDK配置为Oracle JDK。 若使用Open JDK,请确保IntelliJ IDEA中的JDK配置为Open JDK。 不同的IntelliJ IDEA不要使用相同的workspace和相同路径下的示例工程。 安装Maven 开发环境的基本配置。用于项目管理,贯穿软件开发生命周期。 华为提供开源镜像站,各服务样例工程依赖的Jar包通过华为开源镜像站下载,剩余所依赖的开源Jar包请直接从Maven中央库或者其他用户自定义的仓库地址下载,详情请参考配置华为开源镜像仓。 7-zip 用于解压“*.zip”和“*.rar”文件,支持7-Zip 16.04版本。 父主题: 准备IoTDB应用开发环境
  • 带“*”查询 假定现在有时间序列“root.sg.d1.s1”和“root.sg.d1.s2”。 执行SELECT example(*) from root.sg.d1 那么结果集中将包括“example(root.sg.d1.s1)”和“example(root.sg.d1.s2)”的结果。 执行SELECT example(s1, *) from root.sg.d1 那么结果集中将包括“example(root.sg.d1.s1, root.sg.d1.s1)”和“example(root.sg.d1.s1, root.sg.d1.s2)”的结果。 执行SELECT example(*, *) from root.sg.d1 那么结果集中将包括“example(root.sg.d1.s1, root.sg.d1.s1)”,“example(root.sg.d1.s2, root.sg.d1.s1)”,“example(root.sg.d1.s1, root.sg.d1.s2)” 和“ example(root.sg.d1.s2, root.sg.d1.s2)”的结果。
  • 带自定义输入参数的查询 用户可以在进行UDF查询的时候,向UDF传入任意数量的键值对参数。键值对中的键和值都需要被单引号或者双引号引起来。 键值对参数只能在时间序列后传入。 例如: SELECT example(s1, 'key1'='value1', 'key2'='value2'), example(*, 'key3'='value3') FROM root.sg.d1;SELECT example(s1, s2, 'key1'='value1', 'key2'='value2') FROM root.sg.d1;
  • 创建Doris表 本章节介绍创建Doris表样例代码。 以下代码片段在“JDBCExample”类中。 以Java JDBC方式执行SQL语句在集群中dbName变量对应的数据库下创建tableName对应的表。 String createTableSql = "create table if not exists " + dbName + "." + tableName + " (\n" + "c1 int not null,\n" + "c2 int not null,\n" + "c3 string not null\n" + ") engine=olap\n" + "unique key(c1, c2)\n" + "distributed by hash(c1) buckets 1"; public static void execDDL(Connection connection, String sql) throws Exception { try (PreparedStatement statement = connection.prepareStatement(sql)) { statement.execute(); } catch (Exception e) { logger.error("Execute sql {} failed.", sql, e); throw new Exception(e); }} 父主题: Doris JDBC接口调用样例程序
  • 带“*”查询 假定现在有时间序列“root.sg.d1.s1”和“root.sg.d1.s2”。 执行SELECT example(*) from root.sg.d1 那么结果集中将包括“example(root.sg.d1.s1)”和“example(root.sg.d1.s2)”的结果。 执行SELECT example(s1, *) from root.sg.d1 那么结果集中将包括“example(root.sg.d1.s1, root.sg.d1.s1)”和“example(root.sg.d1.s1, root.sg.d1.s2)”的结果。 执行SELECT example(*, *) from root.sg.d1 那么结果集中将包括“example(root.sg.d1.s1, root.sg.d1.s1)”,“example(root.sg.d1.s2, root.sg.d1.s1)”,“example(root.sg.d1.s1, root.sg.d1.s2)” 和“ example(root.sg.d1.s2, root.sg.d1.s2)”的结果。
  • 带自定义输入参数的查询 用户可以在进行UDF查询的时候,向UDF传入任意数量的键值对参数。键值对中的键和值都需要被单引号或者双引号引起来。 键值对参数只能在时间序列后传入。 例如: SELECT example(s1, 'key1'='value1', 'key2'='value2'), example(*, 'key3'='value3') FROM root.sg.d1;SELECT example(s1, s2, 'key1'='value1', 'key2'='value2') FROM root.sg.d1;
  • 查看Linux调测结果 “doris-jdbc-example”样例运行成功后,显示信息如下: 2023-08-17 23:13:13,473 | INFO | main | Start execute doris example. | com.huawei.bigdata.doris.example.JDBCExample.main(JDBCExample.java:41)2023-08-17 23:13:13,885 | INFO | main | Start create database. | com.huawei.bigdata.doris.example.JDBCExample.main(JDBCExample.java:44)2023-08-17 23:13:13,949 | INFO | main | Database created successfully. | com.huawei.bigdata.doris.example.JDBCExample.main(JDBCExample.java:46)2023-08-17 23:13:13,950 | INFO | main | Start create table. | com.huawei.bigdata.doris.example.JDBCExample.main(JDBCExample.java:49)2023-08-17 23:13:14,132 | INFO | main | Table created successfully. | com.huawei.bigdata.doris.example.JDBCExample.main(JDBCExample.java:51)2023-08-17 23:13:14,133 | INFO | main | Start to insert data into the table. | com.huawei.bigdata.doris.example.JDBCExample.main(JDBCExample.java:54)2023-08-17 23:13:14,733 | INFO | main | Inserting data to the table succeeded. | com.huawei.bigdata.doris.example.JDBCExample.main(JDBCExample.java:56)2023-08-17 23:13:14,733 | INFO | main | Start to query table data. | com.huawei.bigdata.doris.example.JDBCExample.main(JDBCExample.java:59)2023-08-17 23:13:15,079 | INFO | main | Start to print query result. | com.huawei.bigdata.doris.example.JDBCExample.query(JDBCExample.java:121)2023-08-17 23:13:15,079 | INFO | main | c1 c2 c3 | com.huawei.bigdata.doris.example.JDBCExample.query(JDBCExample.java:126)2023-08-17 23:13:15,079 | INFO | main | 0 0 0 | com.huawei.bigdata.doris.example.JDBCExample.query(JDBCExample.java:134)2023-08-17 23:13:15,080 | INFO | main | 1 10 100 | com.huawei.bigdata.doris.example.JDBCExample.query(JDBCExample.java:134)2023-08-17 23:13:15,080 | INFO | main | 2 20 200 | com.huawei.bigdata.doris.example.JDBCExample.query(JDBCExample.java:134)2023-08-17 23:13:15,080 | INFO | main | 3 30 300 | com.huawei.bigdata.doris.example.JDBCExample.query(JDBCExample.java:134)2023-08-17 23:13:15,080 | INFO | main | 4 40 400 | com.huawei.bigdata.doris.example.JDBCExample.query(JDBCExample.java:134)2023-08-17 23:13:15,080 | INFO | main | 5 50 500 | com.huawei.bigdata.doris.example.JDBCExample.query(JDBCExample.java:134)2023-08-17 23:13:15,080 | INFO | main | 6 60 600 | com.huawei.bigdata.doris.example.JDBCExample.query(JDBCExample.java:134)2023-08-17 23:13:15,080 | INFO | main | 7 70 700 | com.huawei.bigdata.doris.example.JDBCExample.query(JDBCExample.java:134)2023-08-17 23:13:15,081 | INFO | main | 8 80 800 | com.huawei.bigdata.doris.example.JDBCExample.query(JDBCExample.java:134)2023-08-17 23:13:15,081 | INFO | main | 9 90 900 | com.huawei.bigdata.doris.example.JDBCExample.query(JDBCExample.java:134)2023-08-17 23:13:15,081 | INFO | main | Querying table data succeeded. | com.huawei.bigdata.doris.example.JDBCExample.main(JDBCExample.java:61)2023-08-17 23:13:15,081 | INFO | main | Start to delete the table. | com.huawei.bigdata.doris.example.JDBCExample.main(JDBCExample.java:64)2023-08-17 23:13:15,114 | INFO | main | Table deleted successfully. | com.huawei.bigdata.doris.example.JDBCExample.main(JDBCExample.java:66)2023-08-17 23:13:15,124 | INFO | main | Doris example execution successfully. | com.huawei.bigdata.doris.example.JDBCExample.main(JDBCExample.java:71) Doris对接SpringBoot运行结果 在浏览器中访问链接“http://样例运行节点IP地址:8080/doris/example/executesql”,IDEA正常打印日志,请求返回如下图所示: 图3 返回样例运行信息
  • IoTDB应用开发流程介绍 本文档主要基于Java API对IoTDB进行应用开发。 开发流程中各阶段的说明如图1和表1所示。 图1 IoTDB应用程序开发流程 表1 IoTDB应用开发的流程说明 阶段 说明 参考章节 准备开发环境 在进行应用开发前,需首先准备开发环境,推荐使用Java语言进行开发,使用IntelliJ IDEA工具,同时完成JDK、Maven等初始配置。 准备本地应用开发环境 准备连接集群配置文件 应用程序开发或运行过程中,需通过集群相关配置文件信息连接MRS集群,配置文件通常包括集群组件信息文件以及用于安全认证的用户文件,可从已创建好的MRS集群中获取相关内容。 用于程序调测或运行的节点,需要与MRS集群内节点网络互通,同时配置hosts域名信息。 准备连接IoTDB集群配置文件 配置并导入样例工程 IoTDB提供了不同场景下的多种样例程序,用户可获取样例工程并导入本地开发环境中进行程序学习。 导入并配置IoTDB样例工程 根据业务场景开发程序 提供了Java语言的样例工程,包含JDBC和Session两种连接方式,从创建存储组、创建时间序列,到插入数据再到删除存储组全流程的样例工程。 开发IoTDB应用 编译并运行程序 指导用户将开发好的程序编译并提交运行。 调测IoTDB应用 父主题: IoTDB开发指南(安全模式)
  • 准备本地应用开发环境 在进行应用开发时,要准备的开发和运行环境如表1所示。 表1 开发环境 准备项 说明 操作系统 开发环境:Windows系统,支持Windows 7以上版本。 运行环境:Windows系统或Linux系统。 如需在本地调测程序,运行环境需要和集群业务平面网络互通。 安装JDK 开发和运行环境的基本配置。版本要求如下: 服务端和客户端仅支持自带的OpenJDK,版本为1.8.0_272,不允许替换。 对于客户应用需引用SDK类的Jar包运行在客户应用进程中的。 X86客户端:Oracle JDK:支持1.8版本;IBM JDK:支持1.8.5.11版本。 说明: 基于安全考虑,服务端只支持TLS V1.2及以上的加密协议。 IBM JDK默认只支持TLS V1.0,若使用IBM JDK,请配置启动参数“com.ibm.jsse2.overrideDefaultTLS”为“true”,设置后可以同时支持TLS V1.0/V1.1/V1.2,详情参见https://www.ibm.com/support/knowledgecenter/zh/SSYKE2_8.0.0/com.ibm.java.security.component.80.doc/security-component/jsse2Docs/matchsslcontext_tls.html#matchsslcontext_tls。 安装和配置IntelliJ IDEA 用于开发IoTDB应用程序的工具,建议使用2019.1或其他兼容版本。 说明: 若使用IBM JDK,请确保IntelliJ IDEA中的JDK配置为IBM JDK。 若使用Oracle JDK,请确保IntelliJ IDEA中的JDK配置为Oracle JDK。 若使用Open JDK,请确保IntelliJ IDEA中的JDK配置为Open JDK。 不同的IntelliJ IDEA不要使用相同的workspace和相同路径下的示例工程。 安装Maven 开发环境的基本配置。用于项目管理,贯穿软件开发生命周期。 华为提供开源镜像站,各服务样例工程依赖的Jar包通过华为开源镜像站下载,剩余所依赖的开源Jar包请直接从Maven中央库或者其他用户自定义的仓库地址下载,详情请参考配置华为开源镜像仓。 7-zip 用于解压“*.zip”和“*.rar”文件,支持7-zip 16.04版本。 父主题: 准备IoTDB应用开发环境
  • 创建Doris表 本章节介绍创建Doris表样例代码。 以下代码片段在“JDBCExample”类中。 以Java JDBC方式执行SQL语句在集群中dbName变量对应的数据库下创建tableName对应的表。 String createTableSql = "create table if not exists " + dbName + "." + tableName + " (\n" + "c1 int not null,\n" + "c2 int not null,\n" + "c3 string not null\n" + ") engine=olap\n" + "unique key(c1, c2)\n" + "distributed by hash(c1) buckets 1"; public static void execDDL(Connection connection, String sql) throws Exception { try (PreparedStatement statement = connection.prepareStatement(sql)) { statement.execute(); } catch (Exception e) { logger.error("Execute sql {} failed.", sql, e); throw new Exception(e); }} 父主题: Doris JDBC接口调用样例程序
  • 配置运行环境网络 用于程序调测或运行的节点,需要与MRS集群内节点网络互通,同时配置hosts域名信息。 场景一:配置本地Windows开发环境与MRS集群节点内网络互通。 登录FusionInsight Manager,在“主页”右上方单击“下载客户端”,“选择客户端类型”设置为“仅配置文件”,单击“确定”,等待客户端文件包生成后根据浏览器提示下载客户端到本地并解压。 例如,客户端配置文件压缩包为“FusionInsight_Cluster_1_Services_Client.tar”,解压后得到“FusionInsight_Cluster_1_Services_ClientConfig_ConfigFiles.tar”,继续解压该文件。 复制解压目录下的“hosts”文件中的内容到本地hosts文件中。 在应用开发过程中,如需在本地Windows系统中调测应用程序,需要确保本地节点能与“hosts”文件中所列出的各主机在网络上互通。 Windows本地hosts文件存放路径举例:“C:\WINDOWS\system32\drivers\etc\hosts”。 场景二:配置Linux环境与MRS集群节点内网络互通。 在节点中安装MRS集群客户端。 例如客户端安装目录为“/opt/client”。 获取配置文件: 登录FusionInsight Manager,在“主页”右上方单击“下载客户端”,“选择客户端类型”设置为“仅配置文件”,勾选“仅保存到如下路径”,单击“确定”,下载客户端配置文件至集群主OMS点。 以root登录主OMS节点,进入客户端配置文件所在路径(默认为“/tmp/FusionInsight-Client/”)。 例如客户端软件包为“FusionInsight_Cluster_1_Services_Client.tar”,下载路径为主管理节点的“/tmp/FusionInsight-Client”: cd /tmp/FusionInsight-Client tar -xvf FusionInsight_Cluster_1_Services_Client.tar tar -xvf FusionInsight_Cluster_1_Services_ClientConfig_ConfigFiles.tar cd FusionInsight_Cluster_1_Services_ClientConfig_ConfigFiles 检查客户端节点网络连接。 在安装客户端过程中,系统会自动配置客户端节点“hosts”文件,建议检查“/etc/hosts”文件内是否包含集群内节点的主机名信息,如未包含,需要手动复制解压目录下的“hosts”文件中的内容到客户端所在节点的hosts文件中,确保本地机器能与集群各主机在网络上互通。
  • IoTDB应用开发流程介绍 本文档主要基于Java API对IoTDB进行应用开发。 开发流程中各阶段的说明如图1和表1所示。 图1 IoTDB应用程序开发流程 表1 IoTDB应用开发的流程说明 阶段 说明 参考文档 准备开发环境 在进行应用开发前,需首先准备开发环境,推荐使用Java语言进行开发,使用IntelliJ IDEA工具,同时完成JDK、Maven等初始配置。 准备本地应用开发环境 准备连接集群配置文件 应用程序开发或运行过程中,需通过集群相关配置文件信息连接MRS集群,配置文件通常包括集群组件信息文件以及用于安全认证的用户文件,可从已创建好的MRS集群中获取相关内容。 用于程序调测或运行的节点,需要与MRS集群内节点网络互通,同时配置hosts域名信息。 准备连接IoTDB集群配置文件 准备工程 IoTDB提供了不同场景下的多种样例程序,用户可获取样例工程并导入本地开发环境中进行程序学习。 导入并配置IoTDB样例工程 根据业务场景开发程序 提供了Java语言的样例工程,包含JDBC和Session两种连接方式,从创建存储组、创建时间序列,到插入数据再到删除存储组全流程的样例工程。 开发IoTDB应用 编译并运行程序 指导用户将开发好的程序编译并提交运行。 调测IoTDB应用 父主题: IoTDB开发指南(普通模式)
  • 获取样例工程 通过开源镜像站获取样例工程。 下载样例工程的Maven工程源码和配置文件,并在本地配置好相关开发工具,可参考通过开源镜像站获取样例工程。 根据集群版本选择对应的分支,下载并获取MRS相关样例工程。 例如本章节场景对应示例为“hive-jdbc-example”样例,获取地址:https://github.com/huaweicloud/huaweicloud-mrs-example/tree/mrs-3.1.5/src/hive-examples/hive-jdbc-example。 本地使用IDEA工具导入样例工程,等待Maven工程下载相关依赖包,具体操作可参考配置并导入样例工程。 图1 Hive样例工程示例 本地配置好Maven及SDK相关参数后,样例工程会自动加载相关依赖包。 将准备应用开发配置文件中获取的集群配置文件及用户认证文件放置在样例工程的“resources”目录下。 如需连接开启了Kerberos认证的MRS集群,在Hive样例工程代码中,需配置相关认证信息。 在“com.huawei.bigdata.hive.examples”包的“JDBCExample”类中修改“USER_NAME”为实际用户名,例如“developuser”。 KRB5_FILE = userdir + "krb5.conf";System.setProperty("java.security.krb5.conf", KRB5_FILE);USER_NAME = "developuser";if ("KERBEROS".equalsIgnoreCase(auth)) { USER_KEYTAB_FILE = "src/main/resources/user.keytab"; ZOOKEEPER_DEFAULT_SERVER_PRINCIPAL = "zookeeper/" + getUserRealm(); System.setProperty(ZOOKEEPER_SERVER_PRINCIPAL_KEY, ZOOKEEPER_DEFAULT_SERVER_PRINCIPAL);}... 本样例工程中,基于业务场景的开发思路如下,各功能代码片段详情说明可参考JDBC访问Hive样例程序: 数据准备。 创建表,雇员信息表“employees_info”。 加载雇员信息数据到雇员信息表“employees_info”中。 数据分析。 统计表employees_info中有多少条记录。 删除表。
  • 编译并运行程序 编译JDBC样例程序: 在IDEA界面左下方单击“Terminal”进入终端,执行命令mvn clean package进行编译。 当输出“BUILD SUC CES S”,表示编译成功,如下图所示。编译成功后将会在样例工程的target下生成含有“-with-dependencies”字段的jar包。 [INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time: 03:30 min[INFO] Finished at: 2023-05-17T20:22:44+08:00[INFO] ------------------------------------------------------------------------ 在本地创建一个目录作为运行目录,如“D:\jdbc_example”,将生成的包名中含有“-with-dependencies”字段的jar包放进该路径下,并在该目录下创建子目录“src/main/resources”。将样例工程“resources”目录下的所有文件复制到该目录下。 在Windows CMD环境下执行: cd /d d:\jdbc_example java -jar hive-jdbc-example-XXX-with-dependencies.jar 样例运行成功后,运行信息如下,表示相关Hive表操作成功执行。 ...2023-05-17 20:25:09,421 INFO HiveConnection - Login timeout is 02023-05-17 20:25:09,656 INFO HiveConnection - user login success.2023-05-17 20:25:09,685 INFO HiveConnection - Will try to open client transport with JDBC Uri: jdbc:hive2://192.168.64.216:21066/;principal=hive/hadoop.hadoop.com@HADOOP.COM;sasl.qop=auth-conf;serviceDiscoveryMode=zooKeeper;auth=KERBEROS;zooKeeperNamespace=hiveserver2;user.principal=developuser;user.keytab=src/main/resources/user.keytab2023-05-17 20:25:30,294 INFO JDBCExample - Create table success!2023-05-17 20:26:34,032 INFO JDBCExample - _c02023-05-17 20:26:34,266 INFO JDBCExample - 02023-05-17 20:26:35,199 INFO JDBCExample - Delete table success!...
  • Doris样例工程介绍 MRS样例工程获取地址为https://github.com/huaweicloud/huaweicloud-mrs-example,切换分支为与MRS集群相匹配的版本分支,然后下载压缩包到本地后解压,即可获取各组件对应的样例代码工程。 当前MRS提供以下Doris相关样例工程: 表1 Doris相关样例工程 样例工程位置 描述 doris-examples/doris-example Doris数据读写操作的应用开发示例。 通过调用Doris接口可实现创建用户表、向表中插入数据、查询表数据、删除表等功能,相关业务场景介绍请参见Doris JDBC接口调用样例程序。 springboot/doris-examples Doris数据读写操作的SpringBoot应用开发示例。 提供Doris对接SpringBoot的样例,样例介绍请参见配置并导入SpringBoot样例工程。
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全