云服务器内容精选

  • 创建子工程ServiceA 创建Maven工程。 图2 创建Maven工程 新建src目录。 图3 新建src目录 编写业务代码。 图4 业务代码文件 编写启动类 package com.huawei.demo.servicea; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; /** * 启动类 * * @author XXX * @since 2023-12-05 */ @SpringBootApplication @EnableEurekaClient public class ServiceASpringbootApplication { public static void main(String[] args) { SpringApplication.run(ServiceASpringbootApplication.class, args); } } 编写Controller类 package com.huawei.demo.servicea.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.huawei.demo.servicea.pojo.UserInfo; import com.huawei.demo.servicea.service.UserService; /** * 用户对外接口 * * @author XXX * @since 2023-12-06 */ @RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @GetMapping("/{userId}") public UserInfo getUserByName(@PathVariable String userId) { return userService.getUserById(userId); } } 编写Mapper类 package com.huawei.demo.servicea.mapper; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; import com.huawei.demo.servicea.pojo.UserInfo; /** * 用户查询 * * @author XXX * @since 2023-12-06 */ @Mapper public interface UserMapper { @Select("select * from demo_user_info where user_id = #{userId}") UserInfo getUserById(String userId); } 编写Pojo类 package com.huawei.demo.servicea.pojo; import lombok.Data; /** * user信息 * * @author XXX * @since 2023-12-06 */ @Data public class UserInfo { private String userId; private String userName; private String phone; private String address; } 编写Service类 package com.huawei.demo.servicea.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.huawei.demo.servicea.mapper.UserMapper; import com.huawei.demo.servicea.pojo.UserInfo; /** * userService * * @author XXX * @since 2023-12-06 */ @Service public class UserService { @Autowired private UserMapper userMapper; public UserInfo getUserById(String userId) { return userMapper.getUserById(userId); } } 配置微服务 server: port: 8081 spring: application: name: demoServiceA datasource: url: jdbc:mysql://127.0.0.1:3306/spring_cloud_demo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai username: root password: *** driver-class-name: com.mysql.jdbc.Driver mybatis: configuration: map-underscore-to-camel-case: true type-aliases-package: com.huawei.dmo.servicea
  • 开发流程 本文档主要介绍在CloudTable集群模式下如何调用HBase开源接口进行Java应用程序的开发。 开发流程中各阶段的说明如图1和表1所示。 图1 应用程序开发流程 表1 应用开发的流程说明 阶段 说明 参考文档 了解基本概念 在开始开发应用前,需要了解HBase的基本概念,了解场景需求,设计表等。 HBase 准备开发环境 HBase应用程序当前推荐使用Java语言进行开发。可使用Eclipse工具。 开发环境简介 准备运行环境 应用程序的运行环境即客户端环境,请根据指导完成客户端的安装和配置。 准备Windows运行环境 准备工程 CloudTable为用户提供了不同场景下的样例程序,您可以导入样例工程进行程序学习。或者您可以根据指导,新建一个工程。 下载样例工程 配置并导入工程 根据场景开发工程 提供了Java语言的样例工程,包含从建表、写入到删除表全流程的样例工程。 开发HBase应用 编译并运行程序 指导用户将开发好的程序编译并提交运行。 编译并运行程序 安装客户端时编译并运行程序 或 未安装客户端时编译并运行程序 查看程序运行结果 程序运行结果会写在用户指定的路径下。用户还可以通过UI查看应用运行情况。 在Windows环境中:查看调测结果 在Linux环境中:查看调测结果 父主题: HBase应用开发指导
  • 数据查询 【规则】不要使用select *,只查询需要的字段,减少机器负载,提升查询性能。 OLAP分析场景,一张大宽表通常能有几百甚至上千列,选择其中少数的几列做维度列、指标列计算。在这种场景下,ClickHouse的数据也是按照列存储。如果使用select *,会加重系统的压力。 【规则】通过limit限制查询返回的数据量,节省计算资源、减少网络开销。 如果返回的数据量过大,客户端有可能出现内存溢出等服务异常。在前端使用ClickHouse的场景下,如果要查询的数据量比较大,建议每次可适当的进行分页查询返回数据,以减少查询数据量对网络带宽和计算资源的占用。 【规则】关联查询必须大表join小表。 对于ClickHouse来说,原则上需要把多表join模型提前加工为宽表模型,多个表以及维度表变化比较频繁情况下,不适合进行宽表加工处理,必须使用Join模型以实时查询到最新数据。两个表做join操作,建议大表join小表,必须使用关联条件。小表的数据量控制在百万~千万行级别,且需要在join前把小表数据通过条件进行有效过滤。 【建议】使用GLOBAL JOIN/IN替换普通的JOIN。 ClickHouse基于分布式表查询会转换成所有分片的本地表操作,再汇总结果。实际使用中,join和global join的执行逻辑差别很大,建议使用global join做分布式表查询。 【规则】合理使用数据表的分区字段和索引字段。 MergeTree引擎,数据是以分区目录形式进行组织存储的,在进行数据查询时,使用分区可以有效跳过无用的数据文件,减少数据的读取。 MergeTree引擎会根据索引字段进行数据排序,并且根据index_granularity的配置生成稀疏索引。根据索引字段查询,能快速过滤数据,减少数据的读取,大大提升查询性能。 【建议】明确数据查询的范围。 增加条件过滤和查询数据周期过滤,缩小数据查询范围。例如查询指定分区,通过指定分区字段会减少底层数据库扫描的文件数量,提升查询性能。例如:700个分区的千列大表,需要查询一个分区中有7000万数据,其他699个分区中无数据,虽然只有一个分区有数据,其他分区无数据,但是查询指定分区为百毫秒级性能,没有指定分区查询性能为1~2秒左右,性能相差20倍。 【建议】慎用final查询。 在查询语句的最后跟上final,通常是对于ReplacingMergeTree引擎,数据不能完全去重情况下,少数开发人员习惯使用final关键字进行实时合并去重操作(merge-on-read),保证查询数据无重复数据。可以通过argMax函数或其他方式规避此问题。 【建议】使用物化视图加速查询。 对于固定查询方式的场景,建议使用物化视图,提前做好数据聚合,相对于查询明细表,性能有数量级的提升。 【建议】物化视图创建时不会进行语法校验,只有发生实际数据插入与查询时才会出错。物化视图上线前,需做好充分验证。
  • 数据写入 【规则】外部模块保证数据导入的幂等性。 ClickHouse不支持数据写入的事务保证。通过外部导入数据模块控制数据的幂等性,比如某个批次的数据导入异常,则drop对应分区数据或清理掉导入的数据后,重新导入该分区或批次数据。 【规则】大批量少频次的写入数据。 ClickHouse每次插入数据时,都会生成一到多个part文件,如果data part过多,merge压力会变大,甚至出现各种异常情况影响数据插入。建议每个批次5k到100k行,根据写入字段数量调整写入行数,降低写入节点内存和CPU的压力,每秒不超过1次插入。 【建议】一次只插入一个分区内的数据。 如果数据属于不同的分区,则每次插入不同分区的数据会独立生成part文件,导致part总数量膨胀,建议一批插入的数据属于同一个分区。 【建议】慎用分布式表批量插入。 写分布式表时,数据会分发到集群的所有本地表,每个本地表插入的数据量是总插入量的1/N,batch size可能比较小,会导致data part过多,merge压力变大,甚至出现异常影响数据插入。 数据的一致性问题:数据先在分布式表写入节点的主机落盘,然后数据被异步地发送到本地表所在主机进行存储,中间没有一致性的校验,如果分布式表写入数据的主机出现异常,会存在数据丢失风险。 对于数据写分布式表和数据写本地表相比,分布式表数据写入性能会变慢,单批次分布式表写入节点的磁盘和网络IO会成为性能的瓶颈点。 分布式表转发给各个shard成功与否,插入数据的客户端是无法感知,转发失败的数据会不断重试转发消耗CPU。 只有在数据去重的场景下,可以使用分布式表插入,通过sharding key将要去重的数据转发到同一个shard,方便后续去重查询。 【建议】慎用delete、update操作。 标准SQL的更新、删除操作是同步的,即客户端等服务端返回执行结果在执行。而Clickhouse的update、delete是通过异步方式实现的,当执行update语句时,服务端立即响应,实际上此时数据还没变,而是排队等待,可能会出现操作覆盖的情况,也无法保证操作的原子性。如果业务场景有update、delete等操作,建议使用ReplacingMergeTree、CollapsingMergeTree、VersionedCollapsingMergeTree引擎。 【建议】谨慎执行optimize操作。 Optimize一般会对表做重写操作,建议在业务压力小时候进行操作,否则对IO/MEM/CPU资源有较大消耗,导致业务查询变慢或不可用。 【建议】降低对表的修改频次,多个字段修改时,建议使用单条ALTER TABLE命令修改。 默认场景下ClickHouse执行alter语句是异步执行,对同一张表频繁执行alter操作可能导致业务失败。ClickHouse每次修改列时都会进行元数据的操作,多次操作会增加集群的负担,尤其是zookeeper的负担,影响集群的稳定。可以使用一条语句进行多列的修改。
  • 建表规范 【规则】不要在system库中创建业务表。system数据库是ClickHouse默认的系统数据库,默认数据库中的系统表记录的是系统的配置、元数据等信息数据。业务在使用ClickHouse的时候,需要指定自己业务的数据库进行连接和使用,业务相关的表创建在自己业务库中,不要将业务表创建在系统数据库中,避免对系统数据库造成不必要的影响。 【规则】数据库和表的命名尽量不要使用SQL保留字,请注意大小写敏感。如果必须使用一些保留关键字,请使用双引号或者反引号进行转义。 【规则】不允许使用字符类型存放时间或日期类数据,尤其是日期字段进行运算或比较的时候。 【规则】不允许使用字符类型存放数值类型的数据,尤其是数值字段进行运算或者比较的时候。 【建议】不建议表使用Nullable列,可以考虑使用字符串“NA”。 Nullable类型的列在做查询条件判断时,会进一步做判空等处理,防止造成额外的计算开销。根据现网的历史经验,Nullable类型的字符串查询性能比String慢20%至30%左右,从性能方面考虑,非必要不使用Nullable类型。
  • 建表规范 【强制】创建表指定分桶buckets时,每个桶的数据大小为应保持在100M-3G之间,单分区中最大分桶数据不超过5000。 【强制】表数据超过5亿条以上必须设置分区分桶策略。 【强制】分桶的列不要设置太多,一般情况下1或2个列,同时需要兼顾数据分布均匀和查询吞吐之间的均衡,考虑数据均匀是为了避免某些桶的数据存在倾斜影响数据均衡和查询效率,考虑查询吞吐是为了利用查询SQL的分桶剪裁优化避免全桶扫描提升查询性能,所以优先考虑哪些数据较为均匀且常用于查询条件的列适合做分桶列。 【强制】2000kw 以内数据禁止使用动态分区(动态分区会自动创建分区,而小表用户客户关注不到,会创建出大量不使用分区分桶)。 【强制】创建表时的副本数必须至少为2,默认是3,禁止使用单副本。 【建议】单表物化视图不能超过6个。 【建议】对于有大量历史分区数据,但是历史数据比较少,或者不均衡,或者查询概率的情况,使用如下方式将数据放在特殊分区: 对于历史数据,如果数据量比较小我们可以创建历史分区(比如年分区,月分区),将所有历史数据放到对应分区里。 创建历史分区方式:FROM ("2000-01-01") TO ("2022-01-01") INTERVAL 1 YEAR。 【建议】1000w-2亿以内数据为了方便可以不设置分区,直接用分桶策略(不设置其实Doris内部会有个默认分区)。 【建议】如果分桶字段存在30%以上的数据倾斜,则禁止使用Hash分桶策略,改使用random分桶策略:Create table ... DISTRIBUTED BY RANDOM BUCKETS 10 ... 【建议】建表时第一个字段一定是最常查询使用的列,默认有前缀索引快速查询能力,选取分区分桶外最长查询且高基数的列,前缀索引36位,如果列超长也不能使用前缀索引能力。 【建议】亿级别以上数据,如果有模糊匹配或者等值/in条件,可以使用倒排索引或者是 Bloomfilter。如果是低基数列的正交查询适合使用bitmap索引。 【强制】Doris 建表不要指定Merge-On-Write属性,当前有很多开源问题,不推荐。如使用了该属性,CloudTable服务不承诺SLA。
  • 数据查询规范 【强制】鉴于外表存在不稳定性,目前doris暂不支持外表查询。 【强制】in中条件超过2000后,必须修改为子查询。 【强制】禁止使用REST API(Statement Execution Action)执行大量SQL查询,该接口仅仅用于集群维护。 【建议】一次insert into select数据超过1亿条后,建议拆分为多个insert into select语句执行,分成多个批次来执行。如果非要这样执行不可,必须在集群资源相对空闲的时候可以通过调整并发度来加快的数据导入速度 。 例如:set parallel_fragment_exec_instance_num = 8 建议数值是单BE节点上CPU内核的一半。 【强制】query查询条件返回结果在5w条以上,使用JDBC Catalog或者OUTFILE方式导出。不然大量FE上数据传输将占用FE资源,影响集群稳定性。 如果是交互式查询,建议使用分页方式(offset limit),分页要加Order by。 如果是数据导出提供给第三方使用,建议使用 outfile或者export 方式。 【强制】2个以上大于3亿的表JOIN使用Colocation Join。 【强制】亿级别大表禁止使用select * 查询,查询时需要明确要查询的字段。 使用SQL Block方式禁止这种操作。 如果是高并发点查,建议开启行存(2.x版本)。 使用PreparedStatement查询。 【强制】亿级以上表数据查询必须带分区分桶条件。 【建议】尽量不要使用OR作为JOIN条件。 【建议】大量数据排序(5亿以上)后返回部分数据,建议先减少数据范围再执行排序,否则大量排序会影响性能。 例如:将from table order by datatime desc limit 10优化为from table where datatime='2023-10-20' order by datatime desc limit 10。
  • 数据变更类 【强制】应用程序不可以直接使用delete后者update语句变更数据,可以使用CDC的upsert方式来实现。 低频操作上使用,比如Update几分钟更新一次。 如果使用Delete一定带上分区条件。 【强制】禁止使用INSERT INTO tbl1 VALUES (“1”), (“a”);这种方式做数据导入,少量少次写可以,多量多频次时要使用Doris提供的StreamLoad、BrokerLoad、SparkLoad或者Flink Connector方式。 【建议】执行特殊的长SQL操作时,可以使用SELECT /*+ SET_VAR(query_timeout = xxx*/ from table 类似这样通过Hint方式去设置Session 会话变量,不要设置全局的系统变量。
  • 约束限制 仅支持Flink1.15版本使用委托授权访问临时凭证: 在创建作业时,请配置作业使用Flink1.15版本 已在作业中配置允许 DLI 访问DEW的委托信息。flink.dli.job.agency.name=自定义委托名称。 自定义委托请参考自定义DLI委托权限。 请注意配置参数不需要用"" 或 '' 包裹。 Flink1.15基础镜像内置了3.1.62版本的huaweicloud-sdk-core。
  • 功能描述 DLI提供了一个通用接口,可用于获取用户在启动Flink作业时设置的委托的临时凭证。该接口将获取到的该作业委托的临时凭证封装到com.huaweicloud.sdk.core.auth.BasicCredentials类中。 获取到的委托的临时认证封装到com.huaweicloud.sdk.core.auth.ICredentialProvider接口的getCredentials()返回值中。 返回类型为com.huaweicloud.sdk.core.auth.BasicCredentials。 仅支持获取AK、SK、SecurityToken。 获取到AK、SK、SecurityToken后,请参考如何使用凭据管理服务替换硬编码的数据库账号密码查询凭据。
  • 使用说明 AstroZero通过对接软件开发生产线(CodeArts)和代码托管(CodeArts Repo),提供应用代码托管、代码检查、代码编译、验证、部署、发布功能,实现软件持续集成(Continuous Integration,简称CI)和持续交付(Continuous Delivery,简称CD)。 软件开发生产线(CodeArts)是集华为近30年研发实践、前沿研发理念、先进研发工具为一体的一站式云端DevOps平台,面向开发者提供的云服务,即开即用,让开发者快速而又轻松地开启云端开发之旅。更多介绍,请参见软件开发生产线(CodeArts)产品文档。 代码托管CodeArts Repo(原CodeHub)源自华为千亿级代码管理经验,基于Git,提供企业代码托管的全方位服务,为软件开发者提供基于Git的在线 代码托管服务 ,包括代码克隆/下载/提交/推送/比较/合并/分支/Code Review等功能。更多介绍,请参见代码托管(CodeArts Repo)帮助文档。
  • 步骤3:进行代码托管 将AstroZero上开发的应用代码元数据归档到代码仓库。这里以归档某开发环境某个应用为例进行说明,您可对多个配置代码库的AstroZero环境的多个应用进行代码托管。 返回AstroZero经典版开发环境首页,单击某一需要归档代码的应用,进入应用开发页面。 参考图11和图12,在左侧单击。 首次归档应用代码,所有代码显示在“未暂存的更改”下,单击后面的“+”,再单击。设置归档描述信息,单击“确认”,即可归档该应用所有代码。支持选择部分代码归档,在需要归档的代码目录后,单击“+”进行操作即可。 图11 归档代码 图12 设置归档描述 单击“源代码管理”后的,打开代码仓库首页。 图13 提交代码 在代码仓库“文件”页签下,单击“Application”,可查看应用的归档代码。 图14 查看归档应用 图15 查看应用代码 代码仓库“提交网络”页签是以流向图的形式展现了某条分支或标签的整个提交(commit)历史(包括动作、时间、提交者、提交系统生成备注和手动填写备注)以及提交历史的关系。
  • 配置设备连接信息 解压Demo压缩包,在“src”目录的底层路径下找到DeviceConnectDemo.java文件。 使用Java编辑工具打开这个文件,编辑设备连接的信息。运行成功后,在“设备管理”页面可以看到在线设备状态。 Demo工程中依赖的软件包在lib目录下,使用Demo时需要将demo的lib目录设置为当前工程的lib目录。 // 设备连接地址,格式为:tcp://ip:port final String host = ""; // 设备客户端ID final String clientId = ""; // 示例仅用作测试或示意,设备认证的用户名为敏感信息,请勿硬编码使用 final String userName = ""; // 示例仅用作测试或示意,设备认证的密码为敏感信息,请勿硬编码使用 final String password = ""; // 设备Publish权限的Topic final String pubTopic = ""; // 设备Subscribe权限的Topic final String subTopic = ""; // 设备发送的消息内容 final String payload = "hello world.";
  • 前提条件 准备装有1.8及以上版本JDK的Linux服务器。 IntelliJ IDEA版本为:2018.3.5或以上版本,Eclipse版本为:3.6.0或以上版本。 通过Demo(sha256:34c9bc8d99eba4ed193603019ce2b69afa3ed760a452231ece3c89fd7dd74da1)获取RealtimeConnector.rar包。 用户程序向MQS写入消息的TPS不能超过6000/s。
  • 准备开发环境 安装开发工具 请根据所使用语言选择适合的开发工具。 安装2018.3.5或以上版本的IntelliJ IDEA,安装包请至IntelliJ IDEA官方网站下载。 安装3.0.3及以上版本Apache Maven,安装包请至Maven官方下载页面下载。 安装2019 version 16.8.4及以上版本的Visual Studio,安装包请至Visual Studio官方网站下载。 安装开发语言环境 Java:安装1.8.111或以上版本的Java Development Kit,安装包请至Oracle官方下载页面下载。 Python:安装2.7或3.X版本的Python,安装包请至Python官方下载页面下载。 Go:安装1.14及以上版本的Go,安装包请至Go官方下载页面下载。 C#:安装6.0及以上版本的.NET,安装包请至.NET官方下载页面下载。