华为云用户手册

  • 显示的创建一个集合 也可以通过 CreateCollection()方法显示的创建一个集合,并在创建时候指定该集合的属性。 db:= client.Database("test") ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second) defer cancel() sizeInBytes := int64(200000) testCollection := db.CreateCollection(ctx,"testCollection",&options.CreateCollectionOptions{SizeInBytes: &sizeInBytes})
  • 前提条件 连接数据库的弹性云服务器必须和DDS实例之间网络互通,可以使用curl命令连接DDS实例服务端的IP和端口号,测试网络连通性。 curl ip:port 返回“It looks like you are trying to access MongoDB over HTTP on the native driver port.”,说明网络互通。 如果开启SSL,需要在界面上下载根证书,并上传到弹性云服务器。
  • 驱动下载 建议使用go mod下载驱动 require go.mongodb.org/mongo-driver v1.12.1 go文件中导入: import ( "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" "go.mongodb.org/mongo-driver/mongo/readpref" )
  • 注意事项 避免误删除。删除命令不能撤回,所以在删除前先执行db命令查看下当前所在的库。 一旦误删除后,恢复时注意以下几点: 根据历史备份文件,进行备份和恢复。 如果有备份实例,从备份实例中,通过导入和导出恢复。误删除后,恢复过程如果有新的数据写入,需要业务端考虑数据的一致性问题,即是否应该执行恢复。 实例最后的备份时间点至当前误删除时间点的数据,无法进行恢复。 删除命令,如果执行成功,则表示成功。如果执行失败,此时可能已经删除了部分数据了。所以不要继续使用删除的库表。建议继续下发删除命令,直到删除成功为止。 使用删除命令删除业务数据会造成业务数据丢失。
  • 注意事项 update和upsert:upsert内部会先做一次查询,如果查询不存在则插入,否则执行update。如果业务上场景可以进行相关记录,则避免使用upsert命令,建议直接使用update或insert。 update也需要匹配索引。 避免COLLSCAN全表扫描。 查询条件和索引字段匹配有顺序性。 insert/update命令中涉及的文档,最大不能超过16MB。 使用写入/更新命令修改业务数据会造成业务数据变更。
  • 注意事项 查询的结果,返回的是一个Currsor。Cursor使用完毕后要及时关闭,否则会产生内存堆积。 根据查询条件创建必要的索引,索引设计请参见索引设计规范。 避免COLLSCAN全表扫描。 查询条件和索引字段匹配有顺序性。 对于集群实例,根据业务对表进行合理地分片,分片设计请参见分片设计规范。 对于分片表,查询条件要基于shardKey进行,避免出现scatter-gather等不必要的查询。详情请参见Distributed Queries。 查询可以指定readConcern级别,详情请参见Read Concern。 查询可以指定readPerference参数,详情请参见Read Preference。
  • 自定义角色 用户自定义角色是用户通过命令创建的定制化的角色,只包含CRUD操作的一种或多种,或者内置角色的一种或多种。可以通过命令针对不同的资源、不同的操作进行自定义,除了预置角色无法被修改以外,其他应用方式是相同的。 创建、修改和删除角色 要创建角色前,需使用具有权限的用户(可使用rwuser)连接到数据库实例。详情请参见连接数据库。 通过createRole创建自定义角色,可以针对不同db,不同的collection进行权限控制,也可以从其他角色上继承。 角色创建完成后如需调整权限可通过grantPrivilegesToRole,grantRolesToRole,revokeRolesFromRole或revokePrivilegesFromRole命令获取或者回收回权限。详情请参见创建并管理角色。 父主题: 角色管理
  • 预置角色 预置角色是系统自动生成的角色信息,客户端可用的预置角色名称有read,readWrite。 mongodb使用角色来管理数据库的,所以创建一个用户时就需要赋予一个角色。角色除了内置之外,也可以自定义角色。 表1 常见内置角色 角色 权限描述 包含的操作命令 read read角色包含读取所有非系统集合数据和订阅部分系统集合(system.indexes、system.js、system.namespaces)的权限。 changeStream、collStats、dbHash、dbStats、find、killCursors、listIndexes、listCollections readWrite readWrite角色包含read角色的权限同时增加了对非系统集合数据的修改权限,但只对系统集合system.js有修改权限。 collStats、convertToCapped、createCollection、dbHash、dbStats、dropCollection、createIndex、dropIndex、find、insert、killCursors、listIndexes、listCollections、remove、renameCollectionSameDB、update readAnyDatabase readAnyDatabase角色包含对除了config和local之外所有数据库的只读权限。同时对于整个集群包含listDatabases命令操作。 在MongoDB3.4版本之前,该角色包含对config和local数据库的读取权限。当前版本如果需要对这两个数据库进行读取,则需要在admin数据库授予用户对这两个数据库的read角色。 readWriteAnyDatabase readWriteAnyDatabase角色包含对除了config和local之外所有数据库的读写权限。同时对于整个集群包含listDatabases命令操作。 在MongoDB3.4版本之前,该角色包含对config和local数据库的读写权限。当前版本如果需要对这两个数据库进行读写,则需要在admin数据库授予用户对这两个数据库的readWrite角色。 dbAdmin dbAdmin角色包含执行某些管理任务(与schema相关、索引、收集统计信息)的权限,该角色不包含用户和角色管理的权限。 对于系统集合(system.indexes、system.namespaces、system.profile)包含命令操作:collStats、dbHash、dbStats、find、killCursors、listIndexes、listCollections、dropCollection and createCollection(仅适用system.profile) 对于非系统集合包含命令操作:bypassDocumentValidation、collMod、collStats、compact、convertToCapped、createCollection、createIndex、dbStats、dropCollection、dropDatabase、dropIndex、enableProfiler、reIndex、renameCollectionSameDB、repairDatabase、storageDetails、validate dbAdminAnyDatabase dbAdminAnyDatabase角色包含类似于dbAdmin角色对于所有数据库管理权限,除了config数据库和local数据库。同时对于整个集群包含listDatabases命令操作。 在MongoDB3.4版本之前,该角色包含对config和local数据库的管理权限。当前版本如果需要对这两个数据库进行管理,则需要在admin数据库授予用户对这两个数据库的dbAdmin角色。 clusterAdmin clusterAdmin角色包含MongoDB集群管理最高的操作权限。 clusterManager、clusterMonitor和hostManager三个角色的所有权限,并且还拥有dropDatabase操作命令的权限。 userAdmin userAdmin角色包含对当前数据库创建和修改角色和用户的权限。该角色允许向其它任何用户(包括自身)授予任何权限,所以这个角色也提供间接对超级用户(root)的访问权限,如果限定在admin数据中,也包括集群管理的权限。 changeCustomData、changePassword、createRole、createUser、dropRole、dropUser、grantRole、revokeRole、setAuthenticationRestriction、viewRole、viewUser userAdminAnyDatabase userAdminAnyDatabase角色包含类似于userAdmin角色对于所有数据库的用户管理权限,除了config数据库和local数据库。 对于集群包含命令操作:authSchemaUpgrade、invalidateUserCache、listDatabases 对于系统集合admin.system.users和admin.system.roles包含命令操作:collStats、dbHash、dbStats、find、killCursors、planCacheRead、createIndex、dropIndex 父主题: 角色管理
  • 示例 更新用户信息 products数据库中的用户appClient01,其信息如下: { "_id" : "products.appClient01", "token" : NumberLong("8424642624807814713"), "user" : "appClient01", "db" : "products", "customData" : { "empID" : "12345", "badge" : "9156" }, "roles" : [ { "role" : "readWrite", "db" : "products" }, { "role" : "read", "db" : "inventory" } ], "mechanisms" : [ "SC RAM -SHA-1", "SCRAM-SHA-256" ] } 下面操作会替换用户的自定义数据和角色数据: use products db.updateUser( "appClient01", { customData : { employeeId : "0x3039" }, roles : [ { role : "read", db : "assets" } ] } ) products数据库中的用户appClient01,经过更新后信息如下: { "_id" : "products.appClient01", "token" : NumberLong("8424642624807814713"), "user" : "appClient01", "db" : "products", "customData" : { "employeeId" : "0x3039" }, "roles" : [ { "role" : "read", "db" : "assets" } ], "mechanisms" : [ "SCRAM-SHA-1", "SCRAM-SHA-256" ] } 更新用户以仅使用SCRAM-SHA-256凭证 reporting数据库中的用户reportUser256,其信息如下: { "_id" : "reporting.reportUser256", "token" : NumberLong("2827251846225877395"), "user" : "reportUser256", "db" : "reporting", "roles" : [ ], "mechanisms" : [ "SCRAM-SHA-1", "SCRAM-SHA-256" ] } 以下操作会将当前同时拥有 SCRAM-SHA-256 和 SCRAM-SHA-1 全权证书的用户更新为只拥有 SCRAM-SHA-256 全权证书的用户。 如果密码未与mechanisms一起指定,则只能将mechanisms更新为用户当前SCRAM机制的子集。 如果密码与mechanisms一起指定,则可以指定任何受支持的SCRAM机制。 对于SCRAM-SHA-256,passwordDigestor必须是默认值 "server"。 db.updateUser( "reportUser256", { mechanisms: [ "SCRAM-SHA-256" ] } ) reporting数据库中的用户reportUser256,经过更新后信息如下: { "_id" : "reporting.reportUser256", "token" : NumberLong("2827251846225877395"), "user" : "reportUser256", "db" : "reporting", "roles" : [ ], "mechanisms" : [ "SCRAM-SHA-256" ] }
  • 示例 创建用户时不同数据库赋予不同角色 使用db.createUser()在products数据库中创建accountAdmin01用户。 use products db.createUser( { user: "accountAdmin01", pwd: "Changeme_123", customData: { employeeId: 12345 }, roles: [ { role: "clusterAdmin", db: "admin" }, { role: "readAnyDatabase", db: "admin" }, "readWrite"] }, { w: "majority" , wtimeout: 5000 } ) 以上操作赋予用户accountAdmin01以下角色: 在admin数据库中角色为clusterAdmin和readAnyDatabase。 在products数据库中角色为readWrite。 创建用户时同一数据库赋予多个角色 以下操作创建一个在products数据库中角色为readWrite和dbAdmin的用户,用户名为accountUser。 use products db.createUser( { user: "accountUser", pwd: "Changeme_123", roles: [ "readWrite", "dbAdmin" ] } ) 创建用户时不赋予角色 以下操作在admin数据库中创建一个用户名为reportsUser的用户,但是没有赋予用户角色。 use admin db.createUser( { user: "reportsUser", pwd: "Chagneme_123", roles: [ ] } ) 创建管理员用户并赋予角色 下面的操作将在admin 数据库中创建名为appAdmin的用户,并赋予该用户对config数据库的读写访问权限,使用户可以更改分片群集的某些设置,如分片均衡器设置。 use admin db.createUser( { user: "appAdmin", pwd: "Changeme_123", roles: [ { role: "readWrite", db: "config" }, "clusterAdmin" ] } ) 创建有身份验证限制的用户 以下操作将在管理员数据库中创建一个名为restricted的用户。该用户只能从IP地址192.0.2.0连接到IP地址198.51.100.0时才能进行身份验证。 use admin db.createUser( { user: "restricted", pwd: "Changeme_123", roles: [ { role: "readWrite", db: "reporting" } ], authenticationRestrictions: [ { clientSource: ["192.0.2.0"], serverAddress: ["198.51.100.0"] } ] } ) 仅使用SCRAM-SHA-256证书创建用户 下面的操作将创建一个只有SCRAM-SHA-256凭据的用户。 use reporting db.createUser( { user: "reportUser256", pwd: "Changeme_123", roles: [ { role: "readWrite", db: "reporting" } ], mechanisms: [ "SCRAM-SHA-256" ] } ) 如果设置了authenticationMechanisms参数,mechanisms字段只能包含authenticationMechanisms参数中指定的值。
  • 操作须知 下面所有操作都对权限要求,默认rwuser用户具备所需权限,如果通过用户自定义用户进行管理,则需要关注是否具备操作权限。 使用具备权限的用户(可使用rwuser)连接到数据库实例。 通过createUser创建所需的用户,通过设置合适的角色来控制对应用户的权限。其中需要注意的是"passwordDigestor" 参数必须是 "server",否则命令会执行失败,增加这个约束是为了避免安全隐患。
  • 用户管理 DDS上用户的权限都是基于角色管理,通过给用户赋予不同的角色来进行差异化的权限控制。 为了给文档数据库实例提供管理服务,您在创建数据库实例时,文档数据库服务会自动为实例创建admin、monitor和backup账户。如果试图删掉、重命名、修改这些账户的密码和权限,会导致出错。 对于数据库管理员账户rwuser,以及您所创建的账户,允许修改账户的密码。 创建用户 更新用户 删除用户 父主题: 管理数据库权限
  • 完整示例 #!/usr/bin/python import pymongo import random import os # 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全 # 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV username = os.getenv('EXAMPLE_USERNAME_ENV') password = os.getenv('EXAMPLE_PASSWORD_ENV') mongodbUri = 'mongodb://%s:%s@10.66.187.127:27017/admin' client = pymongo.MongoClient(mongodbUri % (username, password )) db = client.somedb db.user.drop() element_num=10 for id in range(element_num): name = random.choice(['R9','cat','owen','lee','J']) gender = random.choice(['male','female']) db.user.insert_one({'id':id, 'name':name, 'gender':gender}) content = db.user.find() for i in content: print i 更多PyMongo接口请参考官方文档。 父主题: 基于Python开发
  • 连接代码 SSL开启 import ssl import os from pymongo import MongoClient # 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全 # 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV rwuser = os.getenv('EXAMPLE_USERNAME_ENV') password = os.getenv('EXAMPLE_PASSWORD_ENV') conn_urls="mongodb://%s:%s@ip:port/{mydb}?authSource=admin" connection = MongoClient(conn_urls % (rwuser, password),connectTimeoutMS=5000,ssl=True, ssl_cert_reqs=ssl.CERT_REQUIRED,ssl_match_hostname=False,ssl_ca_certs=${path to certificate authority file}) dbs = connection.database_names() print "connect database success! database names is %s" % dbs SSL关闭 import ssl import os from pymongo import MongoClient # 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全 # 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV rwuser = os.getenv('EXAMPLE_USERNAME_ENV') password = os.getenv('EXAMPLE_PASSWORD_ENV') conn_urls="mongodb://%s:%s@ip:port/{mydb}?authSource=admin" connection = MongoClient(conn_urls % (rwuser, password),connectTimeoutMS=5000) dbs = connection.database_names() print "connect database success! database names is %s" % dbs
  • 前提条件 连接数据库的弹性云服务器必须和DDS实例之间网络互通,可以使用curl命令连接DDS实例服务端的IP和端口号,测试网络连通性。 curl ip:port 返回“It looks like you are trying to access MongoDB over HTTP on the native driver port.”,说明网络互通。 在弹性云服务器上安装Python以及第三方安装包pymongo。推荐使用pymongo2.8版本。 如果开启SSL,需要在界面上下载根证书,并上传到弹性云服务器。
  • 连接DDS常见配置项和推荐值 connectTimeoutMS连接超时时间确保驱动程序不会在连接阶段无限期等待。推荐配置: connectTimeoutMS = 10000ms socketTimeoutMS防止TCP通信进入无限等待。推荐配置: 时间为业务最长时间的2-3倍,最低不要小于10s。 socketTimeoutMS = max(10000ms, 3倍最长业务时间) minPoolSize连接池最小连接数。推荐配置: minPoolSize = 10 maxPoolSize连接池最大连接数。推荐配置: maxPoolSize = 50 - 100 maxIdleTimeMS连接在删除和关闭之前可以在池中保持的最大空闲时间。推荐配置: maxIdleTimeMS = 10000ms 不要使用socketTimeoutMS来阻止某个操作在数据库端的运行时长。需要使用maxTimeMS,以便服务器可以取消已经被客户端遗弃的操作。
  • 环境类 客户端需配置JDK1.8。JDK是跨平台的,支持Windows,Linux等多种平台。 下面以Windows为例,介绍JDK配置流程: DOS窗口输入“java -version”,查看JDK版本,确认为JDK1.8版本。如果未安装JDK,请下载安装包并安装。 在windows操作系统桌面中“此电脑”图标上单击右键,选择“属性”。 在弹出的“系统”窗口中,单击左侧导航栏中“高级系统设置”。 在弹出的“系统属性”窗口中,单击右下角的“环境变量”。 在弹出的“环境变量”窗口中的“系统变量”区域框中设置如下变量名和变量值。 变量名 操作 变量值 JAVA_HOME 若存在,则单击“编辑”。 若不存在,则单击“新建”。 JAVA的安装目录。 例如:C:\Program Files\Java\jdk1.8.0_131 Path 编辑 若配置了JAVA_HOME,则在变量值的最前面加上: %JAVA_HOME%\bin; 若未配置JAVA_HOME,则在变量值的最前面加上 JAVA安装的全路径: C:\Program Files\Java\jdk1.8.0_131\bin; CLASSPATH 新建 .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar; 单击“确定”,并依次关闭各窗口。
  • 索引分类 索引分类 说明 默认索引 在创建集合期间,DDS在_id字段上创建唯一索引。该索引可防止客户端插入两个具有相同值的文档。您不能将_id字段上的index删除。 在分片群集中,如果您不使用_id字段作为分片键,应用程序需要确保_id字段中值的唯一性以防止错误。这通常是通过使用标准的自动生成的ObjectId来完成的。 单字段索引 除DDS定义的_id索引外,DDS还支持在文档的单个字段上创建用户定义的升序/降序索引。 对于单字段索引和排序操作,索引键的排序顺序(升序或降序)并不重要,因为DDS可以从任何方向遍历索引。 复合索引 DDS还支持多个字段上的用户定义索引,即复合索引。 复合索引中列出的字段的顺序具有重要意义。例如,如果一个复合索引由{userid: 1, score: -1}组成,索引首先按userid排序,然后在每个userid值内按score排序。 对于复合索引和排序操作,索引键的排序顺序(升序或降序)可以决定索引是否支持排序操作。 多键索引 DDS使用多键索引来索引存储在数组中的内容。如果索引包含数组值的字段,DDS为数组的每个元素创建单独的索引项。这些多键索引允许查询通过匹配数组的一个或多个元素来选择包含数组的文档。DDS自动决定是否创建一个多键索引,如果索引字段包含数组值,您不需要显式地指定多键类型。
  • 创建索引 DDS使用如下命令创建索引: db.collection.createIndex(keys, options) key 值为您要创建的索引字段,1 为指定按升序创建索引,-1代表降序创建索引。 options接收可选参数,常用可选参数列表如下: Parameter Type Description background Boolean 默认值为false。 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引。 unique Boolean 默认值为false。 建立的索引是否唯一。指定为true创建唯一索引。 name string 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。 expireAfterSeconds integer 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。 创建索引。 单字段索引(Single Field Index) db.user.createIndex({"name": 1}) 上述语句针对name创建了单字段索引,其能加速对name字段的各种查询请求,是最常见的索引形式,DDS默认创建的id索引也是这种类型,{"name": 1} 代表升序索引,也可以通过{"name": -1}来指定降序索引,对于单字段索引,升序/降序效果是一样的。 复合索引(Compound Index) 复合索引是单子索引的升级版本,它针对多个字段联合创建索引,先按第一个字段排序,第一个字段相同的文档按第二个字段排序,依次类推。 db.user.createIndex({"name": 1, "age": 1} ) 多键索引 当索引的字段为数组时,创建出的索引称为多键索引。 多键索引会为数组的每个元素建立一条索引。 如果为user集合加入一个habit字段(数组)用于描述兴趣爱好,需要查询有相同兴趣爱好的人就可以利用habit字段的多键索引。 {“name” : “jack”, “age” : 19, habit: [“football, runnning”]} //这是person表的一条用户信息。 db.user.createIndex( {"habit": 1} ) //自动创建多key索引 db.user.find( {"habit": "football"} ) //查询有相同兴趣爱好的人 查看集合索引。 db.user.getIndexes() 删除集合所有索引。 db.user.dropIndexes() 删除集合指定索引。如下方式删除user集合中"name"索引。 db.user.dropIndex({"name": 1})
  • 注意事项 DDS除了支持多种不同类型的索引,还能对索引定制一些特殊的属性。 唯一索引(unique index):保证索引对应的字段不会出现相同的值,比如_id索引就是唯一索引。 TTL索引:可以针对某个时间字段,指定文档的过期时间(经过指定时间后过期 或 在某个时间点过期)。 部分索引(partial index): 只针对符合某个特定条件的文档建立索引。 稀疏索引(sparse index): 只针对存在索引字段的文档建立索引,可看作是部分索引的一种特殊情况。
  • 创建分片集合 在DDS集群架构中,可以创建分片来充分利用数据库性能。创建分片的规范及建议请参见分片设计规范。 使数据库可分片。 sh.enableSharding("info") 创建分片表,并指定分片键。如下为info数据库的fruit集合分片,且分片键是"id"。 sh.shardCollection("info.fruit", {"_id": "hashed"}) DDS分片集群支持两种分片策略: 范围分片,支持基于Shard Key的范围查询。 哈希分片,能够将写入均衡分布到各个Shard。
  • 操作步骤 创建info数据库。 use info 输入“db”当结果显示为如下信息,则表示当前已在这个数据库中。 info 为数据库插入一条数据。 db.user.insert({"name": "joe"}) 对于DDS,隐式创建集合只有在内容插入后才会创建,即创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。 查看数据库。 查看所有数据库,可以使用如下命令。 show dbs 回显信息如下。 admin 0.000GB config 0.000GB info 0.000GB local 0.083GB 删除数据库。可以使用如下命令删除上面创建的info数据库: db.dropDatabase() 回显信息如下表示删除成功。 {"dropped" : "info", "ok" : 1}
  • 连接数据库 文档数据库服务常用的连接方式如下表。 表1 连接方式 连接方式 IP地址 使用场景 说明 内网连接(推荐) 内网IP地址 系统默认提供内网IP地址。 当应用部署在弹性云服务器上,且该弹性云服务器与文档数据库实例处于同一区域、可用区、虚拟私有云子网内,建议单独使用内网IP通过弹性云服务器连接文档数据库实例。 文档数据库服务和弹性云服务器在不同的安全组默认不能访问,需要在文档数据库服务所属安全组添加一条“入”的访问规则。 文档数据库服务默认端口:8635,需要手动修改才能访问其它端口。 安全性高,可实现DDS的较好性能。 通过内网连接集群实例 通过内网连接副本集实例 通过内网连接单节点实例 公网连接 弹性公网IP 当应用部署在弹性云服务器上,且该弹性云服务器与文档数据库实例处于不同区域时,建议单独使用弹性公网IP通过弹性云服务器连接文档数据库实例。 当应用部署在其他云服务的系统上时,建议单独使用弹性公网IP通过弹性云服务器连接文档数据库实例。 降低安全性。 通过公网连接集群实例 通过公网连接副本集实例 通过公网连接单节点实例 应用程序连接 内网IP地址 通过各类应用程序连接数据库。 通过Java连接数据库 通过Python连接数据库 父主题: 数据库使用
  • 约束限制 表1 队列使用约束限制 限制项 说明 资源类型 队列类型: default队列: DLI 服务预置了名为“default”的队列供用户体验,资源的大小按需分配。运行作业时按照用户每个作业的数据扫描量(单位为“GB”)收取计算费用。 SQL类型队列:SQL队列支持提交Spark SQL作业。 通用队列:支持Spark程序、Flink SQL、Flink Jar作业。 不支持队列类型切换,如需使用其他队列类型,请重新购买新的队列。 管理队列 不支持切换队列的计费模式。 队列不支持切换区域。 创建队列时(非弹性资源池模式的队列),仅支持包年包月队列和按需专属队列选择跨AZ双活,且跨AZ的队列价格为单AZ模式下的2倍。 DLI队列不支持访问公网。 队列扩缩容 16CUs队列不支持扩容和缩容。 64CUs队列不支持缩容。 新创建的队列需要运行作业后才可进行扩缩容。
  • from_unixtime函数差异 说明: Spark2.4.x: 以Asia/Shanghai时区的 -2209017600 为例,返回值为1900-01-01 00:00:00。 Spark3.3.x: 以Asia/Shanghai时区的 -2209017943 为例,返回值为 1900-01-01 00:00:00。 升级引擎版本后是否对作业有影响: 有影响,需要检查使用该函数的场景。 示例代码: 在作业中配置: spark.sql.session.timeZone=Asia/Shanghai Spark 2.4.5 执行以下语句读取数据: select from_unixtime(-2209017600); 查询结果: +-----------------------------------------------+ |from_unixtime(-2209017600, yyyy-MM-dd HH:mm:ss)| +-----------------------------------------------+ | 1900-01-01 00:00:00| +-----------------------------------------------+ Spark 3.3.1 执行以下语句读取数据: select from_unixtime(-2209017600); 查询结果 +-----------------------------------------------+ |from_unixtime(-2209017600, yyyy-MM-dd HH:mm:ss)| +-----------------------------------------------+ | 1900-01-01 00:05:43| +-----------------------------------------------+
  • unix_timestamp函数差异 说明: 对于Asia/Shanghai时区,小于1900-01-01 08:05:43的值。 Spark2.4.x: 以Asia/Shanghai时区的 1900-01-01 00:00:00 为例,返回值为 -2209017600。 Spark3.3.x: 以Asia/Shanghai时区的 1900-01-01 00:00:00 为例,返回值为 -2209017943。 升级引擎版本后是否对作业有影响: 有影响,需要检查使用该函数的场景。 示例代码: 在作业中配置: spark.sql.session.timeZone=Asia/Shanghai Spark 2.4.5 执行以下语句读取数据: select unix_timestamp('1900-01-01 00:00:00'); 查询结果: +--------------------------------------------------------+ |unix_timestamp(1900-01-01 00:00:00, yyyy-MM-dd HH:mm:ss)| +--------------------------------------------------------+ | -2209017600| +--------------------------------------------------------+ Spark 3.3.1 执行以下语句读取数据: select unix_timestamp('1900-01-01 00:00:00'); 查询结果 +--------------------------------------------------------+ |unix_timestamp(1900-01-01 00:00:00, yyyy-MM-dd HH:mm:ss)| +--------------------------------------------------------+ | -2209017943| +--------------------------------------------------------+
  • eventlog的压缩格式设置为zstd 说明: Spark3.3.x版本中,spark.eventLog.compression.codec的默认值被设置为zstd,Spark在压缩事件日志时将不再支持使用spark.io.compression.codec的参数值。 Spark2.4.x:使用spark.io.compression.codec的参数值作为eventlog的压缩格式。 Spark3.3.x:spark.eventLog.compression.codec默认设置为zstd。 升级引擎版本后是否对作业有影响: 有影响,eventlog的压缩格式发生变化。
  • PySpark-pandas支持版本变更 说明: Spark2.4.x:在Spark 2.4.x版本中,PySpark并没有要求指定Pandas的版本。 Spark3.3.x:从Spark 3.3.x版本开始,PySpark需要0.23.2或更高版本的pandas才能使用pandas相关功能,如toPandas、 createDataFrame from pandas DataFrame等。 升级引擎版本后是否对作业有影响: 依赖版本变化,有影响,需要排查是否涉及。
  • DATE、TIMESTAMP类型字段读取差异 说明: DATE、TIMESTAMP类型字段读取差异,对于Asia/Shanghai时区,时间在1900-01-01 08:05:43之前的值,Spark 2.4.5版本写入后Spark 3.3.1版本读取值与Spark 2.4.5版本读取值不同。 Spark2.4.x: 以Asia/Shanghai时区的 1900-01-01 00:00:00 为例,通过Spark 2.4.5版本队列写入,Spark 2.4.5版本读取后得到的值为 1900-01-01 00:00:00。 Spark3.3.x: 以Asia/Shanghai时区的 1900-01-01 00:00:00 为例,通过Spark 2.4.5版本队列写入,Spark 3.3.1版本配置spark.sql.parquet.int96RebaseModeInRead=LEGACY,读取后得到的值为 1900-01-01 00:00:00,但是配置spark.sql.parquet.int96RebaseModeInRead=CORRECTED时,读取后得到的值为1900-01-01 00:05:43。 升级引擎版本后是否对作业有影响: 有影响,需要评估DATE、TIMESTAMP类型字段的使用方式。 示例代码: 在作业中配置: spark.sql.session.timeZone=Asia/Shanghai Spark 2.4.5 spark.sql("create table parquet_timestamp_test (id int, col0 string, col1 timestamp) using parquet"); spark.sql("insert into parquet_timestamp_test values (1, '245', '1900-01-01 00:00:00')"); 执行SQL读取数据: spark.sql("select * from parquet_timestamp_test").show(); 查询结果: +---+----+-------------------+ | id|col0| col1| +---+----+-------------------+ | 1| 245|1900-01-01 00:00:00| +---+----+-------------------+ Spark 3.3.1 spark.sql.parquet.int96RebaseModeInRead=LEGACY 执行作业读取数据: spark.sql("select * from parquet_timestamp_test").show(); 查询结果 +---+----+-------------------+ | id|col0| col1| +---+----+-------------------+ | 1| 245|1900-01-01 00:00:00| +---+----+-------------------+ 可以再更换配置: spark.sql.parquet.int96RebaseModeInRead=CORRECTED 并重新执行SQL进行读取: spark.sql("select * from parquet_timestamp_test").show(); 查询结果: +---+----+-------------------+ | id|col0| col1| +---+----+-------------------+ | 1| 245|1900-01-01 00:05:43| +---+----+-------------------+ 配置项说明: 这些配置项提供了Spark如何处理DATE, TIMESTAMP类型字段中特定的时间(在外推格里历和儒略历之间有争议的时间),例如:对于Asia/Shanghai时区,指的是在1900-01-01 08:05:43之前的值的处理方式。 有歧义的时间: 在特定时间之前。例如,对于Asia/Shanghai时区,指的是在1900-01-01 08:05:43之前的值; 且数据文件的元数据中未明确标注使用何种历法进行存储的情况。例如,Spark 3.3.x 版本部分情况写入时会在数据文件中记录使用的历法,此时该时间不属于有歧义的时间。 Datasource parquet表配置项说明 表1 Spark 3.3.1 Datasource parquet表配置项 配置项 默认值 描述 spark.sql.parquet.int96RebaseModeInRead EXCEPTION (Spark作业默认配置) 读取Parquet文件中INT96类型的TIMESTAMP字段时生效。 EXCEPTION: 遇到有歧义的时间会抛出报错,读取操作将失败。 CORRECTED: Spark 不会进行重新调整,而是按照原样读取日期/时间戳。 LEGACY: Spark 会将日期/时间戳从传统的混合模式(儒略历 + 格里历)日历重新调整到外推格里历。 该配置项仅在 Parquet 文件的写入信息(如 Spark、Hive)未知时才生效。 spark.sql.parquet.int96RebaseModeInWrite EXCEPTION (Spark作业默认配置) 写入Parquet文件中INT96类型的TIMESTAMP字段时生效。 EXCEPTION: 遇到有歧义的时间会抛出报错,写入操作将失败 CORRECTED: Spark 不会进行重新调整,而是按照原样写入日期/时间戳 LEGACY: 当写入 Parquet 文件时,Spark 会将日期/时间戳从外推格里历重新调整到传统的混合模式(儒略历 + 格里历)。 spark.sql.parquet.datetimeRebaseModeInRead EXCEPTION (Spark作业默认配置) 读取DATE、TIMESTAMP_MILLIS、TIMESTAMP_MICROS逻辑类型的字段生效。 EXCEPTION: 遇到有歧义的时间会抛出报错,读取操作将失败。 CORRECTED: Spark 不会进行重新调整,而是按照原样读取日期/时间戳。 LEGACY: Spark 会将日期/时间戳从传统的混合模式(儒略历 + 格里历)日历重新调整到外推格里历。 该配置项仅在 Parquet 文件的写入信息(如 Spark、Hive)未知时才生效。 spark.sql.parquet.datetimeRebaseModeInWrite EXCEPTION (Spark作业默认配置) 写入DATE、TIMESTAMP_MILLIS、TIMESTAMP_MICROS逻辑类型的字段生效。 EXCEPTION: 遇到有歧义的时间会抛出报错,写入操作将失败 CORRECTED: Spark 不会进行重新调整,而是按照原样写入日期/时间戳 LEGACY: 当写入 Parquet 文件时,Spark 会将日期/时间戳从外推格里历重新调整到传统的混合模式(儒略历 + 格里历)。 Datasource avro表配置项说明 表2 Spark 3.3.1 Datasource avro表配置项 配置项 默认值 描述 spark.sql.avro.datetimeRebaseModeInRead EXCEPTION (Spark作业默认配置) 读取DATE、TIMESTAMP_MILLIS、TIMESTAMP_MICROS逻辑类型的字段生效。 EXCEPTION: 遇到有歧义的时间会抛出报错,读取操作将失败。 CORRECTED: Spark 不会进行重新调整,而是按照原样读取日期/时间戳。 LEGACY: Spark 会将日期/时间戳从传统的混合模式(儒略历 + 格里历)日历重新调整到外推格里历。 该配置项仅在 Avro 文件的写入信息(如 Spark、Hive)未知时才生效。 spark.sql.avro.datetimeRebaseModeInWrite EXCEPTION (Spark作业默认配置) 写入DATE、TIMESTAMP_MILLIS、TIMESTAMP_MICROS逻辑类型的字段生效。 EXCEPTION: 遇到有歧义的时间会抛出报错,写入操作将失败 CORRECTED: Spark 不会进行重新调整,而是按照原样写入日期/时间戳 LEGACY: 当写入 Avro 文件时,Spark 会将日期/时间戳从外推格里历重新调整到传统的混合模式(儒略历 + 格里历)。
  • Spark将不可为null的模式转换为可空 说明: 在Spark 2.4.x版本中,当用户指定的schema包含不可为空的字段时,Spark会将这些不可为null的模式转换为可空的。 但是在Spark 3.3.x版本中,Spark尊重用户指定的schema中的nullability,即如果字段被定义为不可为空,Spark会保持该配置要求,不会自动转换为可空的字段。 Spark2.4.x:在Spark 2.4.x版本中,当用户指定的schema包含不可为空的字段时,Spark会将这些不可为null的模式转换为可空的。 Spark3.3.x:Spark不会自动转换为可空的字段。 如果希望在Spark 3.3.x版本中恢复到Spark 2.4.x版本的执行方式,您可以通过将 spark.sql.legacy.respectNullabilityInTextDatasetConversion设置为true来实现。 升级引擎版本后是否对作业有影响: 有影响。 示例代码: 执行sql: spark.read.schema(StructType( StructField("f1", LongType, nullable = false) :: StructField("f2", LongType, nullable = false) :: Nil) ).option("mode", "DROPMALFORMED").json(Seq("""{"f1": 1}""").toDS).show(false); Spark 2.4.5 |f1 |f2 | +---+---+ |1 |0 | Spark 3.3.1 |f1 |f2 | +---+----+ |1 |null|
共100000条
提示

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