• [问题求助] obs文件上传
    如何在jsp页面中,直接使用  var ObsClient = require('esdk-obs-nodejs');  目前jsp中只有jquery,做一个测试用。
  • [问题求助] OBS上传照片出现问题
    在安卓设备上使用的OBS存储服务,obsClient 实例以变量形式初始化一次存储在内存上,上传的文件为照片,代码如下:String endPoint = "";String ak = "*";String sk = "";// 创建ObsClient实例ObsClient obsClient = new ObsClient(ak, sk, endPoint);// localfile为待上传的本地文件路径,需要指定到具体的文件名obsClient.putObject("bucketname", "objectname", new File("localfile")); // localfile2 为待上传的本地文件路径,需要指定到具体的文件名PutObjectRequest request = new PutObjectRequest();request.setBucketName("bucketname");request.setObjectKey("objectname2");request.setFile(new File("localfile2"));obsClient.putObject(request);基本都会上传成功,但是小几率出现下图问题,因为没做操作日志记录,想问下这种问题原因一般是哪里出问题了
  • [问题求助] 华为云的对象存储支持鸿蒙程序访问吗?
    看华为云对象存储的SDK,支持安卓和ios访问,请问支持华为鸿蒙的程序访问吗?有操作说明吗?谢谢
  • [技术交流] 让RDS(for MySQL)数据库的慢日志、审计日志跨空间转存OBS变得更加自动化
    【摘要】 本项目将展示如何使用华为云产品RDS(for MySQL)、OBS提供的SDK方法将数据库产生的慢日志、审计日志通过网络流的方式直接将日志文件转存至OBS中进行备份存储,项目过程中能够让您熟悉OBS和RDS的SDK,详细内容可阅读文章进行了解。《目录》 背景 开发环境 云服务介绍 方案设计 方案简述 方案架构图 时序图 代码参数指南 代码实现 结果反馈1、背景在业务系统的运行过程中,数据库会产生一些日志,其中包括慢日志、审计日志,有时我们需要对这些日志手动的进行下载存储,有些繁琐。为了解决手动存储的弊端,希望可以通过调用接口的方式来实现定时的自动转存储至OBS效果。2、开发环境![Snipaste_2022-06-22_11-44-55.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/22/1655869524841820242.png)3、云服务介绍云数据库 RDS for MySQL:MySQL是目前最受欢迎的开源数据库之一,其性能卓越,搭配LAMP(Linux + Apache + MySQL + Perl/PHP/Python),成为WEB开发的高效解决方案。 云数据库 RDS for MySQL拥有稳定可靠、安全运行、弹性伸缩、轻松管理、经济实用等特点。华为云OBS:对象存储服务(Object Storage Service,OBS)是一个基于对象的海量存储服务,为客户提供海量、安全、高可靠、低成本的数据存储能力,使用时无需考虑容量限制,并且提供多种存储类型,满足客户各类业务场景诉求。4、方案设计i、方案简述通过调用SDK提供的接口,先获取慢日志或审计日志的下载路径,然后通过网络流上传的方式直接将链接日志下载存储至OBS指定的位置。ii、方案架构图两种日志均是转存至OBS,但是因为其获取途径不一样,在某些细节实现有一些区分,如慢日志转存OBS,因没有提供时间筛选,无法控制其增量行为,所以需要通过比对前后文件来判断是否需要上传;而审计日志则是可以通过时间筛选的方法来控制,具体实现如下:慢日志转存OBS架构图![慢日志转存OBS架构图(白底板).png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/22/1655865621378972063.png)慢日志转存OBS实现思路:1、通过SDK提供的接口获取日志下载链接。2、然后new URL(fileLink).openConnection().getContentLength()获取链接文件。3、再通过OBS SDK提供的接口方法获取OBS位置已存储的文件。4、如果两者文件一样,则拉取下来的网络流通过OBS客户端上传至OBS指定位置进行存储审计日志转存OBS架构图![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/22/1655865473425779338.png)审计日志转存OBS实现思路:1、通过SDK提供的接口方法传入时间等参数获取某一个时间段的审计日志的ID。2、然后通过日志ID找到我们每一个日志文件的下载链接。3、最后通过网络流将日志文件拉取下来,通过OBS客户端上传至OBS指定位置进行存储。iii、方案时序图慢日志转存OBS时序图![慢日志转存OBS时序图(白底版).png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/22/1655865644641527095.png)审计日志转存OBS时序图![审计日志转存OBS时序图(白底版).png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/22/1655865655731506215.png)5、代码参数指南##### 公共参数获取方式1. endPoint,ak,sk,areaCode,instanceID,obsName。 1. endPoint获取方式参考:https://developer.huaweicloud.com/endpoint获取对应的endPoint值 。注意:endpoint值由很多,要找到OBS下面的endpoint。 2. ak与sk获取方式可参考:https://support.huaweicloud.com/iam_faq/iam_01_0618.html 。 3. areaCode区域码获取方式,可在这查询:https://developer.huaweicloud.com/endpoint 。 4. instanceID实例ID需要在华为云的RDS实例管理界面中获取实例ID如图所示: ![实例id.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/21/1655778411438620812.png) 5. obsName为OBS桶名。##### RDSSlowlogUploadOBS参数详情1. endPoint,ak,sk,areaCode,instanceID,obsName获取方式请参考公共参数。##### RDSAuditlogUploadOBS参数详情1. endPoint,ak,sk,areaCode,instanceID,obsName,startTime,endTime。 1. endPoint,ak,sk,areaCode,instanceID,obsName获取方式请参考公共参数。 2. startTime:起始时间(格式:2018-08-06T10:41:14+0800) 3. endTime:终点时间(格式:2018-08-06T10:41:14+0800) 4. offset:起始查询位置(0表示从第一个开始查询) 5. limit:查询数量(一次最多能查50个) 6、代码实现实现代码可参考慢日志、审计日志转存OBS7、结果反馈慢日志转存OBS![慢日志.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/21/1655778861996113650.png)审计日志转存OBS![审计日志.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/21/1655778872989527175.png)
  • [问题求助] 【OBS SDK C产品】【option功能】OBS 服务器地址为IP地址,该如何配置
    【功能模块】OBS 对象存储--OBS-SDK-C【操作步骤&问题现象】1、第三方提供的OBS的host_name为210.76.75.21:5443,将demo中的host_name改为该IP后,访问失败     但用obs-browser-plus访问是正常的提示为NameLookupError【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 【对象存储】【OBS BrowserJS SDK】如何使用OBS BrowserJs SDK调用第三方存储服务S3接口
    【对象存储】【OBS BrowserJS SDK】如何使用OBS BrowserJs SDK调用第三方存储服务S3接口
  • [问题求助] OBS如何通过接口统计总量和总使用量
  • [问题求助] 对象存储上传碰到问题
    总是上传的时候比如4个只有2个或1个成功,报错就是这样HTTP Code: -1 Error Code:null Request ID:null ,请专家解惑FileItemIterator iter = upload.getItemIterator(request);                while (iter.hasNext())                {                    FileItemStream item = iter.next();                    stream = item.openStream();                    if(!item.isFormField())                    {                        String filename = item.getName();                        int index = indexOfLastSeparator(filename);                        filename=filename.substring(index + 1);                        Date now = new Date();                         SimpleDateFormat dateFormat = new SimpleDateFormat("HHmmss");                        SimpleDateFormat dateFormat2 = new SimpleDateFormat("YYYYMM");                        String hehe2 = dateFormat2.format( now )+"/";                        String hehe = dateFormat.format( now );                        filename = new String(filename.getBytes("UTF-8"), "UTF-8");                        if(resultSeq==null)                        {                            objectname =staffCode+"-"+hehe+"-"+filename;                        }else                            objectname = resultSeq+"-"+hehe+"-"+filename;                                                try {                            PutObjectResult rs=obsClient.putObject("xxx2022", hehe2+objectname, stream);                            System.out.println("obsClient.statusCode="+rs.getStatusCode());                            System.out.println("obsClient.RequestId="+rs.getRequestId());                        }catch (ObsException e)                        {                            // 推荐:发生异常后,记录失败的HTTP状态码、服务端错误码、服务端请求ID等                            System.out.println("HTTP Code: " + e.getResponseCode());                            System.out.println("Error Code:" + e.getErrorCode());                            System.out.println("Request ID:" + e.getErrorRequestId());                        }             }
  • [技术知识] test
    SAN存储提供给应用的是一个LUN或者是一个卷,LUN和卷是面向磁盘空间的一种组织方式,上层应用要通过FC或者ISCSI协议访问SAN。SAN存储处理的是管理磁盘的问题,其他事情都要依靠上层的应用程序实现。NAS存储提供给应用的是一个文件系统或者是一个文件夹,上层应用通过NFS和CIFS协议进行访问。文件系统要维护一个目录树。对象存储更加适合web类应用,基于URL访问地址提供一个海量的桶存储空间,能够存储各种类型的文件对象,对象存储是一个扁平架构,无需维护复杂的文件目录。无需考虑存储空间的限制,一个桶支持近乎无限大的存储空间。
  • [最佳实践] 使用Spark Jar作业读取和查询OBS数据
    操作场景DLI完全兼容开源的Apache Spark,支持用户开发应用程序代码来进行作业数据的导入、查询以及分析处理。本示例从编写Spark程序代码读取和查询OBS数据、编译打包到提交Spark Jar作业等完整的操作步骤说明来帮助您在DLI上进行作业开发。环境准备在进行Spark Jar作业开发前,请准备以下开发环境。表1 Spark Jar作业开发环境准备项说明操作系统Windows系统,支持Windows7以上版本。安装JDKJDK使用1.8版本。安装和配置IntelliJ IDEAIntelliJ IDEA为进行应用开发的工具,版本要求使用2019.1或其他兼容版本。安装Maven开发环境的基本配置。用于项目管理,贯穿软件开发生命周期。开发流程DLI进行Spark Jar作业开发流程参考如下:图1 Spark Jar作业开发流程表2 开发流程说明序号阶段操作界面说明1创建DLI通用队列DLI控制台创建作业运行的DLI队列。2上传数据到OBS桶OBS控制台将测试数据上传到OBS桶下。3新建Maven工程,配置pom文件IntelliJ IDEA参考样例代码说明,编写程序代码读取OBS数据。4编写程序代码5调试,编译代码并导出Jar包6上传Jar包到OBS和DLIOBS控制台将生成的Spark Jar包文件上传到OBS目录下和DLI程序包中。7创建Spark Jar作业DLI控制台在DLI控制台创建Spark Jar作业并提交运行作业。8查看作业运行结果DLI控制台查看作业运行状态和作业运行日志。步骤1:创建DLI通用队列第一次提交Spark作业,需要先创建队列,例如创建名为“sparktest”的队列,队列类型选择为“通用队列”。在DLI管理控制台的左侧导航栏中,选择“队列管理”。单击“队列管理”页面右上角“购买队列”进行创建队列。创建名为“sparktest”的队列,队列类型选择为“通用队列”。创建队列详细介绍请参考创建队列。单击“立即购买”,确认配置。配置确认无误,单击“提交”完成队列创建。步骤2:上传数据到OBS桶根据如下数据,创建people.json文件。{"name":"Michael"}{"name":"Andy", "age":30}{"name":"Justin", "age":19}进入OBS管理控制台,在“桶列表”下,单击已创建的OBS桶名称,本示例桶名为“dli-test-obs01”,进入“概览”页面。单击左侧列表中的“对象”,选择“上传对象”,将people.json文件上传到OBS桶根目录下。在OBS桶根目录下,单击“新建文件夹”,创建名为“result”的文件夹。单击“result”的文件夹,在“result”下单击“新建文件夹”,创建名为“parquet”的文件夹。步骤3:新建Maven工程,配置pom依赖以下通过IntelliJ IDEA 2020.2工具操作演示。打开IntelliJ IDEA,选择“File > New > Project”。图2 新建Project选择Maven,Project SDK选择1.8,单击“Next”。定义样例工程名和配置样例工程存储路径,单击“Finish”完成工程创建。如上图所示,本示例创建Maven工程名为:SparkJarObs,Maven工程路径为:“D:\DLITest\SparkJarObs”。在pom.xml文件中添加如下配置。<dependencies> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.11</artifactId> <version>2.3.2</version> </dependency></dependencies>图3 修改pom.xml文件在工程路径的“src > main > java”文件夹上鼠标右键,选择“New > Package”,新建Package和类文件。Package根据需要定义,本示例定义为:“com.huawei.dli.demo”,完成后回车。在包路径下新建Java Class文件,本示例定义为:SparkDemoObs。步骤4:编写代码编写SparkDemoObs程序读取OBS桶下的1的“people.json”文件,并创建和查询临时表“people”。完整的样例请参考完整样例代码参考,样例代码分段说明如下:导入依赖的包。import org.apache.spark.sql.Dataset;import org.apache.spark.sql.Row;import org.apache.spark.sql.SaveMode;import org.apache.spark.sql.SparkSession;import static org.apache.spark.sql.functions.col;通过当前帐号的AK和SK创建SparkSession会话spark 。SparkSession spark = SparkSession .builder() .config("spark.hadoop.fs.obs.access.key", "xxx") .config("spark.hadoop.fs.obs.secret.key", "yyy") .appName("java_spark_demo") .getOrCreate();"spark.hadoop.fs.obs.access.key"参数对应的值"xxx"需要替换为帐号的AK值。"spark.hadoop.fs.obs.secret.key"参数对应的值“yyy”需要替换为帐号的SK值。AK和SK值获取请参考:如何获取AK和SK。读取OBS桶中的“people.json”文件数据。其中“dli-test-obs01”为演示的OBS桶名,请根据实际的OBS桶名替换。Dataset<Row> df = spark.read().json("obs://dli-test-obs01/people.json");df.printSchema();通过创建临时表“people”读取文件数据。df.createOrReplaceTempView("people");查询表“people”数据。Dataset<Row> sqlDF = spark.sql("SELECT * FROM people");sqlDF.show();将表“people”数据以parquet格式输出到OBS桶的“result/parquet”目录下。sqlDF.write().mode(SaveMode.Overwrite).parquet("obs://dli-test-obs01/result/parquet");spark.read().parquet("obs://dli-test-obs01/result/parquet").show();关闭SparkSession会话spark。spark.stop();步骤5:调试、编译代码并导出Jar包单击IntelliJ IDEA工具右侧的“Maven”,参考下图分别单击“clean”、“compile”对代码进行编译。编译成功后,单击“package”对代码进行打包。打包成功后,生成的Jar包会放到target目录下,以备后用。本示例将会生成到:“D:\DLITest\SparkJarObs\target”下名为“SparkJarObs-1.0-SNAPSHOT.jar”。步骤6:上传Jar包到OBS和DLI下登录OBS控制台,将生成的“SparkJarObs-1.0-SNAPSHOT.jar”Jar包文件上传到OBS路径下。将Jar包文件上传到DLI的程序包管理中,方便后续统一管理。登录DLI管理控制台,单击“数据管理 > 程序包管理”。在“程序包管理”页面,单击右上角的“创建”创建程序包。在“创建程序包”对话框,配置以下参数。包类型:选择“JAR”。OBS路径:程序包所在的OBS路径。分组设置和组名称根据情况选择设置,方便后续识别和管理程序包。单击“确定”,完成创建程序包。步骤7:创建Spark Jar作业登录DLI控制台,单击“作业管理 > Spark作业”。在“Spark作业”管理界面,单击“创建作业”。在作业创建界面,配置对应作业运行参数。具体说明如下:所属队列:选择已创建的DLI通用队列。例如当前选择步骤1:创建DLI通用队列创建的通用队列“sparktest”。作业名称(--name):自定义Spark Jar作业运行的名称。当前定义为:SparkTestObs。应用程序:选择步骤6:上传Jar包到OBS和DLI下中上传到DLI程序包。例如当前选择为:“SparkJarObs-1.0-SNAPSHOT.jar”。主类:格式为:程序包名+类名。例如当前为:com.huawei.dli.demo.SparkDemoObs。其他参数可暂不选择,想了解更多Spark Jar作业提交说明可以参考创建Spark作业。图4 创建Spark Jar作业单击“执行”,提交该Spark Jar作业。在Spark作业管理界面显示已提交的作业运行状态。步骤8:查看作业运行结果在Spark作业管理界面显示已提交的作业运行状态。初始状态显示为“启动中”。如果作业运行成功则作业状态显示为“已成功”,单击“操作”列“更多”下的“Driver日志”,显示当前作业运行的日志。图5 “Driver日志”中的作业执行日志如果作业运行成功,本示例进入OBS桶下的“result/parquet”目录,查看已生成预期的parquet文件。如果作业运行失败,单击“操作”列“更多”下的“Driver日志”,显示具体的报错日志信息,根据报错信息定位问题原因。例如,如下截图信息因为创建Spark Jar作业时主类名没有包含包路径,报找不到类名“SparkDemoObs”。可以在“操作”列,单击“编辑”,修改“主类”参数为正确的:com.huawei.dli.demo.SparkDemoObs,单击“执行”重新运行该作业即可。后续指引如果您想通过Spark Jar作业访问其他数据源,请参考《使用Spark作业跨源访问数据源》。如果您想通过Spark Jar作业在DLI创建数据库和表,请参考《使用Spark作业访问DLI元数据》。完整样例代码参考package com.huawei.dli.demo;import org.apache.spark.sql.Dataset;import org.apache.spark.sql.Row;import org.apache.spark.sql.SaveMode;import org.apache.spark.sql.SparkSession;import static org.apache.spark.sql.functions.col;public class SparkDemoObs { public static void main(String[] args) { SparkSession spark = SparkSession .builder() .config("spark.hadoop.fs.obs.access.key", "xxx") .config("spark.hadoop.fs.obs.secret.key", "yyy") .appName("java_spark_demo") .getOrCreate(); // can also be used --conf to set the ak sk when submit the app // test json data: // {"name":"Michael"} // {"name":"Andy", "age":30} // {"name":"Justin", "age":19} Dataset<Row> df = spark.read().json("obs://dli-test-obs01/people.json"); df.printSchema(); // root // |-- age: long (nullable = true) // |-- name: string (nullable = true) // Displays the content of the DataFrame to stdout df.show(); // +----+-------+ // | age| name| // +----+-------+ // |null|Michael| // | 30| Andy| // | 19| Justin| // +----+-------+ // Select only the "name" column df.select("name").show(); // +-------+ // | name| // +-------+ // |Michael| // | Andy| // | Justin| // +-------+ // Select people older than 21 df.filter(col("age").gt(21)).show(); // +---+----+ // |age|name| // +---+----+ // | 30|Andy| // +---+----+ // Count people by age df.groupBy("age").count().show(); // +----+-----+ // | age|count| // +----+-----+ // | 19| 1| // |null| 1| // | 30| 1| // +----+-----+ // Register the DataFrame as a SQL temporary view df.createOrReplaceTempView("people"); Dataset<Row> sqlDF = spark.sql("SELECT * FROM people"); sqlDF.show(); // +----+-------+ // | age| name| // +----+-------+ // |null|Michael| // | 30| Andy| // | 19| Justin| // +----+-------+ sqlDF.write().mode(SaveMode.Overwrite).parquet("obs://dli-test-obs01/result/parquet"); spark.read().parquet("obs://dli-test-obs01/result/parquet").show(); spark.stop(); }}
  • [最佳实践] 使用DLI分析OBS数据
    DLI支持将数据存储到OBS上,后续再通过创建OBS表即可对OBS上的数据进行分析和处理。本指导中的操作内容包括:创建OBS表、导入OBS表数据、插入和查询OBS表数据等内容来帮助您更好的在DLI上对OBS表数据进行处理。前提条件已创建OBS的桶。具体OBS操作可以参考《对象存储服务控制台指南》。本指导中的OBS桶名都为“dli-test-021”。已创建DLI的SQL队列。创建队列详细介绍请参考创建队列。注意:创建队列时,队列类型必须要选择为:SQL队列。前期准备创建DLI数据库登录DLI管理控制台,选择“SQL编辑器”,在SQL编辑器中“执行引擎”选择“spark”,“队列”选择已创建的SQL队列。在SQL编辑器中输入以下语句创建数据库“testdb”。详细的DLI创建数据库的语法可以参考创建DLI数据库。create database testdb;后续章节操作都需要在testdb数据库下进行操作。DataSource和Hive两种语法创建OBS表的区别两种语法创建OBS表主要差异点参见表1。表1 DataSource语法和Hive语法创建OBS表的差异点语法支持的数据类型范围创建分区表时分区字段差异支持的分区数DataSource语法支持orc,parquet,json,csv,carbon,avro类型创建分区表时,分区字段在表名和PARTITIONED BY后都需要指定。具体可以参考DataSource语法创建单分区OBS表。单表分区数最多允许7000个。Hive语法支持TEXTFILE, AVRO, ORC, SEQUENCEFILE, RCFILE, PARQUET, CARBON创建分区表时,指定的分区字段不能出现在表后,只能通过PARTITIONED BY指定分区字段名和类型。具体可以参考Hive语法创建OBS分区表。单表分区数最多允许100000个。创建OBS表的DataSource语法可以参考使用DataSource语法创建OBS表。创建OBS表的Hive语法可以参考使用Hive语法创建OBS表。使用DataSource语法创建OBS表以下通过创建CSV格式的OBS表举例,创建其他数据格式的OBS表方法类似,此处不一一列举。创建OBS非分区表指定OBS数据文件,创建csv格式的OBS表。按照以下文件内容创建“test.csv”文件,并将“test.csv”文件上传到OBS桶“dli-test-021”的根目录下。Jordon,88,23Kim,87,25Henry,76,26登录DLI管理控制台,选择“SQL编辑器”,在SQL编辑器中“执行引擎”选择“spark”,“队列”选择已创建的SQL队列,数据库选择“testdb”,执行以下命令创建OBS表。CREATE TABLE testcsvdatasource (name string, id int) USING csv OPTIONS (path "obs://dli-test-021/test.csv");注意:如果是通过指定的数据文件创建的OBS表,后续不支持在DLI通过insert表操作插入数据。OBS文件内容和表数据保持同步。查询已创建的“testcsvdatasource”表数据。select * from testcsvdatasource;查询结果显示如下本地修改原始的OBS表文件“test.csv”,增加一行“Aarn,98,20”数据,重新替换OBS桶目录下的“test.csv”文件。Jordon,88,23Kim,87,25Henry,76,26Aarn,98,20在DLI的SQL编辑器中再次查询“testcsvdatasource”表数据,DLI上可以查询到新增的“Aarn,98,20”数据。select * from testcsvdatasource;指定OBS数据文件目录,创建csv格式的OBS表。指定的OBS数据目录不包含数据文件。在OBS桶“dli-test-021”根目录下创建数据文件目录“data”。登录DLI管理控制台,选择“SQL编辑器”,在SQL编辑器中“执行引擎”选择“spark”,“队列”选择已创建的SQL队列,数据库选择“testdb”。在DLI的“testdb”数据库下创建OBS表“testcsvdata2source”。CREATE TABLE testcsvdata2source (name STRING, score DOUBLE, classNo INT) USING csv OPTIONS (path "obs://dli-test-021/data");通过insert语句插入表数据。insert into testcsvdata2source VALUES('Aarn','98','20');insert作业运行成功后,查询OBS表“testcsvdata2source”数据。select * from testcsvdata2source;在OBS桶的“obs://dli-test-021/data”目录下刷新后查询,生成了csv数据文件,文件内容为insert插入的数据内容。指定的OBS数据目录包含数据文件。在OBS桶“dli-test-021”根目录下创建数据文件目录“data2”。创建如下内容的测试数据文件“test.csv”,并上传文件到“obs://dli-test-021/data2”目录下。Jordon,88,23Kim,87,25Henry,76,26登录DLI管理控制台,选择“SQL编辑器”,在SQL编辑器中“执行引擎”选择“spark”,“队列”选择已创建的SQL队列,数据库选择“testdb”。在DLI的“testdb”数据库下创建OBS表“testcsvdata3source”。CREATE TABLE testcsvdata3source (name STRING, score DOUBLE, classNo INT) USING csv OPTIONS (path "obs://dli-test-021/data2");通过insert语句插入表数据。insert into testcsvdata3source VALUES('Aarn','98','20');insert作业运行成功后,查询OBS表“testcsvdata3source”数据。select * from testcsvdata3source;在OBS桶的“obs://dli-test-021/data2”目录下刷新后查询,生成了一个csv数据文件,内容为insert插入的表数据内容。创建OBS分区表创建单分区OBS表在OBS桶“dli-test-021”根目录下创建数据文件目录“data3”。登录DLI管理控制台,选择“SQL编辑器”,在SQL编辑器中“执行引擎”选择“spark”,“队列”选择已创建的SQL队列,数据库选择“testdb”。在DLI的“testdb”数据库下创建以“classNo”列为分区的OBS分区表“testcsvdata4source”,指定OBS目录“obs://dli-test-021/data3”。CREATE TABLE testcsvdata4source (name STRING, score DOUBLE, classNo INT) USING csv OPTIONS (path "obs://dli-test-021/data3") PARTITIONED BY (classNo);在OBS桶的“obs://dli-test-021/data3”目录下创建“classNo=25”的分区目录。根据以下文件内容创建数据文件“test.csv”,并上传到OBS的“obs://dli-test-021/data3/classNo=25”目录下。Jordon,88,25Kim,87,25Henry,76,25在SQL编辑器中执行以下命令,导入分区数据到OBS表“testcsvdata4source ”。ALTER TABLE testcsvdata4sourceADD PARTITION (classNo = 25) LOCATION 'obs://dli-test-021/data3/classNo=25';查询OBS表“testcsvdata4source ”classNo分区为“25”的数据:select * from testcsvdata4source where classNo = 25;插入如下数据到OBS表“testcsvdata4source ”:insert into testcsvdata4source VALUES('Aarn','98','25');insert into testcsvdata4source VALUES('Adam','68','24');查询OBS表“testcsvdata4source ”classNo分区为“25”和“24”的数据。注意:分区表在进行查询时where条件中必须携带分区字段,否则会查询失败,报:DLI.0005: There should be at least one partition pruning predicate on partitioned table。select * from testcsvdata4source where classNo = 25;select * from testcsvdata4source where classNo = 24;在OBS桶的“obs://dli-test-021/data3”目录下点击刷新,该目录下生成了对应的分区文件,分别存放新插入的表数据。图1 OBS上classNo分区为“25”文件数据图2 OBS上classNo分区为“24”文件数据创建多分区OBS表在OBS桶“dli-test-021”根目录下创建数据文件目录“data4”。登录DLI管理控制台,选择“SQL编辑器”,在SQL编辑器中“执行引擎”选择“spark”,“队列”选择已创建的SQL队列,数据库选择“testdb”。在“testdb”数据库下创建以“classNo”和“dt”列为分区的OBS分区表“testcsvdata5source”,指定OBS目录“obs://dli-test-021/data4”。CREATE TABLE testcsvdata5source (name STRING, score DOUBLE, classNo INT, dt varchar(16)) USING csv OPTIONS (path "obs://dli-test-021/data4") PARTITIONED BY (classNo,dt);给 testcsvdata5source表插入如下测试数据:insert into testcsvdata5source VALUES('Aarn','98','25','2021-07-27');insert into testcsvdata5source VALUES('Adam','68','25','2021-07-28');根据classNo分区列查询testcsvdata5source数据。select * from testcsvdata5source where classNo = 25;根据dt分区列查询testcsvdata5source数据。select * from testcsvdata5source where dt like '2021-07%';在OBS桶“obs://dli-test-021/data4”目录下刷新后查询,会生成如下数据文件:文件目录1:obs://dli-test-021/data4/xxxxxx/classNo=25/dt=2021-07-27文件目录2:obs://dli-test-021/data4/xxxxxx/classNo=25/dt=2021-07-28在OBS桶的“obs://dli-test-021/data4”目录下创建“classNo=24”的分区目录,再在“classNo=24”目录下创建子分区目录“dt=2021-07-29”。根据以下文件内容创建数据文件“test.csv”,并上传到OBS的“obs://dli-test-021/data4/classNo=24/dt=2021-07-29”目录下。Jordon,88,24,2021-07-29Kim,87,24,2021-07-29Henry,76,24,2021-07-29在SQL编辑器中执行以下命令,导入分区数据到OBS表“testcsvdata5source ”。ALTER TABLE testcsvdata5sourceADD PARTITION (classNo = 24,dt='2021-07-29') LOCATION 'obs://dli-test-021/data4/classNo=24/dt=2021-07-29';根据classNo分区列查询testcsvdata5source数据。select * from testcsvdata5source where classNo = 24;根据dt分区列查询所有“2021-07”月的所有数据。select * from testcsvdata5source where dt like '2021-07%';使用Hive语法创建OBS表以下通过创建TEXTFILE格式的OBS表举例,创建其他数据格式的OBS表方法类似,此处不一一列举。创建OBS非分区表在OBS桶的“dli-test-021”根目录下创建数据文件目录“data5”。根据以下文件内容创建数据文件“test.txt”并上传到OBS的“obs://dli-test-021/data5”目录下。Jordon,88,23Kim,87,25Henry,76,26登录DLI管理控制台,选择“SQL编辑器”,在SQL编辑器中“执行引擎”选择“spark”,“队列”选择已创建的SQL队列,数据库选择“testdb”。使用Hive语法创建OBS表,指定OBS文件路径为“obs://dli-test-021/data5/test.txt”,行数据分割符为','。CREATE TABLE hiveobstable (name STRING, score DOUBLE, classNo INT) STORED AS TEXTFILE LOCATION 'obs://dli-test-021/data5' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';说明:ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' :表示每行记录通过',' 进行分隔。查询hiveobstable表数据。select * from hiveobstable;插入表数据:insert into hiveobstable VALUES('Aarn','98','25');insert into hiveobstable VALUES('Adam','68','25');查询表数据:select * from hiveobstable;在OBS桶“obs://dli-test-021/data5”目录下刷新后查询,生成了两个数据文件,分别对应新插入的数据。创建表字段为复杂数据格式的OBS表在OBS桶的“dli-test-021”根目录下创建数据文件目录“data6”。根据以下文件内容创建数据文件“test.txt”并上传到OBS的“obs://dli-test-021/data6”目录下。Jordon,88-22,23:21Kim,87-22,25:22Henry,76-22,26:23登录DLI管理控制台,选择“SQL编辑器”,在SQL编辑器中“执行引擎”选择“spark”,“队列”选择已创建的SQL队列,数据库选择“testdb”。使用Hive语法创建OBS表,指定OBS文件路径为“obs://dli-test-021/data6”。CREATE TABLE hiveobstable2 (name STRING, hobbies ARRAY<string>, address map<string,string>) STORED AS TEXTFILE LOCATION 'obs://dli-test-021/data6' ROW FORMAT DELIMITED FIELDS TERMINATED BY ','COLLECTION ITEMS TERMINATED BY '-'MAP KEYS TERMINATED BY ':';说明:ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' :表示每条记录通过',' 进行分隔。COLLECTION ITEMS TERMINATED BY '-':表示第二个字段hobbies是array形式,元素与元素之间通过'-'分隔。MAP KEYS TERMINATED BY ':':表示第三个字段address是k-v形式,每组k-v内部由':'分隔。查询hiveobstable2表数据。select * from hiveobstable2;创建OBS分区表在OBS桶的“dli-test-021”根目录下创建数据文件目录“data7”。登录DLI管理控制台,选择“SQL编辑器”,在SQL编辑器中“执行引擎”选择“spark”,“队列”选择已创建的SQL队列,数据库选择“testdb”。创建以classNo为分区列的OBS分区表,指定OBS路径“obs://dli-test-021/data7”。CREATE TABLE IF NOT EXISTS hiveobstable3(name STRING, score DOUBLE) PARTITIONED BY (classNo INT) STORED AS TEXTFILE LOCATION 'obs://dli-test-021/data7' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';注意:创建Hive语法的OBS分区表时,分区字段只能通过PARTITIONED BY指定,该分区字段不能出现在表名后的字段列表中。如下就是错误的示例:CREATE TABLE IF NOT EXISTS hiveobstable3(name STRING, score DOUBLE, classNo INT) PARTITIONED BY (classNo) STORED AS TEXTFILE LOCATION 'obs://dli-test-021/data7';插入表数据:insert into hiveobstable3 VALUES('Aarn','98','25');insert into hiveobstable3 VALUES('Adam','68','25');查询表数据:select * from hiveobstable3 where classNo = 25;在OBS桶的“obs://dli-test-021/data7”目录下刷新后查询,新生成了分区目录“classno=25”,该分区目录下文件内容为新插入的表数据。在OBS桶的“obs://dli-test-021/data7”目录下,创建分区目录“classno=24”。根据以下文件内容创建文件“test.txt”,并上传该文件到“obs://dli-test-021/data7/classno=24”目录下。Jordon,88,24Kim,87,24Henry,76,24在SQL编辑器中执行以下命令,手工导入分区数据到OBS表“hiveobstable3”。ALTER TABLE hiveobstable3ADD PARTITION (classNo = 24) LOCATION 'obs://dli-test-021/data7/classNo=24';查询表“hiveobstable3”数据。select * from hiveobstable3 where classNo = 24;常见问题问题一:查询OBS分区表报错,报错信息如下:DLI.0005: There should be at least one partition pruning predicate on partitioned table `xxxx`.`xxxx`.;问题根因:查询OBS分区表时没有携带分区字段。解决方案:查询OBS分区表时,where条件中至少包含一个分区字段。问题二:使用DataSource语法指定OBS文件路径创建OBS表,insert数据到OBS表,显示作业运行失败,报:“DLI.0007: The output path is a file, don't support INSERT...SELECT” 错误。问题示例语句参考如下:CREATE TABLE testcsvdatasource (name string, id int) USING csv OPTIONS (path "obs://dli-test-021/data/test.csv");问题根因:创建OBS表指定的OBS路径为具体文件,导致不能插入数据。例如上述示例中的OBS路径为:"obs://dli-test-021/data/test.csv"。解决方案:使用DataSource语法创建OBS表指定的OBS文件路径改为文件目录即可,后续即可通过insert插入数据。上述示例,建表语句可以修改为:CREATE TABLE testcsvdatasource (name string, id int) USING csv OPTIONS (path "obs://dli-test-021/data");问题三:使用Hive语法创建OBS分区表时,提示语法格式不对。例如,如下使用Hive语法创建以classNo为分区的OBS表:CREATE TABLE IF NOT EXISTS testtable(name STRING, score DOUBLE, classNo INT) PARTITIONED BY (classNo) STORED AS TEXTFILE LOCATION 'obs://dli-test-021/data7';问题根因:使用Hive语法创建OBS分区表时,分区字段不能出现在表名后的字段列表中,只能定义在PARTITIONED BY后。解决方案:使用Hive语法创建OBS分区表时,分区字段指定在PARTITIONED BY后。例如:CREATE TABLE IF NOT EXISTS testtable(name STRING, score DOUBLE) PARTITIONED BY (classNo INT) STORED AS TEXTFILE LOCATION 'obs://dli-test-021/data7';
  • [其他] 分享创建ipynb文件遇到的错误
    问题现象在Notebook Jupyter页面中,新建一个ipynb文件时,出现“Error loading notebook”错误提示,如何处理?原因分析出现这个错误,其根本原因是您用于创建Notebook的OBS桶的属性。如果您使用的OBS桶,其“存储类别”为“归档存储”,且“归档数据直读”功能关闭,此时ModelArts Notebook会出现无法新建一个ipynb的错误。解决方案进入OBS管理控制台,选择此Notebook实例对应的桶,然后单击桶名称进入桶详情页面,在“基础配置”区域,找到“归档数据直读”功能设置,单击此功能,在弹出框中启用“归档数据直读”功能。设置完成后,Notebook实例可正常新建ipynb文件。
  • [热门活动] 华为云存储618特惠来袭,OBS限时秒杀低至1.9折起
    锁定华为云存储分官网,限量福利限时抢购!更多大额优惠券等你来领!点击进入:https://activity.huaweicloud.com/obs.html活动时间:2020年6月1日-2022年6月30日本次华为云存储618活动是年中最优惠的以低价购入云产品的活动,也是企业、个人、开发者的最佳上云时机。华为云存储分会场共有7大版块,分别是:优惠券专区、限时秒杀免费体验专区、存储热销产品专区、组合购专区、新购满额送好礼专区、产品应用场景专区、活动抽奖专区。各版块活动多多,新老用户同享。需要上云的朋友可根据自身情况选择,不要错过呦!优惠券专区活动期间,用户可在存储分会场领取618专属优惠券购买存储促销商品,本次优惠券分为满1000减50元、满2000减100元两种,可领取150元,存储新老用户专享。限时秒杀免费体验专区云存储618活动设置限时秒杀专区,OBS单AZ存储包部分产品1.9折起, 100G免费试用一个月。存储新用户专享500G特惠,以最低的价格享受最优的服务,数量有限,先到先得。存储热销产品专区精选存储热销产品中对象存储服务OBS、云服务器备份CBR、弹性文件服务SFS,全年购低至6折起,新老用户同享,满足您的上云需求。组合购专区针对不同场景业务需求不同,精选存储热销产品组合销售,产品搭着买,优惠共同享,组合商品折上折,满足各阶段需求。新购满额送好礼活动期间,累计新购实付达到指定金额,即可参与活动兑换相应的实物礼品。注意:现金券、折扣、优惠券等除外,续费订单不参与此活动,具体活动规则以官网活动说明为准。存储产品应用场景专区精选各储存产品热门场景应用,分析产品特性及使用优势,爆款产品组合推荐,产品搭着买,优惠共同享,满足各阶段的发展需求。并享技术专家一对一免费询问,技术支持,快速响应。抽奖专区活动期间,注册并完成企业实名认证或新购付费>1元时,即可获得一次抽奖机会,中奖概率100%,活动期间最高可获得两次!快来参与吧!有需要了解更多特惠产品的用户也可前往华为云主会场选购。惠上云、更简单,最高可领8888元上云大礼包!点击前往:https://activity.huaweicloud.com/618_promotion/index.html618存储狂欢专场,有问题咨询怎么办?面对如此折扣力度的大促活动,有问题和建议的可第一时间向我们反馈售前咨询:4000-955-988/950808 转1华为云存储618年终钜惠,超多福利享不停。海量产品,多种组合任你选,助力企业轻松上云,专属定制上云方案,让上云更简单!
  • [问题求助] 【XXX产品】【XXX功能】一句话描述问题
    【功能模块】OBS ip地址访问【操作步骤&问题现象】1、用OBS电脑端软件,输入AK和SK登录后,可以向桶上传文件。2、但使用postman,填入ip地址形式向OBS上传文件。签名等都过了,但是报Virtual host domain is required while accessing a specific bucket错误【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [其他] 在本地IDE中上传数据至Notebook
    不大于500MB数据量,直接拷贝至本地IDE中即可。大于500MB数据量,请先上传到OBS中,再从OBS上传到云上开发环境的默认存储EFS或云硬盘EVS。上传数据至OBS,具体操作请参见上传文件至OBS桶。将OBS中的数据传至Notebook的EFS/EVS中,通过在本地IDE的Terminal中使用ModelArts提供的Moxing库的文件操作API(mox.file.copy_parallel)完成。下图以PyCharm环境中开启Terminal为例,VSCode中操作类似。在本地IDE的Terminal中使用Moxing下载OBS文件到开发环境的操作示例如下:#手动source进入开发环境cat /home/ma-user/README#然后选择要source的环境source /home/ma-user/miniconda3/bin/activate MindSpore-python3.7-aarch64#使用moxingimport moxing as mox #下载一个OBS文件夹,从OBS下载至EFS/EVS(OBS -> EFS/EVS) mox.file.copy_parallel('obs://bucket_name/sub_dir_0', '/tmp/sub_dir_0')
总条数:814 到第
上滑加载中