华为云用户手册

  • 操作步骤 SparkSQL表授权、列授权、数据库授权与Hive的操作相同,详情请参见Hive用户权限管理。 在权限管理中,为了方便用户使用,授予数据库下表的任意权限将自动关联该数据库目录的HDFS权限。为了避免产生性能问题,取消表的任意权限,系统不会自动取消数据库目录的HDFS权限,但对应的用户只能登录数据库和查看表名。 若为角色添加或删除数据库的查询权限,数据库中的表也将自动添加或删除查询权限。此机制为Hive实现,SparkSQL与Hive保持一致。 Spark不支持struct数据类型中列名称含有特殊字符(除字母、数字、下划线外的其他字符)。如果struct类型中列名称含有特殊字符,在 FusionInsight Manager的“编辑角色”页面进行授权时,该列将无法正确显示。
  • 相关概念 SparkSQL的语句在SparkSQL中进行处理,权限要求如表1所示。 表1 使用SparkSQL表、列或数据库场景权限一览 操作场景 用户需要的权限 CREATE TABLE “创建”,RWX+ownership(for create external table - the location) 说明: 按照指定文件路径创建datasource表时,需要path后面文件的RWX+ownership权限。 DROP TABLE “Ownership”(of table) DROP TABLE PROPERTIES “Ownership” DESCRIBE TABLE “查询” SHOW PARTITIONS “查询” ALTER TABLE LOCATION “Ownership”,RWX+ownership (for new location) ALTER PARTITION LOCATION “Ownership”,RWX+ownership (for new partition location) ALTER TABLE ADD PARTITION “插入”,RWX+ownership (for partition location) ALTER TABLE DROP PARTITION “删除” ALTER TABLE(all of them except the ones above) “Update”,“Ownership” TRUNCATE TABLE “Ownership” CREATE VIEW “查询”,“Grant Of Select”,“创建” ALTER VIEW PROPERTIES “Ownership” ALTER VIEW RENAME “Ownership” ALTER VIEW ADD PARTS “Ownership” ALTER VIEW AS “Ownership” ALTER VIEW DROPPARTS “Ownership” ANALYZE TABLE “查询”,“插入” SHOW COLUMNS “查询” SHOW TABLE PROPERTIES “查询” CREATE TABLE AS SELECT “查询”,“创建” SELECT “查询” 说明: 与表一样,对视图进行SELECT操作的时候需要有该视图的“查询”权限。 INSERT “插入”,“删除 (for overwrite)” LOAD “插入”,“删除”,RWX+ownership(input location) SHOW CREATE TABLE “查询”,“Grant Of Select” CREATE FUNCTION “管理” DROP FUNCTION “管理” DESC FUNCTION - SHOW FUNCTIONS - MSCK (metastore check) “Ownership” ALTER DATABASE “管理” CREATE DATABASE - SHOW DATABASES - EXPLAIN “查询” DROP DATABASE “Ownership” DESC DATABASE - CACHE TABLE “查询” UNCACHE TABLE “查询” CLEAR CACHE TABLE “管理” REFRESH TABLE “查询” ADD FILE “管理” ADD JAR “管理” HEALTHCHECK -
  • ClickHouse通过MySQL引擎对接RDS服务 MySQL引擎用于将远程的MySQL服务器中的表映射到ClickHouse中,并允许您对表进行INSERT和SELECT查询,以方便您在ClickHouse与MySQL之间进行数据交换。 MySQL引擎使用语法: CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster] ENGINE = MySQL('host:port', ['database' | database], 'user', 'password') MySQL数据库引擎参数说明: host:port :RDS服务MySQL数据库实例IP地址和端口。 database :RDS服务MySQL数据库名。 user :RDS服务MySQL数据库用户名。 password:RDS服务MySQL数据库用户密码,命令中如果携带认证密码信息可能存在安全风险,在执行命令前建议关闭系统的history命令记录功能,避免信息泄露。 MySQL引擎使用示例: 连接到RDS服务的MySQL数据库。详细操作可以参考RDS服务MySQ L实例 连接。 在MySQL数据库上创建表,并插入数据。 创建表mysql_table: CREATE TABLE `mysql_table` ( `int_id` INT NOT NULL AUTO_INCREMENT, `float` FLOAT NOT NULL, PRIMARY KEY (`int_id`)); 插入表数据: insert into mysql_table (`int_id`, `float`) VALUES (1,2); 登录ClickHouse客户端安装节点。执行以下命令,切换到客户端安装目录。 cd /opt/client 执行以下命令配置环境变量。 source bigdata_env 如果当前集群已启用Kerberos认证,执行以下命令认证当前用户,当前用户需要具有创建ClickHouse表的权限,具体请参见ClickHouse用户及权限管理章节,为用户绑定对应角色。如果当前集群未启用Kerberos认证,则无需执行本步骤。 如果是 MRS 3.1.0版本集群,则需要先执行:export CLICKHOUSE_SECURITY_ENABLED=true kinit 组件业务用户 例如,kinit clickhouseuser。 使用客户端命令连接ClickHouse。 clickhouse client --host clickhouse实例IP --user 用户名 --password --port 端口号 输入用户密码 在ClickHouse中创建MySQL引擎的数据库,创建成功后自动与MySQL服务器交换数据。 CREATE DATABASE mysql_db ENGINE = MySQL('RDS服务MySQL数据库实例IP地址:MySQL数据库实例端口', 'MySQL数据库名', 'MySQL数据库用户名', 'MySQL数据库用户名密码'); 切换到新建的数据库mysql_db,并查询表数据。 USE mysql_db; 在ClickHouse中查询MySQL数据库表数据。 SELECT * FROM mysql_table; ┌─int_id─┬─float─┐ │ 1 │ 2 │ └─────┴──── ┘ 新增插入数据后也可以正常进行查询。 INSERT INTO mysql_table VALUES (3,4); SELECT * FROM mysql_table; ┌─int_id─┬─float─┐ │ 1 │ 2 │ │ 3 │ 4 │ └─────┴──── ┘
  • 问题 当使用与Region Server相同的Linux用户(例如omm用户)但不同的kerberos用户(例如admin用户)时,为什么ImportTsv工具执行失败报“Permission denied”的异常? Exception in thread "main" org.apache.hadoop.security.AccessControlException: Permission denied: user=admin, access=WRITE, inode="/user/omm-bulkload/hbase-staging/partitions_cab16de5-87c2-4153-9cca-a6f4ed4278a6":hbase:hadoop:drwx--x--x at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:342) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:315) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:231) at com.xxx.hadoop.adapter.hdfs.plugin.HWAccessControlEnforce.checkPermission(HWAccessControlEnforce.java:69) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:190) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:1789) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:1773) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkAncestorAccess(FSDirectory.java:1756) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFileInternal(FSNamesystem.java:2490) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFileInt(FSNamesystem.java:2425) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFile(FSNamesystem.java:2308) at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.create(NameNodeRpcServer.java:745) at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.create(ClientNamenodeProtocolServerSideTranslatorPB.java:434) at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java) at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:616) at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:973) at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2260) at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2256) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1781) at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2254)
  • 回答 ImportTsv工具在“客户端安装路径/HBase/hbase/conf/hbase-site.xml”文件中“hbase.fs.tmp.dir”参数所配置的HBase临时目录中创建partition文件。因此客户端(kerberos用户)应该在指定的临时目录上具有rwx的权限来执行ImportTsv操作。“hbase.fs.tmp.dir”参数的默认值为“/user/${user.name}/hbase-staging”(例如“/user/omm/hbase-staging”),此处“$ {user.name}”是操作系统用户名(即omm用户),客户端(kerberos用户,例如admin用户)不具备该目录的rwx权限。 上述问题可通过执行以下步骤解决: 在客户端将“hbase.fs.tmp.dir”参数设置为当前kerberos用户的目录(如“/user/admin/hbase-staging”),或者为客户端(kerberos用户)提供已配置的目录所必需的rwx权限。 重试ImportTsv操作。
  • 操作步骤 以Hive客户端安装用户登录安装客户端的节点。 执行以下命令,切换到客户端安装目录。 cd 客户端安装目录 例如安装目录为“/opt/client”,则执行以下命令: cd /opt/client 执行以下命令配置环境变量。 source bigdata_env 集群认证模式是否为安全模式。 是,执行以下命令进行用户认证: kinit Hive业务用户 否,执行5。 执行以下命令,将需要关联的关系型数据库驱动Jar包上传到HDFS目录下。 hdfs dfs -put Jar包所在目录 保存Jar包的HDFS目录 例如将“/opt”目录下ORACLE驱动Jar包上传到HDFS的“/tmp”目录下,则执行如下命令。 hdfs dfs -put /opt/ojdbc6.jar /tmp 按照如下示例,在Hive客户端创建关联关系型数据库的外表。 如果是安全模式,建表的用户需要“ADMIN”权限,ADD JAR的路径请以实际路径为准。 -- 关联oracle linux6版本示例 -- 如果是安全模式,设置admin权限 set role admin; -- 添加连接关系型数据库的驱动jar包,不同数据库有不同的驱动JAR ADD JAR hdfs:///tmp/ojdbc6.jar; CREATE EXTERNAL TABLE ora_test -- hive表的列需比数据库返回结果多一列用于分页查询 (id STRING,rownum string) STORED BY 'com.qubitproducts.hive.storage.jdbc.JdbcStorageHandler' TBLPROPERTIES ( -- 关系型数据库类型 "qubit.sql.database.type" = "ORACLE", -- 通过JDBC连接关系型数据库的url(不同数据库有不同的url格式) "qubit.sql.jdbc.url" = "jdbc:oracle:thin:@//10.163.0.1:1521/mydb", -- 关系型数据库驱动类名 "qubit.sql.jdbc.driver" = "oracle.jdbc.OracleDriver", -- 在关系型数据库查询的sql语句,结果将返回hive表 "qubit.sql.query" = "select name from aaa", -- hive表的列与关系型数据库表的列进行匹配(可忽略) "qubit.sql.column.mapping" = "id=name", -- 关系型数据库用户 "qubit.sql.dbcp.username" = "test", -- 关系型数据库密码,命令中如果携带认证密码信息可能存在安全风险,在执行命令前建议关闭系统的history命令记录功能,避免信息泄露。 "qubit.sql.dbcp.password" = "xxx");
  • 日志级别 Kafka提供了如表3所示的日志级别。 运行日志的级别优先级从高到低分别是ERROR、WARN、INFO、DEBUG,程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。 表3 日志级别 级别 描述 ERROR ERROR表示系统运行的错误信息。 WARN WARN表示当前事件处理存在异常信息。 INFO INFO表示记录系统及各事件正常运行状态信息。 DEBUG DEBUG表示记录系统及系统的调试信息。 如果您需要修改日志级别,请执行如下操作: 请参考修改集群服务配置参数,进入Kafka的“全部配置”页面。 左边菜单栏中选择所需修改的角色所对应的日志菜单。 选择所需修改的日志级别。 保存配置,在弹出窗口中单击“确定”使配置生效。
  • 注意事项 以下是表格属性的使用。 Block大小 单个表的数据文件block大小可以通过TBLPROPERTIES进行定义,系统会选择数据文件实际大小和设置的blocksize大小中的较大值,作为该数据文件在HDFS上存储的实际blocksize大小。单位为MB,默认值为1024MB,范围为1MB~2048MB。若设置值不在[1, 2048]之间,系统将会报错。 一旦block大小达到配置值,写入程序将启动新的CarbonData数据的block。数据以页面大小(32000个记录)的倍数写入,因此边界在字节级别上不严格。 如果新页面跨越配置block的边界,则不会将其写入当前block,而是写入新的block。 TBLPROPERTIES('table_blocksize'='128') 当在CarbonData表中配置了较小的blocksize,而加载的数据生成的数据文件比较大时,在HDFS上显示的blocksize会与设置值不同。这是因为,对于每一个本地block文件的首次写入,即使待写入数据的大小大于blocksize的配置值,也直接将待写入数据写入此block。所以,HDFS上blocksize的实际值为待写入数据大小与blocksize配置值中的较大值。 当CarbonData表中的数据文件block.num小于任务并行度(parellelism)时,CarbonData数据文件的block会被切为新的block,使得blocks.num大于parellelism,这样所有core均可被使用。这种优化称为block distribution。 SORT_SCOPE:指定表创建时的排序范围。如下为四种排序范围。 GLOBAL_SORT:它提高了查询性能,特别是点查询。TBLPROPERTIES('SORT_SCOPE'='GLOBAL_SORT') LOCAL_SORT:数据会本地排序(任务级别排序)。 LOCAL_SORT与分区表的DDL操作存在冲突,不能同时使用,且对分区表性能提升不明显,不建议在分区表上启用该特性。 NO_SORT:默认排序。它将以不排序的方式加载数据,这将显著提升加载性能。 SORT_COLUMNS 此表属性指定排序列的顺序。 TBLPROPERTIES('SORT_COLUMNS'='column1, column3') 如果未指定此属性,则默认情况下,没有列会被排序。 如果指定了此属性,但具有空参数,则表将被加载而不进行排序。例如,('SORT_COLUMNS'='')。 SORT_COLUMNS将接受string,date,timestamp,short,int,long,byte和boolean数据类型。
  • 参数描述 表1 CREATE TABLE参数描述 参数 描述 db_name Database名称,由字母、数字和下划线(_)组成。 col_name data_type 以逗号分隔的带数据类型的列表。列名由字母、数字和下划线(_)组成。 说明: 在CarbonData表创建过程中,不允许使用tupleId,PositionId和PositionReference为列命名,因为具有这些名称的列由二级索引命令在内部使用。 table_name Database中的表名,由字母、数字和下划线(_)组成。 STORED AS 参数carbondata,定义和创建CarbonData table。 TBLPROPERTIES CarbonData table属性列表。
  • 使用场景 通过指定列创建表 CREATE TABLE命令与Hive DDL相同。CarbonData的额外配置将作为表格属性给出。 CREATE TABLE [IF NOT EXISTS] [db_name.]table_name [(col_name data_type , ...)] STORED AS carbondata [TBLPROPERTIES (property_name=property_value, ...)];
  • 示例 CREATE TABLE IF NOT EXISTS productdb.productSalesTable ( productNumber Int, productName String, storeCity String, storeProvince String, productCategory String, productBatch String, saleQuantity Int, revenue Int) STORED AS carbondata TBLPROPERTIES ( 'table_blocksize'='128', 'SORT_COLUMNS'='productBatch, productName')
  • 操作步骤 创建工作流,请参考使用Hue创建工作流。 在工作流编辑页面,选择“子Workflow”按钮,将其拖到操作区中。 在弹出的“Sub workflow”窗口中配置“Sub-workflow”的值,例如从下拉列表中选取“Java-Workflow”(这个值是已经创建好的工作流之一),然后单击“添加”。 单击Oozie编辑器右上角的。 保存前如果需要修改作业名称(默认为“My Workflow”),可以直接单击该名称进行修改,例如“Subworkflow-Workflow”。 保存完成后,单击,提交该作业。 作业提交后,可通过Hue界面查看作业的详细信息、日志、进度等相关内容。
  • 操作场景 用户可以根据业务需要,使用集群客户端创建Kafka Topic。启用Kerberos认证的集群,需要拥有管理Kafka主题的权限。也可以通过KafkaUI修改Topic Configs。 安全模式下,KafkaUI对修改Topic Configs场景,需保证KafkaUI登录用户属于“kafkaadmin”用户组或者单独给用户授予对应操作权限,否则将会鉴权失败。 非安全模式下,KafkaUI对所有操作不作鉴权处理。 该章节仅适用MRS 3.x及之后版本。
  • MRS 3.2.0-LTS.1.1补丁基本信息 表8 补丁基本信息 补丁号 MRS 3.2.0-LTS.1.1 发布时间 2023-04-07 安装前处理 如果MRS集群节点故障或者网络不通,需要先隔离该节点,否则补丁会安装失败。 解决的问题 MRS 3.2.0-LTS.1.1 修复问题列表: 解决Hudi性能优化,增加优化参数控制同步Hive schema问题 解决Hudi表包含decimal字段做ddl变更时,执行clustering报错问题 解决MRS 3.1.2版本创建的hudi bucket索引表,在升级后compaction作业失败问题 解决Table can not read correctly when computed column is in the midst问题 解决Hudi的schema evolution和历史版本不兼容问题 解决Fink无法读取低版本Spark用bulk insert方式写入的timestamp类型数据的精度问题 解决mor表delete数据,下游Flink读任务失败问题 解决Flink流写mor开启同步compaction,包含decimal列,Spark添加一列后重启作业,触发compaction执行失败问题 解决Flink写mor表同时sparksql查询,当Flink触发clean后,Spark查询失败问题 解决mor表有rollback,执行cleanData后Flink schedule生成计划,spark run compaction报空指针问题 解决Flink进行批量作业时权限不足导致作业失败问题 解决Flink指定timestamp读Kafka异常的问题 解决Flink写历史版本创建的bucket索引hudi表,索引数据错乱重复fileid问题 解决Flink On HBase当条件为null时,使用错误下推Filter导致漏数问题 解决Flink on hudi解析的时间范围如果超过2262-04-11 23:47:16,则会解析失败,报错overflow问题 解决Spark/Flink写Hudi表,控制归档文件大小的参数不生效问题 解决Spark任务,有多个ddl语句(drop,truncate,create)长时间执行不结束问题 解决Spark建mor表带timestamp,Flink流读数据有误,相差8h问题 解决cow/mor表执行完drop partition后,首次执行delete报错,堆栈异常问题 解决datasource写Hudi表名和同步的Hive表明不一致,写入失败,sql写location指定到一个存量cow表目录,表名不一致,insert成功的问题 CDL链路hudi-dws性能优化 解决CDL升级后业务用户未添加hadoop组,任务启动失败问题 解决CDL hudi-dws链路配置max.commit.number参数时,偶现同步数据丢失问题 解决当CDL存在链接源端库失败的作业,task线程泄漏,导致作业启动超时问题 解决CDL Hudi connector代码中增加hoodie.datasource.hive_sync.skip_sync_schema参数,默认为true,优化元数据同步性能,减少性能毛刺问题 解决CDL读Hudi表出现404失败,找不到rollback.requested问题 解决CDL Task阻塞导致所有任务Task失败问题 解决Yarn的jdbcserver资源超长时间不释放问题 补丁兼容关系 MRS 3.2.0-LTS.1.1补丁包中包含所有MRS 3.2.0-LTS.1版本单点问题修复补丁。 安装补丁的影响 请参考安装补丁的影响。
  • 二维异形件服装切割 场景描述 服装切割是指将服装裁片放置在布料上,使得使用的布料最少,以最大化布料利用率。通常情况下,布料的宽度是固定的,优化的目标是最小化使用长度。 准备工作 已注册华为云账号,且账号不能处于欠费或者冻结状态,获取项目ID 获取Token 获取EndPoint 步骤一:导入服装切割数据 使用第三方软件集成服务商(比如ET、BOKE)客户端软件生成服装切割数据文件,上传到华为云服装切割服务。需要至少包含以下字段:排版时间、布料宽度、裁片形状、裁片可旋转角度以及其他排版约束等。 { "input_json": { "id": "fu", "order": "fu", "name": "fu", "time": 1, "gap_mode": 0, "overlap": 0, "fabric": { "width": 38, "grid_x": 0, "grid_y": 0 }, "polygon": [ { "index": 0, "profile": [ 0.0, 0.0, 10.0, 0.0, 10.0, 10.0, 0.0, 10.0 ] }, { "index": 1, "profile": [ 0.0, 0.0, 10.0, 0.0, 10.0, 10.0, 0.0, 10.0 ] }, { "index": 2, "profile": [ 0.0, 0.0, 14.0, 0.0, 14.0, 9.0, 0.0, 9.0 ] }, { "index": 3, "profile": [ 0.0, 0.0, 14.0, 0.0, 7.0, 7.0 ] }, { "index": 4, "profile": [ 0.0, 9.0, 0.0, 0.0, 14.0, 9.0 ] }, { "index": 5, "profile": [ 0.0, 0.0, 14.0, 0.0, 14.0, 14.0, 0.0, 14.0 ] }, { "index": 6, "profile": [ 0.0, 0.0, 10.0, 4.0, 10.0, 9.0, 0.0, 9.0 ] }, { "index": 7, "profile": [ 0.0, 0.0, 5.0, 0.0, 5.0, 9.0, 0.0, 9.0 ] }, { "index": 8, "profile": [ 0.0, 0.0, 14.0, 0.0, 14.0, 14.0 ] }, { "index": 9, "profile": [ 0.0, 0.0, 10.0, 0.0, 10.0, 10.0, 0.0, 14.0 ] }, { "index": 10, "profile": [ 0.0, 8.0, 4.0, 0.0, 8.0, 8.0 ] }, { "index": 11, "profile": [ 0.0, 0.0, 14.0, 0.0, 7.0, 12.0 ] } ], "piece": [ { "id": 0, "polygon_index": 0, "gap_index": -1, "hole_index": -1, "tilted": 0, "gap": 0, "pose_group": -1, "column_group": -1, "rot": 90, "flip_x": 0, "flip_y": 0, "remark": "no Y constraints", "y": [] }, { "id": 1, "polygon_index": 1, "gap_index": -1, "hole_index": -1, "tilted": 0, "gap": 0, "pose_group": -1, "column_group": -1, "rot": 90, "flip_x": 0, "flip_y": 0, "remark": "no Y constraints", "y": [] }, { "id": 2, "polygon_index": 2, "gap_index": -1, "hole_index": -1, "tilted": 0, "gap": 0, "pose_group": -1, "column_group": -1, "rot": 90, "flip_x": 0, "flip_y": 0, "remark": "no Y constraints", "y": [] }, { "id": 3, "polygon_index": 3, "gap_index": -1, "hole_index": -1, "tilted": 0, "gap": 0, "pose_group": -1, "column_group": -1, "rot": 90, "flip_x": 0, "flip_y": 0, "remark": "no Y constraints", "y": [] }, { "id": 4, "polygon_index": 4, "gap_index": -1, "hole_index": -1, "tilted": 0, "gap": 0, "pose_group": -1, "column_group": -1, "rot": 90, "flip_x": 0, "flip_y": 0, "remark": "no Y constraints", "y": [] }, { "id": 5, "polygon_index": 5, "gap_index": -1, "hole_index": -1, "tilted": 0, "gap": 0, "pose_group": -1, "column_group": -1, "rot": 90, "flip_x": 0, "flip_y": 0, "remark": "no Y constraints", "y": [] }, { "id": 6, "polygon_index": 6, "gap_index": -1, "hole_index": -1, "tilted": 0, "gap": 0, "pose_group": -1, "column_group": -1, "rot": 90, "flip_x": 0, "flip_y": 0, "remark": "no Y constraints", "y": [] }, { "id": 7, "polygon_index": 7, "gap_index": -1, "hole_index": -1, "tilted": 0, "gap": 0, "pose_group": -1, "column_group": -1, "rot": 90, "flip_x": 0, "flip_y": 0, "remark": "no Y constraints", "y": [] }, { "id": 8, "polygon_index": 8, "gap_index": -1, "hole_index": -1, "tilted": 0, "gap": 0, "pose_group": -1, "column_group": -1, "rot": 90, "flip_x": 0, "flip_y": 0, "remark": "no Y constraints", "y": [] }, { "id": 9, "polygon_index": 9, "gap_index": -1, "hole_index": -1, "tilted": 0, "gap": 0, "pose_group": -1, "column_group": -1, "rot": 90, "flip_x": 0, "flip_y": 0, "remark": "no Y constraints", "y": [] }, { "id": 10, "polygon_index": 10, "gap_index": -1, "hole_index": -1, "tilted": 0, "gap": 0, "pose_group": -1, "column_group": -1, "rot": 90, "flip_x": 0, "flip_y": 0, "remark": "no Y constraints", "y": [] }, { "id": 11, "polygon_index": 11, "gap_index": -1, "hole_index": -1, "tilted": 0, "gap": 0, "pose_group": -1, "column_group": -1, "rot": 90, "flip_x": 0, "flip_y": 0, "remark": "no Y constraints", "y": [] } ], "hole": [], "constraints": {} } } 步骤二:查询服装切割结果 待切割排版任务完成后,查询排版结果。华为云服装排版服务将返回json格式排版结果文件,可以通过第三方软件服务商展示排版结果,生成适配切割机的切割文件。 { "task_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "status": "finished", "start_time": "", "end_time": "", "output_json": { "gap_mode": 0, "id": "fu", "length": 14.0, "name": "fu", "order": "fu", "pieces": [ { "angle": 180.0, "box": [ { "x": 1.110223024560533e-16, "y": 188.54000844217342 }, { "x": 10.0, "y": 202.54000844217342 } ], "flip_x": 0, "flip_y": 0, "id": 9 }, { "angle": 90.0, "box": [ { "x": 1.110223024560533e-16, "y": 180.54018862422214 }, { "x": 9.0, "y": 190.54018862422214 } ], "flip_x": 0, "flip_y": 0, "id": 6 }, { "angle": 90.0, "box": [ { "x": 1.1102230246251565e-16, "y": 251.65141900241923 }, { "x": 9.0, "y": 265.65141900241923 } ], "flip_x": 0, "flip_y": 0, "id": 2 }, { "angle": 0.0, "box": [ { "x": 1.110223024560533e-16, "y": 216.54000844217342 }, { "x": 5.0, "y": 225.54000844217342 } ], "flip_x": 0, "flip_y": 0, "id": 7 }, { "angle": 180.0, "box": [ { "x": 1.1101552619893762e-16, "y": 24.0 }, { "x": 8.0, "y": 32.0 } ], "flip_x": 0, "flip_y": 0, "id": 10 }, { "angle": 270.0, "box": [ { "x": 5.551115123125783e-17, "y": 0.0 }, { "x": 10.0, "y": 10.0 } ], "flip_x": 0, "flip_y": 0, "id": 1 }, { "angle": 90.0, "box": [ { "x": 0.0, "y": 10.0 }, { "x": 12.0, "y": 24.0 } ], "flip_x": 0, "flip_y": 0, "id": 11 }, { "angle": 90.0, "box": [ { "x": 1.1102230246251565e-16, "y": 237.65161696798242 }, { "x": 14.0, "y": 251.65161696798242 } ], "flip_x": 0, "flip_y": 0, "id": 5 }, { "angle": 180.0, "box": [ { "x": 1.1102230246251565e-16, "y": 49.51013170928303 }, { "x": 10.0, "y": 59.51013170928303 } ], "flip_x": 0, "flip_y": 0, "id": 0 }, { "angle": 270.0, "box": [ { "x": 1.110223024560533e-16, "y": 202.54000844217342 }, { "x": 7.0, "y": 216.54000844217342 } ], "flip_x": 0, "flip_y": 0, "id": 3 }, { "angle": 270.0, "box": [ { "x": 1.1102230163533504e-16, "y": 25.020263418566074 }, { "x": 9.0, "y": 39.020263418566074 } ], "flip_x": 0, "flip_y": 0, "id": 4 }, { "angle": 0.0, "box": [ { "x": 1.110214554295684e-16, "y": 166.54018862422214 }, { "x": 14.0, "y": 180.54018862422214 } ], "flip_x": 0, "flip_y": 0, "id": 8 } ], "ratio": 1.265e-321, "time": 1 } } 父主题: 使用场景
  • 二维异形件钣金切割 场景描述 钣金切割是指将钣金件放置在钢板上,使得使用的钢板最少,以最大化钢板利用率。 准备工作 已注册华为云账号,且账号不能处于欠费或者冻结状态,获取项目ID 获取Token 获取EndPoint 步骤一:导入钣金切割数据 使用第三方软件集成服务商(比如FastCAM)客户端软件生成钣金切割数据文件,上传到华为云钣金切割服务。需要至少包含以下字段:排版时间、钢板尺寸、钢板个数、钢板修边距、零件距零件间距、是否共线切割,是否容许空洞排版以及其他排版约束等。 { "task_name": "TESTTASK", "project_name": "TESTPRO", "user_id": "user_123456789", "time": 20, "item_spacing": 10, "plate_spacing": 20, "forbid_internal_nesting": 0, "common_cut_nest": 0, "leadin_before_nesting":2, "plates": [ { "plate_id": 0, "plate_name": "", "plate_length": 4000, "plate_width": 4000, "plate_count": 200 } ], "cams": [ { "item_id": 0, "item_name": "d:\rectangle.cam", "count": 2, "priority": 5, "rotation_type": 2, "flip": 0, "pair_collinear": 0, "collinear_entity_id": 0, "entities": [ { "entity_id": 1, "entity_type": 1, "start_x": 0, "start_y": 0, "end_x": 3200, "end_y": 0, "circle_center_x": 0, "circle_center_y": 0, "dxf_name": "", "entry_type": 0, "ifoutside": 1, "next_entity":4, "last_entity":0 }, { "entity_id": 2, "entity_type": 1, "start_x": 3200, "start_y": 0, "end_x": 3200, "end_y": 1600, "circle_center_x": 0, "circle_center_y": 0, "dxf_name": "", "entry_type": 0, "ifoutside": 1, "next_entity":0, "last_entity":3 }, { "entity_id": 3, "entity_type": -2, "start_x": 3200, "start_y": 1600, "end_x": 0, "end_y": 1600, "circle_center_x": 1600, "circle_center_y": 2200, "dxf_name": "", "entry_type": 0, "ifoutside": 1, "next_entity":2, "last_entity":4 }, { "entity_id": 4, "entity_type": 1, "start_x": 0, "start_y": 1600, "end_x": 0, "end_y": 0, "circle_center_x": 0, "circle_center_y": 0, "dxf_name": "", "entry_type": 0, "ifoutside": 1, "next_entity":3, "last_entity":1 } ] }, { "item_id": 1, "item_name": "d:\rectangle2.cam", "count": 3, "priority": 5, "rotation_type": 2, "flip": 0, "pair_collinear": 0, "collinear_entity_id": 0, "entities":[ { "entity_id": 1, "entity_type": 1, "start_x": 0, "start_y": 0, "end_x": 500, "end_y": 0, "circle_center_x": 0, "circle_center_y": 0, "dxf_name": "", "entry_type": 0, "ifoutside": 1, "next_entity":2, "last_entity":0 }, { "entity_id": 2, "entity_type": 1, "start_x": 500, "start_y": 0, "end_x": 500, "end_y": 500, "circle_center_x": 0, "circle_center_y": 0, "dxf_name": "", "entry_type": 0, "ifoutside": 1, "next_entity":3, "last_entity":1 }, { "entity_id": 3, "entity_type": 1, "start_x": 500, "start_y": 500, "end_x": 0, "end_y": 0, "circle_center_x": 0, "circle_center_y": 0, "dxf_name": "", "entry_type": 0, "ifoutside": 1, "next_entity":0, "last_entity":2 } ] }, { "item_id": 2, "item_name": "d:\rectangle2.cam", "count": 2, "priority": 5, "rotation_type": 2, "flip": 0, "pair_collinear": 0, "collinear_entity_id": 0, "entities":[ { "entity_id": 1, "entity_type": 2, "start_x": 500, "start_y": 0, "end_x": 500, "end_y": 0, "circle_center_x": 0, "circle_center_y": 0, "dxf_name": "", "entry_type": 0, "ifoutside": 1, "next_entity":0, "last_entity":0 } ] } ] , "total_cams":3, } 步骤二:查询钣金切割结果 待切割排版任务完成后,查询排版结果。华为云钣金排版服务将返回json格式排版结果文件,可以通过第三方软件服务商展示排版结果,生成适配切割机的切割文件。 { "task_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "task_type": "test_type", "task_name": "sss", "status": "RUNNING", "created_at": "2018-06-12T13:00:01Z", "updated_at": "2018-06-13T13:00:01Z", "result": { "average_ratio": 0.43922290579330253, "common_cut_nest": 0, "item_spacing": 10.0, "nesting": [ { "item_count": 7, "items": [ { "envelope_rect_center_x": 1605.0000000000018, "envelope_rect_center_y": 1959.4003744920346, "flip_x": 0, "flip_y": 0, "item_angle": 0.0, "item_name": "d:\rectangle.cam" }, { "envelope_rect_center_x": 1605.0000000000018, "envelope_rect_center_y": 3570.133437492032, "flip_x": 0, "flip_y": 0, "item_angle": 0.0, "item_name": "d:\rectangle.cam" }, { "envelope_rect_center_x": 505.0, "envelope_rect_center_y": 3348.425682497144, "flip_x": 0, "flip_y": 0, "item_angle": 0.0, "item_name": "d:\rectangle2.cam" }, { "envelope_rect_center_x": 1136.003821693054, "envelope_rect_center_y": 1105.7330629999974, "flip_x": 0, "flip_y": 0, "item_angle": 0.0, "item_name": "d:\rectangle2.cam" }, { "envelope_rect_center_x": 705.1606452469719, "envelope_rect_center_y": 2827.3374108695393, "flip_x": 0, "flip_y": 0, "item_angle": 0.0, "item_name": "d:\rectangle2.cam" }, { "envelope_rect_center_x": 1001.5517970744211, "envelope_rect_center_y": 2606.6574946969886, "flip_x": 0, "flip_y": 0, "item_angle": 0.0, "item_name": "d:\rectangle2.cam" }, { "envelope_rect_center_x": 269.9895399372879, "envelope_rect_center_y": 1355.7330629372852, "flip_x": 0, "flip_y": 0, "item_angle": 90.0, "item_name": "d:\rectangle2.cam" } ], "plate_id": 0, "plate_length": 3980.0, "plate_name": "", "plate_ratio": 0.43922290579330253, "plate_width": 3980.0 } ], "plate_count": 1, "plate_spacing": 20.0, "project_name": "TESTPRO", "task_name": "TESTTASK", "time": 20, "total_item_count": 7 } } 父主题: 使用场景
  • 登录华为云账号 使用Chrome浏览器访问系统环境地址:https://console.huaweicloud.com/optverse/?agencyId=053a59ad180026111f2ac011f5934368®ion=cn-north-4&locale=zh-cn#/optverse/overview,出现如下界面, 输入华为云账号用户名和密码,点击“登录”按钮, 登录成功后,进入OptVerse首页界面,如下图所示: 父主题: 华为云账号环境准备
  • 调用二维切割服务 单击左侧导航栏“Task/方形件/创建任务”,选中“Headers”配置项,复制获取到的ProjectId值到URL处,Token值到“X-Auth-Token”。 单击“Body”,查看已有的简单的输入数据,也可以根据API说明,填入自己的数据。 单击右上角“Send”按钮发送请求,返回异步计算的任务标识task_id,如图 获取task_id所示。 若输入数据错误则会提示错误原因,如图所示。 单击左侧导航栏“Task/方形件/查询任务”,选中“Headers”配置项,Token值到“X-Auth-Token”。 复制步骤3获取的task_id到API路径的末尾,如上图所示。 单击右上角“Send”按钮发送请求,若计算已完成,则返回任务结果: 否则返回任务状态: 父主题: 调用服务
  • 调用服务 注:步骤1-4、6.1为OBS模式调用服务,非必选 1. 用户使用OBS模式调用OptVerse求解器服务,首次使用需要在华为云OBS服务创建桶 图1 进入OBS服务 图2 创建桶 2. 创建完成后,在列表内点击用户创建的桶名称,进入对象列表,用户需要新建文件夹(求解器以oroas-optvsolver为例)来存放输入输出数据 图3 创建文件存放路径 3. 点击进入新建文件夹(以oroas-optvsolver为例),继续新建输入输出文件夹 图4 创建输入输出路径 4. 进入输入文件夹(以input为例),用户可以上传模型对象、 图5 上传模型文件 5. 创建求解器任务,单击左侧导航栏“Task/求解器/CreateSolverTask”,选中“Headers”配置项,复制获取到的ProjectId值到URL处,Token值到“X-Auth-Token”。 6.1 OBS模式:单击“Body”,在input['data']对象内的bucket参数填入用户将新建的桶名称,object填入用户上传的模型文件路径;在output['data']对象内的object填入输出文件路径。 6.2 Base64模式:单击“Body”,在input['data']对象内的content参数填入base64文件编码; 7. 单击右上角“Send”发送请求,返回异步计算的任务标识task_id。 8. 若请求失败,则返回错误码及对应的错误信息说明,详细错误码信息请参见《天筹求解器OptVerse常见问题》中的“调用OptVerse的API失败时怎么处理?”。 9. 查询求解器任务,单击左侧导航栏“Task/求解器/查询任务”,选中“Headers”配置项,复制Token值到“X-Auth-Token”,复制步骤9获取的task_id到API路径的末尾。 10. 单击右上角“Send”按钮发送请求,返回任务结果: 父主题: 调用求解器服务
  • OBS授权 注:V2版本,用户可以通过请求BODY直接传BASE64文件,OBS授权及使用不是必选项。 OBS授权流程: 1. 用户需要进入华为云 统一身份认证 ,点击创建委托。 图1 进入统一认证身份服务 图2 创建委托 2. 配置用户信息,点击下一步;在委托名称框内填入“oroas_admin_trust”,委托类型选择普通账号,委托账号框填入”op_svc_oroas_container0”,点击下一步; 搜索obs选中“OBS OperateAccess”策略,点击下一步;默认选择所有资源,点击确定。 图3 填写用户信息 图4 填写委托 图5 选择策略 图6 设置最小权限 父主题: 调用求解器服务
  • 数据迁移常用端口 表1 MRS数据迁移常用组件 组件 配置参数 默认端口 端口说明 HDFS dfs.namenode.rpc.port 9820 Hadoop 2.x和Hadoop 3.x版本。 迁移过程中,需要访问NameNode获取文件列表。 dfs.datanode.port 25009 迁移过程中,需要访问DataNode读取具体文件数据。 ZooKeeper clientPort 2181 ZooKeeper客户端连接ZooKeeper服务器。 Kerberos kdc_ports 21732 Kerberos服务认证,非Kerberos集群不涉及。 Hive hive.metastore.port 9083 Hive 2.x和Hive3.x版本。 MetaStore提供Thrift服务的端口。迁移过程中,需要访问该端口查询表元数据信息。 HBase hbase.master.port 16000 HBase1.x和HBase 2.x版本。 HMaster RPC端口。该端口用于HBase客户端连接到HMaster。 hbase.regionserver.port 16020 RS (RegoinServer) RPC端口。该端口用于HBase客户端连接到RegionServer。 Manager N/A 28443 FusionInsight/MRS Manager页面端口。 CDM 迁移时候访问该地址获取集群配置。 N/A 20009 FusionInsight/MRS Manager CAS协议端口,用于登录认证。
  • 数据迁移网络方案说明 进行大数据迁移时,需要保证源端集群和目的端集群之间的网络互通,例如使用hadoop distcp命令跨集群复制数据时需要所有DataNode节点网络互通。根据不同的迁移场景需要使用不同的方式先打通两套集群之间网络连接。 客户线下数据中心迁移数据到华为云MRS集群,通过云专线服务为用户搭建本地数据中心与云上VPC之间的专属连接通道。可以使用华为云的云专线服务或使用第三方的云专线服务来连通华为云网络。 图1 线下数据中心迁移 客户在华为云上自建大数据集群(或老版本的MRS集群)需要迁移到华为云MRS集群,且在同一个Region区域和VPC子网,可以使自建集群和MRS集群使用相同安全组、VPC、子网网络,从而保证网络连通。 图2 线上同Region同VPC迁移 客户在华为云上自建大数据集群(或老版本的MRS集群)需要迁移到华为云MRS集群,且在同一个Region区域,但是使用不同VPC子网。需要使用VPC对等连接方式配置网络连通。 图3 线上同Region不同VPC迁移 客户在华为云上自建大数据集群(或老版本的MRS集群)需要迁移到华为云MRS集权,但在不同Region区域,可以通过使用云连接构建跨区域VPC的网络连接。 图4 线上不同Region迁移
  • Alluxio简介 Alluxio是一个面向基于云的数据分析和人工智能的开源的数据编排技术。它为数据驱动型应用和存储系统构建了桥梁, 将数据从存储层移动到距离数据驱动型应用更近的位置,从而能够更容易、更快的被访问。同时使得应用程序能够通过一个公共接口连接到许多存储系统。 Alluxio主要特点如下: 提供内存级I/O 吞吐率,同时降低具有弹性扩张特性的数据驱动型应用的成本开销 简化 云存储 和对象存储接入 简化数据管理,提供对多数据源的单点访问 应用程序部署简易
  • Presto JDBC使用样例 下面的代码片段在PrestoJDBCExample类中,用于实现JDBC连接Presto TPCDS Catalog。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 private static Connection connection; private static Statement statement; /** * Only when Kerberos authentication enabled, configurations in presto-examples/conf/presto.properties * should be set. More details please refer to https://prestodb.io/docs/0.215/installation/jdbc.html. */ private static void initConnection(String url, boolean krbsEnabled) throws SQLException { if (krbsEnabled) { String filePath = System.getProperty("user.dir") + File.separator + "conf" + File.separator; File proFile = new File(filePath + "presto.properties");if (proFile.exists()) { Properties props = new Properties(); try { props.load(new FileInputStream(proFile)); } catch (IOException e) { e.printStackTrace(); } connection = DriverManager.getConnection(url, props); } } else { connection = DriverManager.getConnection(url, "presto", null); } statement = connection.createStatement(); } private static void releaseConnection() throws SQLException { statement.close(); connection.close(); } public static void main(String[] args) throws SQLException { try { /** * Replace example_ip with your cluster presto server ip. * By default, Kerberos authentication disabled cluster presto service port is 7520, Kerberos * authentication enabled cluster presto service port is 7521 * The postfix /tpcds/sf1 means to use tpcds catalog and sf1 schema, you can use hive catalog as well * If Kerberos authentication enabled, set the second param to true. * see PrestoJDBCExample#initConnection(java.lang.String, boolean). */ initConnection("jdbc:presto://example_ip:7520/tpcds/sf1", false); //initConnection("jdbc:presto://example_ip:7521/tpcds/sf1", true); ResultSet resultSet = statement.executeQuery("select * from call_center"); while (resultSet.next()) { System.out.println(resultSet.getString("cc_name") + " : " + resultSet.getString("cc_employees")); } } catch (SQLException e) { e.printStackTrace(); } finally { releaseConnection(); } }
  • Kafka开源特性 可靠性 提供At-Least Once,At-Most Once,Exactly Once消息可靠传递。消息被处理的状态是在Consumer端维护,需要结合应用层实现Exactly Once。 高吞吐 同时为发布和订阅提供高吞吐量。 持久化 将消息持久化到磁盘,因此可用于批量消费以及实时应用程序。通过将数据持久化到硬盘以及replication的方式防止数据丢失。 分布式 分布式系统,易于向外扩展。每个集群支持部署多个Producer、Broker和Consumer,从而形成分布式的集群,无需停机即可扩展系统。
  • Kafka UI Kafka UI提供Kafka Web服务,通过界面展示Kafka集群中Broker、Topic、Partition、Consumer等功能模块的基本信息,同时提供Kafka服务常用命令的界面操作入口。该功能作为Kafka Manager替代,提供符合安全规范的Kafka Web服务。 通过Kafka UI可以进行以下操作: 支持界面检查集群状态(主题,消费者,偏移量,分区,副本,节点) 支持界面执行集群内分区重新分配 支持界面选择配置创建主题 支持界面删除主题(Kafka服务设置了参数“delete.topic.enable = true”) 支持为已有主题增加分区 支持更新现有主题的配置 可以为分区级别和主题级别度量标准启用JMX查询
  • Kafka结构 生产者(Producer)将消息发布到Kafka主题(Topic)上,消费者(Consumer)订阅这些主题并消费这些消息。在Kafka集群上一个服务器称为一个Broker。对于每一个主题,Kafka集群保留一个用于缩放、并行化和容错性的分区(Partition)。每个分区是一个有序、不可变的消息序列,并不断追加到提交日志文件。分区的消息每个也被赋值一个称为偏移顺序(Offset)的序列化编号。 图1 Kafka结构
  • Kafka原理 消息可靠性 Kafka Broker收到消息后,会持久化到磁盘,同时,Topic的每个Partition有自己的Replica(备份),每个Replica分布在不同的Broker节点上,以保证当某一节点失效时,可以自动故障转移到可用消息节点。 高吞吐量 Kafka通过以下方式提供系统高吞吐量: 数据磁盘持久化:消息不在内存中缓存,直接写入到磁盘,充分利用磁盘的顺序读写性能。 Zero-copy:减少IO操作步骤。 数据批量发送:提高网络利用率。 Topic划分为多个Partition,提高并发度,可以由多个Producer、Consumer数目之间的关系并发来读、写消息。Producer根据用户指定的算法,将消息发送到指定的Partition。 消息订阅-通知机制 消费者对感兴趣的主题进行订阅,并采取pull的方式消费数据,使得消费者可以根据其消费能力自主地控制消息拉取速度,同时,可以根据自身情况自主选择消费模式,例如批量、重复消费,从尾端开始消费等;另外,需要消费者自己负责维护其自身消息的消费记录。 可扩展性 当在Kafka集群中可通过增加Broker节点以提供更大容量时。新增的Broker会向ZooKeeper注册,而Producer及Consumer会及时从ZooKeeper感知到这些变化,并作出调整。
  • 访问控制 MRS提供两种访问控制权限模型:基于角色的权限控制和基于策略的权限控制,详情请参见权限模型。 基于角色的权限控制 MRS基于用户和角色的认证统一体系,遵从账户/角色RBAC(Role-Based Access Control)模型,实现通过角色进行权限管理,对用户进行批量授权管理,同时提供单点登录能力,统一了系统用户和组件用户的管理及认证。具体机制详情描述请参见权限机制。 基于策略的权限控制 Ranger鉴权 MRS提供了基于Ranger的鉴权方案,对于MRS安全集群,默认启用了Ranger鉴权;对于安装了Ranger服务的普通集群,Ranger可以支持基于OS用户进行组件资源的权限控制。 Ranger鉴权的具体策略请参见鉴权策略。 OBS存算分离细粒度鉴权 对于OBS存算分离集群,如果您想对OBS上的资源进行细粒度的权限控制,可以通过MRS提供的基于 IAM 委托的细粒度权限控制方案进行配置,请参见配置MRS多用户访问OBS细粒度权限。
  • Flink关键特性 流式处理 高吞吐、高性能、低时延的实时流处理引擎,能够提供毫秒级时延处理能力。 丰富的状态管理 流处理应用需要在一定时间内存储所接收到的事件或中间结果,以供后续某个时间点访问并进行后续处理。Flink提供了丰富的状态管理相关的特性,包括: 多种基础状态类型:Flink提供了多种不同数据结构的状态支持,如ValueState、ListState、MapState等。用户可以基于业务模型选择最高效、合适状态类型。 丰富的State Backend:State Backend负责管理应用程序的状态,并根据需要进行Checkpoint。Flink提供了不同State Backend,State可以存储在内存上或RocksDB等上,并支持异步以及增量的Checkpoint机制。 精确一次语义:Flink的Checkpoint和故障恢复能力保证了任务在故障发生前后的应用状态一致性,为某些特定的存储支持了事务型输出的功能,即使在发生故障的情况下,也能够保证精确一次的输出。 丰富的时间语义 时间是流处理应用的重要组成部分,对于实时流处理应用来说,基于时间语义的窗口聚合、检测、匹配等运算是很常见的。Flink提供了丰富的时间语义。 Event-time:使用事件本身自带的时间戳进行计算,使乱序到达或延迟到达的事件处理变得更加简单。 Watermark:Flink引入Watermark概念,用以衡量事件时间的发展。Watermark也为平衡处理时延和数据完整性提供了灵活的保障。当处理带有Watermark的事件流时,在计算完成之后仍然有相关数据到达时,Flink提供了多种处理选项,如将数据重定向(side output)或更新之前完成的计算结果。 Processing-time和Ingestion-time。 高度灵活的流式窗口:Flink能够支持时间窗口、计数窗口、会话窗口,以及数据驱动的自定义窗口,可以通过灵活的触发条件定制,实现复杂的流式计算模式。 容错机制 分布式系统,单个Task或节点的崩溃或故障,往往会导致整个任务的失败。Flink提供了任务级别的容错机制,保证任务在异常发生时不会丢失用户数据,并且能够自动恢复。 Checkpoint:Flink基于Checkpoint实现容错,用户可以自定义对整个任务的Checkpoint策略,当任务出现失败时,可以将任务恢复到最近一次Checkpoint的状态,从数据源重发快照之后的数据。 Savepoint:一个Savepoint就是应用状态的一致性快照,Savepoint与Checkpoint机制相似,但Savepoint需要手动触发,Savepoint保证了任务在升级或迁移时,不丢失当前流应用的状态信息,便于任何时间点的任务暂停和恢复。 Flink SQL Table API和SQL借助了Apache Calcite来进行查询的解析,校验以及优化,可以与DataStream和DataSet API无缝集成,并支持用户自定义的标量函数,聚合函数以及表值函数。简化数据分析、ETL等应用的定义。下面代码示例展示了如何使用Flink SQL语句定义一个会话点击量的计数应用。 SELECT userId, COUNT(*) FROM clicks GROUP BY SESSION(clicktime, INTERVAL '30' MINUTE), userId 有关Flink SQL的更多信息,请参见:https://ci.apache.org/projects/flink/flink-docs-master/dev/table/sqlClient.html。 CEP in SQL Flink允许用户在SQL中表示CEP(Complex Event Processing)查询结果以用于模式匹配,并在Flink上对事件流进行评估。 CEP SQL通过MATCH_RECOGNIZE的SQL语法实现。MATCH_RECOGNIZE子句自Oracle Database 12c起由Oracle SQL支持,用于在SQL中表示事件模式匹配。CEP SQL使用举例如下: SELECT T.aid, T.bid, T.cid FROM MyTable MATCH_RECOGNIZE ( PARTITION BY userid ORDER BY proctime MEASURES A.id AS aid, B.id AS bid, C.id AS cid PATTERN (A B C) DEFINE A AS name = 'a', B AS name = 'b', C AS name = 'c' ) AS T
共100000条