华为云用户手册

  • 训练基础镜像列表 ModelArts中预置的训练基础镜像如下表所示。 表1 ModelArts训练基础镜像列表 引擎类型 版本名称 PyTorch pytorch_1.8.0-cuda_10.2-py_3.7-ubuntu_18.04-x86_64 TensorFlow tensorflow_2.1.0-cuda_10.1-py_3.7-ubuntu_18.04-x86_64 Horovod horovod_0.20.0-tensorflow_2.1.0-cuda_10.1-py_3.7-ubuntu_18.04-x86_64 horovod_0.22.1-pytorch_1.8.0-cuda_10.2-py_3.7-ubuntu_18.04-x86_64 MPI mindspore_1.3.0-cuda_10.1-py_3.7-ubuntu_1804-x86_64 不同区域支持的AI引擎有差异,请以实际环境为准。
  • 基于训练基础镜像构建新镜像的操作步骤 您可以参考如下步骤基于训练基础镜像来构建新镜像。 安装Docker。如果docker images命令可以执行成功,表示Docker已安装,此步骤可跳过。 以linux x86_64架构的操作系统为例,获取Docker安装包。您可以使用以下指令安装Docker。 curl -fsSL get.docker.com -o get-docker.sh sh get-docker.sh 准备名为context的文件夹。 mkdir -p context 准备可用的pip源文件pip.conf 。本示例使用华为开源镜像站提供的pip源,其pip.conf文件内容如下。 [global] index-url = https://repo.huaweicloud.com/repository/pypi/simple trusted-host = repo.huaweicloud.com timeout = 120 在华为开源镜像站https://mirrors.huaweicloud.com/home中,搜索pypi,可以查看pip.conf文件内容。 参考如下Dockerfile文件内容来基于ModelArts提供的训练基础镜像来构建一个新镜像。将编写好的Dockerfile文件放置在context文件夹内。训练基础镜像地址请参见训练基础镜像列表。 FROM {ModelArts提供的训练基础镜像地址} # 配置pip RUN mkdir -p /home/ma-user/.pip/ COPY --chown=ma-user:ma-group pip.conf /home/ma-user/.pip/pip.conf # 设置容器镜像预置环境变量 # 将python解释器路径加入到PATH环境变量中 # 请务必设置PYTHONUNBUFFERED=1, 以免日志丢失 ENV PATH=${ANACONDA_DIR}/envs/${ENV_NAME}/bin:$PATH \ PYTHONUNBUFFERED=1 RUN /home/ma-user/anaconda/bin/pip install --no-cache-dir numpy 构建新镜像。在Dockerfile文件所在的目录执行如下命令构建容器镜像training:v1。 docker build . -t training:v1 将构建好的新镜像上传至SWR(参考如何登录并上传镜像到SWR)。 参考使用 自定义镜像 创建训练作业(CPU/GPU)章节在ModelArts上使用。
  • 训练脚本mindspore-verification.py文件 mindspore-verification.py文件内容如下: import os import numpy as np from mindspore import Tensor import mindspore.ops as ops import mindspore.context as context print('Ascend Envs') print('------') print('JOB_ID: ', os.environ['JOB_ID']) print('RANK_TABLE_FILE: ', os.environ['RANK_TABLE_FILE']) print('RANK_SIZE: ', os.environ['RANK_SIZE']) print('ASCEND_DEVICE_ID: ', os.environ['ASCEND_DEVICE_ID']) print('DEVICE_ID: ', os.environ['DEVICE_ID']) print('RANK_ID: ', os.environ['RANK_ID']) print('------') context.set_context(device_target="Ascend") x = Tensor(np.ones([1,3,3,4]).astype(np.float32)) y = Tensor(np.ones([1,3,3,4]).astype(np.float32)) print(ops.add(x, y))
  • 场景描述 目标:构建安装如下软件的容器镜像,并在ModelArts平台上使用Ascend规格资源运行训练任务。 ubuntu-18.04 cann-6.3.RC2 (商用版本) python-3.7.13 mindspore-2.1.1 本教程以cann-6.3.RC2.、mindspore-2.1.1为例介绍。 本示例仅用于示意Ascend容器镜像制作流程,且在匹配正确的Ascend驱动/固件版本的专属资源池上运行通过。
  • 场景描述 ModelArts GPU服务器上配置了Mellanox Technologies网卡,支持RDMA(Remote Direct Memory Access)。因此可以在容器镜像中安装MLNX_OFED,使得NCCL可以启用该网卡,提高跨节点通信效率。 NCCL启用该网卡后,跨节点通信采用的方法为NET/IB。未启用该网卡时,跨节点通信采用的方法为NET/Socket。NET/IB在时延与带宽方面都要优于NET/Socket。 表1 ModelArts GPU服务器Mellanox Technologies网卡和MLNX_OFED安装情况 服务器GPU型号 Mellanox Technologies网卡 服务器安装的MLNX_OFED版本 推荐容器镜像安装的MLNX_OFED版本 Vnt1 ConnectX-5 4.3-1.0.1.0/4.5-1.0.1.0 4.9-6.0.6.0-LTS Ant8/Ant1 ConnectX-6 Dx 5.5-1.0.3.2 5.8-2.0.3.0-LTS
  • 已有镜像如何适配迁移至ModelArts训练平台 已有镜像迁移至训练管理需要关注如下步骤。 为镜像增加训练管理的默认用户组ma-group,“gid = 100”。 如果已存在“gid = 100”用户组,可能会报错“groupadd: GID '100' already exists”。可通过命令“cat /etc/group | grep 100”查询是否已存在gid = 100用户组。 如果已存在“gid = 100”用户组,则该步骤跳过,下文Dockerfile中删除“RUN groupadd ma-group -g 100”命令。 为镜像增加训练管理的默认用户ma-user,“uid = 1000”。 如果已存在“uid = 1000”用户,可能会报错“useradd: UID 1000 is not unique”。可通过命令“cat /etc/passwd | grep 1000”查询是否已存在uid = 1000用户。 如果已存在“uid = 1000”用户,则该步骤跳过,下文Dockerfile中删除“RUN useradd -d /home/ma-user -m -u 1000 -g 100 -s /bin/bash ma-user”命令。 修改镜像中相关文件权限,使得ma-user,“uid = 1000”用户可读写。 您可以参考如下Dockerfile,修改已有镜像,使其符合新版训练管理自定义镜像的规范。 FROM {已有镜像} USER root # 如果已存在 gid = 100 用户组,则删除 groupadd 命令。 RUN groupadd ma-group -g 100 # 如果已存在 uid = 1000 用户,则删除 useradd 命令。 RUN useradd -m -d /home/ma-user -s /bin/bash -g 100 -u 1000 ma-user # 修改镜像中相关文件权限,使得 ma-user, uid = 1000 用户可读写。 RUN chown -R ma-user:100 {Python软件包路径} # 设置容器镜像预置环境变量。 # 请务必设置 PYTHONUNBUFFERED=1, 以免日志丢失。 ENV PYTHONUNBUFFERED=1 # 设置容器镜像默认用户与工作目录。 USER ma-user WORKDIR /home/ma-user 编写好Dockerfile后,通过执行如下所示命令进行新镜像构建。 docker build -f Dockerfile . -t {新镜像} 构建成功后将新镜像上传至SWR(参考如何登录并上传镜像到SWR)。 上述内容为关键代码样例,为了方便理解迁移过程,推荐您体验完整迁移案例:示例:从0到1制作自定义镜像并用于训练(PyTorch+CPU/GPU)。 父主题: 准备训练镜像
  • Step1 创建OBS桶和文件夹 在OBS服务中创建桶和文件夹,用于存放样例数据集以及训练代码。如下示例中,请创建命名为“test-modelarts”的桶,并创建如表1所示的文件夹。 创建OBS桶和文件夹的操作指导请参见创建桶和新建文件夹。 请确保您使用的OBS与ModelArts在同一区域。 表1 OBS桶文件夹列表 文件夹名称 用途 obs://test-modelarts/ascend/demo-code/ 用于存储Ascend训练脚本文件。 obs://test-modelarts/ascend/demo-code/run_ascend/ 用于存储Ascend训练脚本的启动脚本。 obs://test-modelarts/ascend/log/ 用于存储训练日志文件。
  • 如何免费试用 数据仓库 服务? 免费试用活动仅限新用户可以参加。如果您的账号从未创建过 GaussDB (DWS)集群,且已完成实名认证,就有资格免费试用GaussDB(DWS)服务1个月。 您可以登录GaussDB(DWS)管理控制台,单击“立即申请试用”开通免费试用套餐。不同区域之间的免费试用套餐不互通,请根据您的实际需求慎重选择。 当您开通免费试用套餐后,在免费时间段内,您可以直接登录GaussDB(DWS)控制台创建相应区域、节点规格和节点数量的集群,该规格集群会自动享受免费试用活动。如果您选择使用其他节点类型,将按标准的按需费率支付费用,计费详情请参见GaussDB(DWS)价格详情。 当1个月免费试用结束时,您可以删除集群,从而避免产生任何费用,或者您也可以继续保留集群,此时将按标准的按需费率支付费用。 父主题: 计费问题
  • GaussDB(DWS)和 MRS 分别应在何时使用? 如果需要使用自定义代码通过大数据处理框架 (如Apache Spark、Hadoop或HBase) 来处理和分析超大数据集,则应该使用MRS。MRS让您能够控制集群的配置和集群上安装的软件。 GaussDB(DWS)这类数据仓库是专为不同类型的分析而设计的。数据仓库旨在将多个不同来源(如库存、财务和零售销售系统)的数据汇集在一起。为了确保整个公司的报告具有一致的准确性,数据仓库采用一种高度结构化的方式来存储数据。这种结构可将数据一致性规则直接构建到数据库的表中。同时对标准SQL,事务支持传统数据库语法有很好的兼容性。 当您需要对大量结构化数据执行复杂查询并获得超快性能时,GaussDB(DWS)就是理想的服务选择。 父主题: 通用问题
  • PG数据库定时同步GaussDB(DWS)服务如何收费? GaussDB(DWS)数据定时同步到PG数据库,可以通过以下方式实现: 使用 云数据迁移 CDM )实现GaussDB(DWS)集群数据库与PG数据库之间的数据迁移同步,具体收费情况请参见云数据迁移价格说明。 使用GaussDB(DWS)导出数据到 对象存储服务 (OBS),然后再将数据从OBS导入PG数据库来实现数据同步。该过程只有数据存储在OBS中会产生费用,OBS数据存储的计费标准,请参见对象存储服务价格说明。 父主题: 计费问题
  • 为什么GaussDB(DWS)的性能在极端场景下并未比单机数据库好 GaussDB(DWS)中由于MPP架构的限制导致少部分PG系统方法、函数无法下推到DN节点来执行,仅能在CN端出现性能瓶颈。 原理解释: 一个操作能够并行执行是有条件的,需要逻辑上能够并行,比如做汇总(SUM),可以各个节点(DN)并行汇总后,最后的汇总一定是不能并行,要在某一个节点(CN)上执行,由于大部分的汇总工作已经在DN节点完成,CN端的工作是比较轻量的。 某些场景必须要集中执行,比如事务号,必须要保证全局唯一,该任务在系统里是通过GTM来实现的,因此,GTM也是全局唯一的组件(主备)。所有需要全局唯一的任务都是通过GaussDB(DWS)中的GTM来完成,只是在设计上尽量避免阻塞在GTM上,因此GTM并没有太多瓶颈,而且有些场景下还可以GTM-Free和GTM-Lite。 从传统单机数据库的应用开发模式到并行数据库,为确保获得更好的性能,可能需要对业务进行少量改动,尤其是传统Oracle的存储过程互相嵌套的开发模式,如果要保证高性能,需要进行业务修改及对应的适配。 解决方案: 如遇到此类问题,请参考《数据仓库服务数据库开发指南》中的“优化查询性能”章节。 或者,请联系技术人员进行业务适配的修改调优。 父主题: 数据库性能
  • 相关空间回收参数说明 autovacuum = on 控制数据库自动清理进程(autovacuum)的启动。自动清理进程运行的前提是将track_counts设置为on。 log_autovacuum_min_duration = 0 当自动清理的执行时间大于或者等于某个特定的值时,向服务器日志中记录自动清理执行的每一步操作。设置此选项有助于追踪自动清理的行为。 autovacuum_max_workers = 10 设置能同时运行的自动清理线程的最大数量。 autovacuum_naptime = 1 设置两次自动清理操作的时间间隔。 autovacuum_vacuum_cost_delay = 0 设置在自动VACUUM操作里使用的开销延迟数值。 更多关于空间回收参数说明,参见自动清理。
  • 表膨胀的原因 未开启autovacuum GaussDB(DWS)提供自动执行VACUUM和ANALYZE命令的系统自动清理进程(autovacuum),用于回收被标识为删除状态的记录空间,并更新表的统计数据。 用户未开启autovacuum的同时又没有合理的自定义vacuum调度,导致表的脏数据没有及时回收,新的数据又不断插入或更新,膨胀是必然的。 资源回收不及时 开启了autovacuum,但是各种原因导致回收不及时,并且新的数据又不断产生,从而导致膨胀。回收不及时有以下原因: IO性能差 当数据库非常繁忙时,如果IO性能较差,会导致回收脏数据变慢,从而导致表膨胀。 这种情况一般出现在占用数据库内存较大的表上,并且这些表正在执行整表vacuum,因此产生大量IO,导致表自身或其他表膨胀。 autovacuum触发较迟 触发autovacuum操作的阈值设置过高,大量表上被删除、插入或更新的记录数没有及时处理,导致表膨胀。 autovacuum线程繁忙 所有自动清理线程繁忙,某些表产生的脏数据超过阈值,但是在此期间没有autovacuum线程可以处理脏数据回收的事情,可能发生表膨胀。 如果数据库的表很多,而且都比较大,那么当需要vacuum的表超过了配置autovacuum_max_workers的数量,这些表就要等待空闲的autovacuum线程。这个阶段就容易出现表的膨胀。 数据库中存在长SQL或带XID的长事务 当DWS数据库中存在未结束的SQL语句或者未结束的持有事务ID的事务,在此SQL执行时间范围内或在此事务过程中产生的脏数据无法回收,导致数据库膨胀。 开启了autovacuum_vacuum_cost_delay 在开启了autovacuum_vacuum_cost_delay后,会使用基于成本的脏数据回收策略,可以有利于降低VACUUM带来的IO影响,但是对于IO性能高的系统,开启autovacuum_vacuum_cost_delay反而会使得垃圾回收的时间变长。 autovacuum_naptime设置间隔时间过长 批量删除或更新大表 例如对于一个10GB的表,一条SQL或一个事务中删除或更新9GB的数据,这9GB的数据必须在事务结束后才能进行脏数据回收,无形中增加了膨胀的可能。
  • 减少或避免表膨胀 开启autovacuum。 提高系统的IO能力。 调整触发阈值,让触发阈值和记录数匹配。 增加autovacuum_max_workers和autovacuum_work_mem,同时增加系统内存。 IO性能较好的系统,关闭autovacuum_vacuum_cost_delay。 设计应用程序时,避免使用大批量的更新、删除操作,可以切分为多个事务进行。 应用程序设计时,尽量避免下列操作: 打开游标后不关闭。 在不必要的场景使用repeatable read或serializable事务隔离级别。 对大的数据库执行gs_dump进行逻辑备份(隐式repeatable read隔离级别的全库备份)。 长时间不关闭申请了事务号的事务(增、删、改等DDL操作的SQL)。
  • JDBC样例工程的IntelliJ IDEA形式运行 在IntelliJ IDEA的jdbc-examples工程的JDBCExample类单击右键,在弹出菜单中选择“Run JDBCExample.main()”菜单项。如下图所示。 在IntelliJ IDEA输出窗口查看样例代码中的HQL所查询出的结果会有如下信息: Create table success! _c0 0 Delete table success!
  • JDBC样例工程的命令行形式运行 在IDEA界面左下方单击“Terminal”进入终端,执行命令mvn clean package进行编译。 当输出“BUILD SUC CES S”,表示编译成功,如下图所示。编译成功后将会在样例工程的target下生成含有“-with-dependencies”字段的jar包。 在Windows或Linux上创建一个目录作为运行目录,如“D:\jdbc_example”(Windows环境)或“/opt/jdbc_example”(Linux环境),将1中生成的“target”目录下包名中含有“-with-dependencies”字段的jar包放进该路径下,并在该目录下创建子目录“src/main/resources”。将jdbc-examples工程resources目录下的所有文件拷贝到“resources”下。 在Windows环境下执行: cd /d d:\jdbc_example java -jar hive-jdbc-example-1.0-SNAPSHOT-jar-with-dependencies.jar 在Linux环境下执行: chmod +x /opt/jdbc_example -R cd /opt/jdbc_example java -jar hive-jdbc-example-1.0-SNAPSHOT-jar-with-dependencies.jar 以上jar包名称仅供参考,具体名称以实际生成为主。 在命令行终端查看样例代码中的HQL所查询出的结果。 Windows环境运行成功结果会有如下信息: Create table success! _c0 0 Delete table success! Linux环境运行成功结果会有如下信息: Create table success! _c0 0 Delete table success!
  • 在Windows中调测程序 确保本地的hosts文件中配置了远程集群所有主机的主机名和业务IP映射关系。 通过IntelliJ IDEA可直接运行Producer.java,如图1所示: 图1 运行Producer.java运行 运行后弹出控制台窗口,可以看到,Producer正在向默认topic(example-metric1)发送消息,每发送10条,打印一条日志。 图2 Producer运行窗口
  • 操作步骤 打开IDEA工具,选择“Create New Project”。 图1 创建工程 在“New Project”页面,选择“Scala”开发环境,并选择“Scala Module”,然后单击“Next”。 如果您需要新建Java语言的工程,选择对应参数即可。 图2 选择开发环境 在工程信息页面,填写工程名称和存放路径,设置JDK版本和Scala SDK,然后单击“Finish”完成工程创建。 图3 填写工程信息
  • 操作步骤 “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) Process finished with exit code 0 Doris对接SpringBoot运行结果 在浏览器上访问链接“http://样例运行节点IP地址:8080/doris/example/executesql”,IDEA正常打印日志,请求返回如下图所示: 图1 返回样例运行信息
  • 操作步骤 “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) Process finished with exit code 0 Doris对接SpringBoot运行结果 在浏览器上访问链接“http://样例运行节点IP地址:8080/doris/example/executesql”,IDEA正常打印日志,请求返回如下图所示: 图1 返回样例运行信息
  • 操作步骤 通过运行日志可查看应用提交后的执行详情,例如,hbase-example样例运行成功后,显示信息如下: 2280 [main] INFOcom.huawei.hadoop.hbase.example.HBaseSample- Entering testCreateTable. 3091 [main] WARNcom.huawei.hadoop.hbase.example.HBaseSample- table already exists 3091 [main] INFOcom.huawei.hadoop.hbase.example.HBaseSample- Exiting testCreateTable. 3091 [main] INFOcom.huawei.hadoop.hbase.example.HBaseSample- Entering testPut. 3264 [main] INFOcom.huawei.hadoop.hbase.example.HBaseSample- Put successfully. 3264 [main] INFOcom.huawei.hadoop.hbase.example.HBaseSample- Exiting testPut. 3264 [main] INFOcom.huawei.hadoop.hbase.example.HBaseSample- Entering testGet. 3283 [main] INFOcom.huawei.hadoop.hbase.example.HBaseSample- 012005000201:info,address,Shenzhen, Guangdong 3283 [main] INFOcom.huawei.hadoop.hbase.example.HBaseSample- 012005000201:info,name,yugeZhang San 3283 [main] INFOcom.huawei.hadoop.hbase.example.HBaseSample- Get data successfully. 3283 [main] INFOcom.huawei.hadoop.hbase.example.HBaseSample- Exiting testGet. 3283 [main] INFOorg.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation- Closing zookeeper sessionid=0xd000035eba278e9 3297 [main] INFOorg.apache.zookeeper.ZooKeeper- Session: 0xd000035eba278e9 closed 3297 [main-EventThread] INFOorg.apache.zookeeper.ClientCnxn- EventThread shut down -----------finish HBase ------------------- HBase/Phoenix对接SpringBoot运行结果: 在浏览器上访问链接“http://样例运行节点IP地址:8080/hbase/HBaseDemo”和“http://样例运行节点IP地址:8080/hbase/PhoenixDemo”,IDEA正常打印日志,请求返回“finish HBase”和“finish Phoenix",如下图所示: 图1 返回“finish HBase” 图2 返回“finish Phoenix"
  • 基本概念 设备 设备指的是在实际场景中拥有传感器的装置。在IoTDB当中,所有的传感器都应有其对应的归属的设备。 传感器 传感器是指在实际场景中的一种检测装置,它能感受到被测量的信息,并能将感受到的信息按一定规律变换成为电信号或其他所需形式的信息输出并发送给IoTDB。在IoTDB当中,存储的所有的数据及路径,都是以传感器为单位进行组织。 存储组 用户可以将任意前缀路径设置成存储组。如果有4条时间序列,如“root.vehicle.d1.s1”、“root.vehicle.d1.s2”、“root.vehicle.d2.s1”和“root.vehicle.d2.s2”,路径“root.vehicle”下的两个设备d1、d2可能属于同一个业主或者同一个厂商,因此关系紧密。这时候就可以将前缀路径“root.vehicle”指定为一个存储组,这将使得IoTDB将其下的所有设备的数据存储在同一个文件夹下。如果以后“root.vehicle”路径下增加了新的设备,也将属于该存储组。 设置合理数量的存储组可以带来性能的提升。既不会因为产生过多的存储文件(夹)导致频繁切换IO降低系统速度(并且会占用大量内存且出现频繁的内存-文件切换),也不会因为过少的存储文件夹(降低了并发度从而)导致写入命令阻塞。 用户应根据自己的数据规模和使用场景,平衡存储文件的存储组设置,以达到更好的系统性能。 时间序列 时间序列是IoTDB中的核心概念。时间序列可以被看作产生时序数据的传感器所在的完整路径,在IoTDB中所有的时间序列必须以root开始、以传感器作为结尾。
  • Structured Streaming常用概念 Input Source 输入数据源,数据源需要支持根据offset重放数据,不同的数据源有不同的容错性。 Sink 数据输出,Sink要支持幂等性写入操作,不同的sink有不同的容错性。 outputMode 结果输出模式,当前支持3种输出模: Complete Mode:整个更新的结果集都会写入外部存储。整张表的写入操作将由外部存储系统的连接器完成。 Append Mode:当时间间隔触发时,只有在Result Table中新增加的数据行会被写入外部存储。这种方式只适用于结果集中已经存在的内容不希望发生改变的情况下,如果已经存在的数据会被更新,不适合适用此种方式。 Update Mode:当时间间隔触发时,只有在Result Table中被更新的数据才会被写入外部存储系统。注意,和Complete Mode方式的不同之处是不更新的结果集不会写入外部存储。 Trigger 输出触发器,当前支持以下几种trigger: 默认:以微批模式执行,每个批次完成后自动执行下个批次。 固定间隔:固定时间间隔执行。 一次执行:只执行一次query,完成后退出。 连续模式:实验特性,可实现低至1ms延迟的流处理(推荐100ms)。 Structured Streaming支持微批模式和连续模式。微批模式不能保证对数据的低延迟处理,但是在相同时间下有更大的吞吐量;连续模式适合毫秒级的数据处理延迟,当前暂时还属于实验特性。 在当前版本中,若需要使用流流Join功能,则output模式只能选择append模式。 图6 微批模式运行过程简图 图7 连续模式运行过程简图
  • Spark SQL常用概念 DataSet DataSet是一个由特定域的对象组成的强类型集合,可通过功能或关系操作并行转换其中的对象。 每个Dataset还有一个非类型视图,即由多个列组成的DataSet,称为DataFrame。 DataFrame是一个由多个列组成的结构化的分布式数据集合,等同于关系数据库中的一张表,或者是R/Python中的data frame。DataFrame是Spark SQL中的最基本的概念,可以通过多种方式创建,例如结构化的数据集、Hive表、外部数据库或者是RDD。
  • Spark Streaming常用概念 Dstream DStream(又称Discretized Stream)是Spark Streaming提供的抽象概念。 DStream表示一个连续的数据流,是从数据源获取或者通过输入流转换生成的数据流。从本质上说,一个DStream表示一系列连续的RDD。RDD是一个只读的、可分区的分布式数据集。 DStream中的每个RDD包含了一个区间的数据。如图4所示。 图4 DStream与RDD关系 应用到DStream上的所有算子会被转译成下层RDD的算子操作,如图5所示。这些下层的RDD转换会通过Spark引擎进行计算。DStream算子隐藏大部分的操作细节,并且提供了方便的High-level API给开发者使用。 图5 DStream算子转译
  • 操作步骤 打开IDEA工具,选择“Create New Project”。 图1 创建工程 在“New Project”页面,选择“Scala”开发环境,并选择“Scala Module”,然后单击“Next”。 如果您需要新建Java语言的工程,选择对应参数即可。 图2 选择开发环境 在工程信息页面,填写工程名称和存放路径,设置JDK版本和Scala SDK,然后单击“Finish”完成工程创建。 图3 填写工程信息
  • 编译并运行程序 在IDEA中右侧单击“Maven”,展开“Lifecycle”,双击“package”,对当前工程进行打包。 使用root用户登录ClickHouse客户端节点,创建运行目录,例如“/opt/test”,在IDEA的“target”目录下获取带有“-with-dependencies”的jar包,并将jar包和idea中conf文件夹一同上传到“/opt/test”目录,如: 执行如下命令,配置环境变量并运行jar包: cd 客户端安装路径 source bigdata_env cd /opt/test java -jar clickhouse-examples-1.0-SNAPSHOT-jar-with-dependencies.jar 显示结果如下: 调用ClickHouse的SpringBoot样例接口触发样例代码运行: Windows环境运行方式: 打开浏览器,输入:http://ClickHouse客户端节点IP:8080/clickhouse/executeQuery,查看浏览器返回信息: ClickHouse springboot client runs normally. Linux环境下执行运行方式: 登录ClickHouse客户端节点,执行如下命令,查看linux下shell日志打印和日志文件打印: curl http://localhost:8080/clickhouse/executeQuery vi clickhouse-springboot-example.log
  • 基本概念 设备 设备指的是在实际场景中拥有传感器的装置。在IoTDB当中,所有的传感器都应有其对应的归属的设备。 传感器 传感器是指在实际场景中的一种检测装置,它能感受到被测量的信息,并能将感受到的信息按一定规律变换成为电信号或其他所需形式的信息输出并发送给IoTDB。在IoTDB当中,存储的所有的数据及路径,都是以传感器为单位进行组织。 存储组 用户可以将任意前缀路径设置成存储组。如果有4条时间序列,如“root.vehicle.d1.s1”、“root.vehicle.d1.s2”、“root.vehicle.d2.s1”和“root.vehicle.d2.s2”,路径“root.vehicle”下的两个设备d1、d2可能属于同一个业主或者同一个厂商,因此关系紧密。这时候就可以将前缀路径“root.vehicle”指定为一个存储组,这将使得IoTDB将其下的所有设备的数据存储在同一个文件夹下。如果以后“root.vehicle”路径下增加了新的设备,也将属于该存储组。 设置合理数量的存储组可以带来性能的提升。既不会因为产生过多的存储文件(夹)导致频繁切换IO降低系统速度(并且会占用大量内存且出现频繁的内存-文件切换),也不会因为过少的存储文件夹(降低了并发度从而)导致写入命令阻塞。 用户应根据自己的数据规模和使用场景,平衡存储文件的存储组设置,以达到更好的系统性能。 时间序列 时间序列是IoTDB中的核心概念。时间序列可以被看作产生时序数据的传感器所在的完整路径,在IoTDB中所有的时间序列必须以root开始、以传感器作为结尾。
  • 在Windows中调测程序 确保本地的hosts文件中配置了远程集群所有主机的主机名和业务IP映射关系。 通过IntelliJ IDEA可直接运行Producer.java,如图1所示: 图1 运行Producer.java运行 运行后弹出控制台窗口,可以看到,Producer正在向默认topic(example-metric1)发送消息,每发送10条,打印一条日志。 图2 Producer运行窗口
  • 查看调测结果 ClickHouse springboot服务启动后,通过ClickHouse样例接口触发样例代码运行,在浏览器中输入需要执行具体操作的链接,如http://localhost:8080/clickhouse/executeQuery,返回结果: ClickHouse springboot client runs normally. 通过ClickHouse日志获取应用运行情况,即日志文件:clickhouse-springboot-example.log。 运行clickhouse-springboot样例后,控制台显示部分运行结果如下: . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.7.0) 2023-02-06 17:58:22.144 INFO 20556 --- [ main] c.h.f.c.e.s.r.ClickHouseApplication : Starting ClickHouseApplication using Java 1.8.0_181 on DESKTOP-64PQBSD with PID 20556 (D:\Code\cloudBU\sample_project\src\springboot\clickhouse-examples\clickhouse-rest-client-example\target\classes started by l00467039 in D:\Code\cloudBU\sample_project\src\springboot\clickhouse-examples\clickhouse-rest-client-example) 2023-02-06 17:58:22.146 INFO 20556 --- [ main] c.h.f.c.e.s.r.ClickHouseApplication : No active profile set, falling back to 1 default profile: "default" 2023-02-06 17:58:22.815 INFO 20556 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) 2023-02-06 17:58:22.820 INFO 20556 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2023-02-06 17:58:22.821 INFO 20556 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.63] 2023-02-06 17:58:22.928 INFO 20556 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2023-02-06 17:58:22.928 INFO 20556 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 750 ms 2023-02-06 17:58:23.175 INFO 20556 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2023-02-06 17:58:23.181 INFO 20556 --- [ main] c.h.f.c.e.s.r.ClickHouseApplication : Started ClickHouseApplication in 1.388 seconds (JVM running for 3.989) 2023-02-06 17:58:32.640 INFO 20556 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' 2023-02-06 17:58:32.640 INFO 20556 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' 2023-02-06 17:58:32.641 INFO 20556 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms 2023-02-06 17:58:32.656 INFO 20556 --- [nio-8080-exec-1] .f.c.e.s.r.c.ClickHouseExampleController : Begin to execute query in clickhouse... 2023-02-06 17:58:32.658 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.r.impl.ClickHouseFunc : loadBalancerIPList is 192.168.6.24, loadBalancerHttpPort is 21422, user is ckuser, clusterName is default_cluster, isSec is true. 2023-02-06 17:58:32.659 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.r.impl.ClickHouseFunc : ckLbServerList current member is 0, ClickhouseBalancer is 192.168.6.24:21422 2023-02-06 17:58:32.664 INFO 20556 --- [nio-8080-exec-1] ru.yandex.clickhouse.ClickHouseDriver : Driver registered 2023-02-06 17:58:32.665 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.restclient.impl.Util : Try times is 0, current load balancer is 192.168.6.24:21422. 2023-02-06 17:58:35.494 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.restclient.impl.Util : Execute sql drop table if exists testdb.testtb on cluster default_cluster no delay, time is 216 ms 2023-02-06 17:58:35.495 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.restclient.impl.Util : Try times is 0, current load balancer is 192.168.6.24:21422. 2023-02-06 17:58:36.074 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.restclient.impl.Util : Execute sql drop table if exists testdb.testtb_all on cluster default_cluster no delay, time is 196 ms 2023-02-06 17:58:36.074 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.restclient.impl.Util : Try times is 0, current load balancer is 192.168.6.24:21422. 2023-02-06 17:58:36.765 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.restclient.impl.Util : Execute sql create database if not exists testdb on cluster default_cluster, time is 218 ms 2023-02-06 17:58:36.765 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.restclient.impl.Util : Try times is 0, current load balancer is 192.168.6.24:21422. 2023-02-06 17:58:37.364 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.restclient.impl.Util : Execute sql 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, time is 198 ms 2023-02-06 17:58:37.366 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.restclient.impl.Util : Try times is 0, current load balancer is 192.168.6.24:21422. 2023-02-06 17:58:37.872 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.restclient.impl.Util : Execute sql create table testdb.testtb_all on cluster default_cluster as testdb.testtb ENGINE = Distributed(default_cluster,testdb,testtb, rand());, time is 160 ms 2023-02-06 17:58:38.959 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.restclient.impl.Util : Insert batch time is 591 ms 2023-02-06 17:58:41.114 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.restclient.impl.Util : Insert batch time is 572 ms 2023-02-06 17:58:43.095 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.restclient.impl.Util : Insert batch time is 413 ms 2023-02-06 17:58:45.220 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.restclient.impl.Util : Insert batch time is 543 ms 2023-02-06 17:58:47.207 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.restclient.impl.Util : Insert batch time is 406 ms 2023-02-06 17:58:49.236 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.restclient.impl.Util : Insert batch time is 460 ms 2023-02-06 17:58:51.197 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.restclient.impl.Util : Insert batch time is 390 ms 2023-02-06 17:58:53.233 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.restclient.impl.Util : Insert batch time is 466 ms 2023-02-06 17:58:55.355 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.restclient.impl.Util : Insert batch time is 555 ms 2023-02-06 17:58:57.321 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.restclient.impl.Util : Insert batch time is 386 ms 2023-02-06 17:58:58.832 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.restclient.impl.Util : Inert all batch time is 20564 ms 2023-02-06 17:58:58.832 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.restclient.impl.Util : Try times is 0, current load balancer is 192.168.6.24:21422. 2023-02-06 17:58:59.256 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.restclient.impl.Util : Execute sql select * from testdb.testtb_all order by age limit 10, time is 119 ms 2023-02-06 17:58:59.257 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.restclient.impl.Util : Try times is 0, current load balancer is 192.168.6.24:21422. 2023-02-06 17:58:59.972 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.restclient.impl.Util : Execute sql select toYYYYMM(date),count(1) from testdb.testtb_all group by toYYYYMM(date) order by count(1) DESC limit 10, time is 289 ms 2023-02-06 17:58:59.973 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.r.impl.ClickHouseFunc : huawei_234 0 2022-12-16 2023-02-06 17:58:59.973 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.r.impl.ClickHouseFunc : huawei_1805 0 2022-12-21 2023-02-06 17:58:59.973 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.r.impl.ClickHouseFunc : huawei_3359 0 2022-12-13 2023-02-06 17:58:59.973 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.r.impl.ClickHouseFunc : huawei_4275 0 2022-12-09 2023-02-06 17:58:59.973 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.r.impl.ClickHouseFunc : huawei_4307 0 2022-12-20 2023-02-06 17:58:59.973 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.r.impl.ClickHouseFunc : huawei_4586 0 2022-12-02 2023-02-06 17:58:59.973 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.r.impl.ClickHouseFunc : huawei_6326 0 2022-12-18 2023-02-06 17:58:59.973 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.r.impl.ClickHouseFunc : huawei_9878 0 2022-12-06 2023-02-06 17:58:59.974 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.r.impl.ClickHouseFunc : huawei_2482 0 2022-12-18 2023-02-06 17:58:59.974 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.r.impl.ClickHouseFunc : huawei_2904 0 2022-12-25 2023-02-06 17:58:59.974 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.r.impl.ClickHouseFunc : 202201 8628 2023-02-06 17:58:59.974 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.r.impl.ClickHouseFunc : 202208 8587 2023-02-06 17:58:59.974 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.r.impl.ClickHouseFunc : 202205 8558 2023-02-06 17:58:59.974 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.r.impl.ClickHouseFunc : 202210 8547 2023-02-06 17:58:59.974 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.r.impl.ClickHouseFunc : 202207 8463 2023-02-06 17:58:59.974 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.r.impl.ClickHouseFunc : 202203 8379 2023-02-06 17:58:59.974 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.r.impl.ClickHouseFunc : 202204 8351 2023-02-06 17:58:59.974 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.r.impl.ClickHouseFunc : 202206 8300 2023-02-06 17:58:59.974 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.r.impl.ClickHouseFunc : 202209 8297 2023-02-06 17:58:59.974 INFO 20556 --- [nio-8080-exec-1] c.h.f.c.e.s.r.impl.ClickHouseFunc : 202212 8228
共100000条