• [技术干货] OBS JAVA SDK Demo:设置桶策略
    1      背景介绍OBS桶策略可以给特定用户设置特定的权限。下面代码展示通过JAVA SDK给用户桶设置高级桶策略。2      代码展示需要先下载OBS最新的JAVA SDK,参考官网链接:https://developer.huaweicloud.com/sdk?OBS,并在自己的项目中导入SDK中的JAR包。前提条件:已创建OBS桶,例如my-bucket123设置的桶策略为:给用户userB给予桶的所有权限和桶内所有对象的读权限桶策略格式如下,其中domain和user请根据实际账号ID和用户ID进行配置:{  "Statement": [    {      "Sid": "Stmt1375240018062",      "Action": [        "*"      ],      "Effect": "Allow",      "Resource": "my-bucket123",      "Principal": {        "ID": [          "domain/c41**************************8cf:user/053**************************2c4 "        ]      }    },    {      "Sid": "Stmt1375240018063",      "Action": [        "Get*"      ],      "Effect": "Allow",      "Resource": "my-bucket123/*",      "Principal": {        "ID": [          "domain/c41**************************8cf:user/053**************************2c4 "        ]      }    }  ]}Demo代码如下:package samples_java;import com.obs.services.ObsClient;import com.obs.services.ObsConfiguration;import com.obs.services.exception.Ob**ception;import java.io.IOException;public class BucketTestSample {     private static final String endPoint = "XXX";     private static final String ak = "XXX";     private static final String sk = "XXX";     private static ObsClient obsClient;     private static String bucketName = "my-bucket123";         public static void main(String[] args)             throws IOException {         ObsConfiguration config = new ObsConfiguration();         config.setSocketTimeout(30000);         config.setConnectionTimeout(10000);         config.setEndPoint(endPoint);         try {             obsClient = new ObsClient(ak, sk, config);             String  Policy = "{\"Statement\":[{\"Sid\":\"Stmt1375240018062\",\"Action\":[\"*\"],\"Effect\":\"Allow\",\"Resource\":\"my-bucket123\",\"Principal\":{\"ID\":[\"domain/c41**************************8cf:user/053**************************2c4\"]}},{\"Sid\":\"Stmt1375240018063\",\"Action\":[\"Get*\"],\"Effect\":\"Allow\",\"Resource\":\"my-bucket123/*\",\"Principal\":{\"ID\":[\"domain/c41**************************8cf:user/053**************************2c4\"]}}]}";             obsClient.setBucketPolicy(bucketName,Policy);         } catch (Ob**ception e) {             System.out.println("Response Code: " + e.getResponseCode());             System.out.println("Error Message: " + e.getErrorMessage());             System.out.println("Error Code:       " + e.getErrorCode());             System.out.println("Request ID:      " + e.getErrorRequestId());             System.out.println("Host ID:           " + e.getErrorHostId());         } finally {             if (obsClient != null) {                 try {                     obsClient.close();                 } catch (IOException e) {                     System.out.println(e);                 }             }         }     } }3      效果展示设置后的桶策略如下:userB在桶内上传文件失败(没有权限),下载文件成功4      附录OBS JAVA SDK使用,官网参考链接:https://support.huaweicloud.com/sdkreference-obs/obs_02_0001.html更多桶策略的具体格式(JSON格式字符串)请参考《对象存储服务API参考》:https://support.huaweicloud.com/api-obs/zh-cn_topic_0100846742.html
  • [教程] 开源大数据平台Hadoop和Spark对接OBS操作指南
    1      背景介绍华为云对象存储服务可以提供稳定、安全、高效、易用的云存储服务。当前,华为云OBS可以与Hadoop和Spark大数据生态进行对接,为用户提供计算存储分离的大数据解决方案。该方案具有高性能、低成本的优势,且无扩容问题,使用维护更加方便简洁。本操作指导书旨在帮助华为云用户在开源大数据平台Hadoop和Spark上**速对接OBSFileSystem组件,更好的使用华为云对象存储OBS进行大数据计算。2      部署视图2.1      安装版本硬件:1master+3core(配置:8U32G,操作系统:Centos7.5)软件:Hadoop 2.8.3、Spark 2.3.02.2      部署视图开源大数据平台已安装完成,本文主要介绍在Hadoop和Spark平台中通过OBSFileSystem组件与OBS进行对接的操作步骤。对接OBS后,用户的数据即可存储在OBS平台,通过Hadoop和Spark进行大数据计算,实现计算存储分离。 3      开源大数据平台对接OBS操作步骤3.1      Hadoop平台更新OBSFileSystem3.1.1        上传obs的jar包1、  从网址https://bbs.huaweicloud.com/forum/thread-12142-1-1.html 中下载OBSFileSystem后进行解压缩,其中Package目录中包含obs所需要的jar包,列表如下:2、  将obs所需要的jar包放在/mnt/obsjar目录中3.1.2        增加hadoop-huaweicloud的jar包1、  将hadoop-huaweicloud的jar包拷贝到如下各个目录中(/home/modules/hadoop-2.8.3/share/hadoop/common/lib;/home/modules/hadoop-2.8.3/share/hadoop/tools/lib)命令:cp /mnt/obsjar/hadoop-huaweicloud-2.8.3.13.jar /home/modules/hadoop-2.8.3/share/hadoop/common/lib/.cp /mnt/obsjar/hadoop-huaweicloud-2.8.3.13.jar /home/modules/hadoop-2.8.3/share/hadoop/tools/lib/.3.1.3        增加esdk-obs-java的jar包1、  将esdk-obs-java的jar包拷贝到如下各个目录中(/home/modules/hadoop-2.8.3/share/hadoop/common/lib;/home/modules/hadoop-2.8.3/share/hadoop/tools/lib)命令:cp /mnt/obsjar/esdk-obs-java-3.0.1.jar /home/modules/hadoop-2.8.3/share/hadoop/common/lib/.cp /mnt/obsjar/esdk-obs-java-3.0.1.jar /home/modules/hadoop-2.8.3/share/hadoop/tools/lib/.3.1.4        更换java-xmlbuilder的jar包1、  备份并删除hadoop-2.8.3所有目录中原有的java-xmlbuilder-0.4.jar(通过find查找后删除)。命令:rm -rf /home/modules/hadoop-2.8.3/share/hadoop/common/lib/java-xmlbuilder-0.4.jarrm -rf /home/modules/hadoop-2.8.3/share/hadoop/tools/lib/java-xmlbuilder-0.4.jar2、  将java-xmlbuider-1.1.jar包拷贝到如下各个目录中进行替换命令:cp /mnt/obsjar/java-xmlbuider-1.1.jar /home/modules/hadoop-2.8.3/share/hadoop/common/lib/.cp /mnt/obsjar/java-xmlbuider-1.1.jar /home/modules/hadoop-2.8.3/share/hadoop/tools/lib/.3.1.5        更换okhttp的jar包1、  备份并删除hadoop-2.8.3所有目录中原有的okhttp-2.4.0.jar(通过find查找后删除)。命令:rm -rf /home/modules/hadoop-2.8.3/share/hadoop/common/lib/okhttp-2.4.0.jarrm -rf /home/modules/hadoop-2.8.3/share/hadoop/tools/lib/okhttp-2.4.0.jarrm -rf /home/modules/hadoop-2.8.3/share/hadoop/httpfs/tomcat/webapps/webhdfs/WEB-INF/lib/okhttp-2.4.0.jarrm -rf /home/modules/hadoop-2.8.3/share/hadoop/hdfs/lib/okhttp-2.4.0.jar2、  将java-xmlbuider-1.1.jar包拷贝到如下各个目录中进行替换命令:cp /mnt/obsjar/okhttp-3.10.0.jar /home/modules/hadoop-2.8.3/share/hadoop/common/lib/.cp /mnt/obsjar/okhttp-3.10.0.jar /home/modules/hadoop-2.8.3/share/hadoop/tools/lib/.cp /mnt/obsjar/ okhttp-3.10.0.jar /home/modules/hadoop-2.8.3/share/hadoop/httpfs/tomcat/webapps/webhdfs/WEB-INF/lib/.cp /mnt/obsjar/okhttp-3.10.0.jar /home/modules/hadoop-2.8.3/share/hadoop/hdfs/lib/.3.1.6        更换okio的jar包1、  备份并删除hadoop-2.8.3所有目录中原有的okio-1.4.0.jar(通过find查找后删除)。命令:rm -rf /home/modules/hadoop-2.8.3/share/hadoop/common/lib/okio-1.4.0.jarrm -rf /home/modules/hadoop-2.8.3/share/hadoop/tools/lib/okio-1.4.0.jarrm -rf /home/modules/hadoop-2.8.3/share/hadoop/httpfs/tomcat/webapps/webhdfs/WEB-INF/lib/okio-1.4.0.jarrm -rf /home/modules/hadoop-2.8.3/share/hadoop/hdfs/lib/okio-1.4.0.jar2、  将java-xmlbuider-1.1.jar包拷贝到如下各个目录中进行替换命令:cp /mnt/obsjar/okio-1.14.0.jar /home/modules/hadoop-2.8.3/share/hadoop/common/lib/.cp /mnt/obsjar/okio-1.14.0.jar /home/modules/hadoop-2.8.3/share/hadoop/tools/lib/.cp /mnt/obsjar/ okio-1.14.0.jar /home/modules/hadoop-2.8.3/share/hadoop/httpfs/tomcat/webapps/webhdfs/WEB-INF/lib/.cp /mnt/obsjar/okio-1.14.0.jar /home/modules/hadoop-2.8.3/share/hadoop/hdfs/lib/.3.2      Hadoop平台更新配置文件操作步骤在/home/modules/hadoop-2.8.3/etc/hadoop目录中配置core-site.xml。注:fs.defaultFS 、fs.obs.access.key、fs.obs.secret.key、fs.obs.endpoint请根据实际情况进行修改。<property>   <name>fs.defaultFS</name>   <value>hdfs://ecs-bigdata-hdtest-0000.novalocal:8020</value> </property><property>   <name>hadoop.tmp.dir</name>   <value>/home/modules/hadoop-2.8.3/tmp</value> </property> <property>   <name>fs.obs.access.key</name>   <value>myaccesskey</value> </property> <property>   <name>fs.obs.secret.key</name>   <value>mysecretkey</value> </property> <property>   <name>fs.obs.endpoint</name>   <value>myendpoint</value> </property> <property>   <name>fs.obs.buffer.dir</name>   <value>/home/modules/data/buf</value> </property> <property>   <name>fs.obs.impl</name>   <value>org.apache.hadoop.fs.obs.OBSFileSystem</value> </property> <property>   <name>fs.obs.connection.ssl.enabled</name>   <value>false</value> </property> <property>   <name>fs.obs.fast.upload</name>   <value>true</value> </property>配置成功后即可执行hadoop命令3.3      Spark平台更新OBSFileSystem3.3.1        增加obs的jar包1、  备份并删除spark-2.3.0所有目录中原有的版本较低的java-xmlbuilder-X.X.jar、okhttp-X.X.X.jar和okio-X.X.X.jar(通过find查找后删除)。命令:rm -rf /home/modules/spark-2.3.0/jars/java-xmlbuilder*rm -rf /home/modules/spark-2.3.0/jars/okhttp*rm -rf /home/modules/spark-2.3.0/jars/okio*2、  将obs的jar包(hadoop-huaweicloud-2.8.3.13.jar、esdk-obs-java-3.0.1.jar、java-xmlbuilder-1.1.jar、okhttp-3.10.0.jar和okio-1.14.0.jar)拷贝到如下各个目录(/home/modules/spark-2.3.0/jars/)后即可启动spark使用OBS进行大数据计算。命令:cp /mnt/obsjar/hadoop-huaweicloud-2.8.3.13.jar /home/modules/spark-2.3.0/jars/.cp /mnt/obsjar/esdk-obs-java-3.0.1.jar /home/modules/spark-2.3.0/jars/.cp /mnt/obsjar/java-xmlbuilder-1.1.jar /home/modules/spark-2.3.0/jars/.cp /mnt/obsjar/okhttp-3.10.0.jar /home/modules/spark-2.3.0/jars/.cp /mnt/obsjar/okio-1.14.0.jar /home/modules/spark-2.3.0/jars/.
  • [教程] 采用CDM进行HDFS到OBS的数据迁移
    1      背景介绍传统的Hadoop和Spark大数据生态,主要是以本地硬盘或云硬盘承载HDFS文件系统进行数据存储,但是存在成本高,扩容难等问题。当前华为云对象存储服务OBS可以与Hadoop和Spark大数据生态进行对接,为用户提供计算存储分离的大数据解决方案。为了实现用户数据平滑上云,可以采用华为云CDM服务进行HDFS到OBS的数据迁移。2      迁移背景和目标已存在集群一采用EVS存储HDFS格式数据,新建集群二采用OBS存储数据,需要将数据从集群一的HDFS迁移至集群二的OBS。3      迁移方法1、已搭建集群一(北京一)和集群二(华东),集群一采用EVS存储数据,集群二采用OBS存储数据2、在集群一构造Spark或者Hive的数据,例如,构造Hive表数据如下(1)创建DATABASECREATE DATABASE top_ods;(2)创建TABLECREATE TABLE `top_ods.claim_6yue_pt`(  `user_id` varchar(300),  `ese_id` int,   `task_id` varchar(100))partitioned by (tagdate int)ROW FORMAT DELIMITED FIELDS TERMINATED BY "|"STORED AS parquetfileTBLPROPERTIES ("orc.compression"="Snappy");insert into table top_ods.claim_6yue_pt partition(tagdate=1) values( '10' ,10,'10');insert into table top_ods.claim_6yue_pt partition(tagdate=1) values( '11' ,11,'11');insert into table top_ods.claim_6yue_pt partition(tagdate=1) values( '12' ,12,'12');insert into table top_ods.claim_6yue_pt partition(tagdate=1) values( '13' ,13,'13');insert into table top_ods.claim_6yue_pt partition(tagdate=1) values( '14' ,14,'14');insert into table top_ods.claim_6yue_pt partition(tagdate=1) values( '15' ,15,'15');insert into table top_ods.claim_6yue_pt partition(tagdate=2) values( '20' ,20,'20');insert into table top_ods.claim_6yue_pt partition(tagdate=2) values( '21' ,21,'21');insert into table top_ods.claim_6yue_pt partition(tagdate=2) values( '22' ,22,'22');insert into table top_ods.claim_6yue_pt partition(tagdate=2) values( '23' ,23,'23');insert into table top_ods.claim_6yue_pt partition(tagdate=2) values( '24' ,24,'24');insert into table top_ods.claim_6yue_pt partition(tagdate=2) values( '25' ,25,'25');select * from top_ods.claim_6yue_pt;3、在集群二创建Spark或者Hive的新表,新表格式与源表的存储格式等属性要一致(1)创建DATABASECREATE DATABASE top_odstest location 'obs://obs-bigdata-hd-003/user/hive/warehouse/top_ods.db';(2)创建TABLE,新表格式与源表的存储格式等属性要一致CREATE TABLE `top_odstest.claim_6yue_pt`(  `user_id` varchar(300),  `ese_id` int,   `task_id` varchar(100))partitioned by (tagdate int)ROW FORMAT DELIMITED FIELDS TERMINATED BY "|"STORED AS parquetfileTBLPROPERTIES ("orc.compression"="Snappy");4、创建CDM任务,将集群一的HDFS数据迁移至集群二的OBS(1)创建CDM集群(华东),跨Region需要绑定公网弹性IP(2)配置连接管理,一个连接使用Apache HDFS,另一个连接使用对象存储服务(OBS)备注:集群一的所有节点需配置公网弹性IP,并且Apache HDFS连接中的IP与主机名映射要填写所有集群一的主机XX.XX.XX.XX ecs-bigdata-hdtest-0000.novalocalXX.XX.XX.XX ecs-bigdata-hdtest-0001.novalocalXX.XX.XX.XX ecs-bigdata-hdtest-0002.novalocalXX.XX.XX.XX ecs-bigdata-hdtest-0003.novalocal(3)配置作业管理,源连接使用HDFS连接,目标连接使用OBS连接,文件格式使用二进制格式(4)配置完成后,运行作业进行数据迁移5、迁移完成后,在集群二恢复Hive表数据,即可查询数据成功。恢复Hive表数据:MSCK REPAIR TABLE top_odstest.claim_6yue_pt;查询Hive表数据:select * from top_odstest.claim_6yue_pt;
  • [技术干货] OBS JAVA SDK 实践7:已存在对象如何修改对象名称、对象属性、以及注意事项
    1      已存在对象如何修改对象名称目前已经上传到OBS桶中的对象名称是不可修改的(后续OBS会上线POSIX语义桶,可能会支持),如果想修改已经存在的对象名称,可以通过复制旧对象到新对象,再将旧对象删除来实现。以OBS JAVA SDK为例,复制对象操作,参考链接:https://support.huaweicloud.com/sdk-java-devg-obs/zh-cn_topic_0142815454.html;删除对象操作,参考链接:https://support.huaweicloud.com/sdk-java-devg-obs/zh-cn_topic_0142815453.html。2      已存在对象如何修改对象属性对象元数据有很多,比如Object文件类型Content-Type、指定Object被下载时的网页的缓存行为Cache-Control、还可以自定义元数据x-obs-meta-*,具体可以参考API接口链接说明:https://support.huaweicloud.com/api-obs/zh-cn_topic_0137044900.html。已经上传到OBS桶中的对象属性不可以直接修改,(后续OBS SDK会上线此功能),目前可通过带对象属性覆盖上传同名对象来达到效果(参考链接:https://support.huaweicloud.com/sdk-java-devg-obs/zh-cn_topic_0142815529.html),也可以通过带对象属性复制同名对象来达到效果(参考链接:https://support.huaweicloud.com/sdk-java-devg-obs/zh-cn_topic_0142815454.html)。注:若OBS桶开启了多版本,通过对象覆盖对象和复制对象来达到修改对象属性时若不带版本进行操作,会产生多余的新版本对象,占用额外的存储空间3      附录链接OBS JAVA SDK使用方法,官网参考链接:https://support.huaweicloud.com/sdk-java-devg-obs/zh-cn_topic_0142815558.html
  • [技术干货] OBS JAVA SDK 实践5:判断文件是否存在
    1      背景介绍 & 效果展示通过JAVA SDK可判断文件是否存在,并不需要下载对象操作,如果对象存在会返回对象的类型和对象大小,若对象不存在则返回相应的错误码,效果如下。图1 对象存在会返回对象的类型和对象大小图2 对象不存在则返回相应的错误码2      java代码参考前提:需要先下载OBS最新的JAVA SDK,参考官网链接:https://developer.huaweicloud.com/sdk?OBS,并在自己的项目中导入SDK中的JAR包。                  public static void main(String[] args) throws IOException {                   // 需要将endPoint/ak/sk更新为实际信息                   String endPoint = "https://your-endpoint";                   String ak = "*** Provide your Access Key ***";                   String sk = "*** Provide your Secret Key ***";                                      // 创建ObsClient实例                   ObsClient obsClient = new ObsClient(ak, sk, endPoint);                   try                  {                                        String bucketName = "bucketXXX";                // 需要将bucketName更新为实际信息                                       String objectName = "objectXXX";                // 需要将objectName更新为实际信息                                      ObjectMetadata metadata = obsClient.getObjectMetadata(bucketName, objectName);                                            System.out.println("---------------\nobject exist!");                                      System.out.println("\tcontentType: " + metadata.getContentType());                                      System.out.println("\tcontentLength: " + metadata.getContentLength());                  }                  catch (Ob**ception e)                  {                      System.out.println("Response Code: " + e.getResponseCode());                      System.out.println("Error Message: " + e.getErrorMessage());                      System.out.println("Error Code:       " + e.getErrorCode());                      System.out.println("Request ID:      " + e.getErrorRequestId());                      System.out.println("Host ID:           " + e.getErrorHostId());                                            if(e.getResponseCode() == 404) {                             System.out.println("---------------\nobject doesn't exist!");                      }                  } }3      附录链接OBS JAVA SDK使用方法,官网参考链接:https://support.huaweicloud.com/sdk-java-devg-obs/zh-cn_topic_0142815558.html
  • [技术干货] OBS BrowserJS SDK 实践1:结合HTML5 Canvas实现图片局部放大效果
    1      背景介绍 & 效果展示我们经常在电商购物时,当鼠标滑过物品展示图时,会在展示图旁边显示一个图片局部放大的效果图。本文利用OBS BrowserJS SDK上传图片对象到OBS,结合HTML5 Canvas特性可轻松实现“放大镜”效果。效果展示页面已经托管到OBS桶,访问地址:https://static-web-chongchong.obs-website.cn-north-1.myhuaweicloud.com/注:更多关于静态网站托管信息,可参考链接https://bbs.huaweicloud.com/forum/thread-15492-1-1.html图1 默认图片效果展示图2 方法一:通过上传本地图片文件进行展示首先点击“选择文件”按钮选择本地图片文件,单击“点击上传”按钮,待按钮下方显示100%进度完成后,单击“显示图片”即可以看到展示效果。(若图片较大,加载时需要点时间,请耐心等待)图3 方法二:通过已有的图片URL链接显示首先在文件框中输入可用的图片URL链接,单击“显示链接图片”按钮即可以看到展示效果。(若图片较大,加载时需要点时间,请耐心等待)注:针对已经上传到OBS的图片,其URL链接可通过OBS的“分享文件”功能获取(可参考链接https://support.huaweicloud.com/usermanual-obs/obs_03_0046.html),也可以直接在匿名可读的对象上获取URL链接(可参考链接https://support.huaweicloud.com/usermanual-obs/zh-cn_topic_0045829105.html)2      代码参考工具由Magnifier.html、以及子目录下Magnify的OBS BrowserJS SDK库文件、CSS文件、JS文件构成。所有的代码可在打开效果展示页面后(访问地址:https://static-web-chongchong.obs-website.cn-north-1.myhuaweicloud.com/),浏览器中打开F12调试页面获取。3      附录链接OBS BrowserJS SDK 下载和使用,官网参考链接:https://support.huaweicloud.com/sdk-browserjs-devg-obs/zh-cn_topic_0125029729.html
  • [分享交流] OBS详细错误信息
    OBS请求返回403时,返回头域x-reserved-indicator的含义如下:361-371由于桶policy导致请求被拒绝372由于桶或者对象的ACL权限,请求被拒绝373post回调请求,参数错误374post回调请求,被流控375post上传对象,回调错误376policy临时鉴权,目录分享,policy已经失效377policy临时鉴权,目录分享,policy条件不匹配378policy临时鉴权,目录分享,请求参数多余,没有与之匹配的条件379policy临时鉴权,目录分享,请求操作类型不支持380vpcid 校验不通过381非桶owner操作自定义域名382非桶owner操作桶policy383桶policy权限检查异常场景384不支持本地ip385post鉴权,policy已经失效,过了失效时间386post鉴权,policy条件没有匹配387post鉴权,请求参数多余,没有与之匹配的条件388不支持跨region拷贝对象和多段
  • [技术干货] 华为公有云OBS服务的SDK集成好后,可以直接用于对接HIS 对象存储服务吗?谢谢先
    华为公有云OBS服务的SDK集成好后,可以直接用于对接HIS 对象存储服务吗?或者反过来,HIS S3对象存储的SDK集成好后,能直接用于对接华为公有云的OBS服务吗?两者是否都是标准的AWS S3接口呀?非常感谢~
  • [技术干货] OBS JAVA SDK 实践3:列举指定目录下的所有文件、列举指定目录下的文件和子目录
    1      背景介绍 & 效果展示可以通过JAVA SDK,列举指定目录下的所有文件,也可以列举指定目录下的文件和子目录,效果如下。图1 指定目录share/下的所有文件图2 列举指定目录下的所有文件图3 列举指定目录下的文件和子目录2      java代码参考(列举指定目录下的文件和子目录)前提:需要先下载OBS最新的JAVA SDK,参考官网链接:https://developer.huaweicloud.com/sdk?OBS,并在自己的项目中导入SDK中的JAR包。           String endPoint = "https://your-endpoint";                   String ak = "*** Provide your Access Key ***";                   String sk = "*** Provide your Secret Key ***";                                      // 创建ObsClient实例                   ObsClient obsClient = new ObsClient(ak, sk, endPoint);                                                         ListObjectsRequest request = new ListObjectsRequest("chongchongtest");                   // 设置文件夹对象名"share/"为前缀                   request.setPrefix("share/");                   request.setMaxKeys(1000);                    ObjectListing result;                    System.out.println("Objects:");                   do{                       result = obsClient.listObjects(request);                       for (ObsObject obsObject : result.getObjects())                       {                           System.out.println("\t" + obsObject.getObjectKey());                       }                       System.out.println("------------------------------");                       request.setMarker(result.getNextMarker());                   }while(result.isTruncated()); 3      java代码参考(列举指定目录下的所有文件)前提:需要先下载OBS最新的JAVA SDK,参考官网链接:https://developer.huaweicloud.com/sdk?OBS,并在自己的项目中导入SDK中的JAR包。String endPoint = "https://your-endpoint";                   String ak = "*** Provide your Access Key ***";                   String sk = "*** Provide your Secret Key ***";                                      // 创建ObsClient实例                   ObsClient obsClient = new ObsClient(ak, sk, endPoint);                                      ListObjectsRequest request = new ListObjectsRequest("chongchongtest");                   // 设置文件夹对象名"share/"为前缀                   request.setPrefix("share/");                   request.setDelimiter("/");                   request.setMaxKeys(500);                    ObjectListing result;                    // 列举文件                   System.out.println("Objects:");                   do{                       result = obsClient.listObjects(request);                       for (ObsObject obsObject : result.getObjects())                       {                           System.out.println("\t" + obsObject.getObjectKey());                       }                       System.out.println("------------------------------");                       request.setMarker(result.getNextMarker());                   }while(result.isTruncated());                                      // 列举子目录                   System.out.println("\nFolder:");                   do{                       result = obsClient.listObjects(request);                       for (String commonPrefix : result.getCommonPrefixes())                       {                           System.out.println("\t" + commonPrefix);                       }                       System.out.println("------------------------------");                       request.setMarker(result.getNextMarker());                   }while(result.isTruncated());4      附录链接OBS JAVA SDK 列举对象其它使用方法,官网参考链接:https://support.huaweicloud.com/sdk-java-devg-obs/zh-cn_topic_0142815500.html
  • [技术干货] (GO生成可执行文件)利用OBS API配置和查询桶历史对象CRR
    (GO生成可执行文件)利用OBS API配置和查询桶历史对象CRR1      工具作用OBS提供跨区域复制(CRR)功能,此功能开通后,可以将同一个账号下一个桶(源桶)中的数据自动、异步地复制到不同区域的另外一个桶(目标桶)中,但启用跨区域复制功能之前上传的对象,不会被复制到目标桶。为了解决这个问题,CRR提供了历史对象CRR功能,开启此功能后,源桶中的所有数据都会自动、异步地复制到目标桶中,此功能的界面还未上线,但可以通过OBS API发送http、https请求来配置历史对象CRR功能,本文工具对API接口进行封装,使用者只需填写简单的配置信息即可启动桶历史对象CRR功能。2      效果展示源桶obs-chongchong-guangzhou中有1000个对象。使用工具启动源桶obs-chongchong-guangzhou到目的桶obs-chongchong-beijing的历史对象CRR,约10分钟后源桶中数据复制到北京region的目的桶obs-chongchong-beijing中。3      工具使用详细步骤(Linux平台)3.1      拷贝工具目录到工具运行平台将本文附录中的工具包链接(testCrrOld_Go_Linux.zip)下载到Linux平台指定目录并解压,并为可执行文件setBucketCrr配置执行权限,效果如下:     其中setBucketCrr是可执行文件、application.properties是配置文件、replicationOld-open.xml是配置历史对象CRR的XML文件。3.2      配置application.properties、replicationOld-open.xmlapplication.properties是工具运行的配置文件,需要将文件中的信息更新为实际信息。replicationOld-open.xml是配置历史对象CRR的XML内容,需要参考下表中解释将文件中的信息更新为实际信息。名称描述是否必须Agency用户创建的委托名字是ID规则的特殊辨识符否Prefix对象键值名的前缀,适配于一个或者多个对象。否Bucket规则适用的目的桶名称。是StorageClass对象的存储类型。有效值:STANDARD|WARM|COLD否 注:XML中字段更详细的配置指导参考链接——https://support.huaweicloud.com/usermanual-obs/obs_03_0003.html3.3      运行工具直接运行可执行文件setBucketCrr即可,工具会发送OBS配置请求,同时还会返回查询配置的结果信息。4      工具使用详细步骤(Windows平台)4.1      拷贝工具目录到工具运行平台将本文附录中的工具包链接(testCrrOld_Go_Win.zip)下载到Linux平台指定目录并解压,效果如下:     其中setBucketCrr是exe可执行文件、application.properties是配置文件、replicationOld-open.xml是配置历史对象CRR的XML文件。4.2      配置application.properties、replicationOld-open.xmlapplication.properties是工具运行的配置文件,需要将文件中的信息更新为实际信息。replicationOld-open.xml是配置历史对象CRR的XML内容,需要参考下表中解释将文件中的信息更新为实际信息。名称描述是否必须Agency用户创建的委托名字是ID规则的特殊辨识符否Prefix对象键值名的前缀,适配于一个或者多个对象。否Bucket规则适用的目的桶名称。是StorageClass对象的存储类型。有效值:STANDARD|WARM|COLD否 注:XML中字段更详细的配置指导参考链接——https://support.huaweicloud.com/usermanual-obs/obs_03_0003.html4.3      运行工具可通过cmd来运行可执行文件setBucketCrr,工具会发送OBS配置请求,同时还会返回查询配置的结果信息。 5      附录工具下载链接:https://obs-tools.obs.cn-north-1.myhuaweicloud.com/crrApi/testCrrOld_Go_Linux.ziphttps://obs-tools.obs.cn-north-1.myhuaweicloud.com/crrApi/testCrrOld_Go_Win.zip  
  • [技术干货] OBS JAVA SDK 实践4:统计指定目录下的文件和子目录大小
    OBS JAVA SDK 实践4:统计指定目录下的文件和子目录大小1      背景介绍 & 效果展示可以通过JAVA SDK统计指定目录下的文件和子目录大小,效果如下。图1 指定目录share/下的所有文件图2 统计指定目录下的文件和子目录大小2      java代码参考前提:需要先下载OBS最新的JAVA SDK,参考官网链接:https://developer.huaweicloud.com/sdk?OBS,并在自己的项目中导入SDK中的JAR包。                  public static void main(String[] args) throws IOException {                                      String endPoint = "https://your-endpoint";                   String ak = "*** Provide your Access Key ***";                   String sk = "*** Provide your Secret Key ***";                                      // 创建ObsClient实例                   ObsClient obsClient = new ObsClient(ak, sk, endPoint);                                      String bucketName = "chongchongtest";                   ListObjectsRequest request = new ListObjectsRequest(bucketName);                   // 统计文件夹对象名"share/"下面的子目录和文件的大小                   request.setPrefix("share/");                   request.setDelimiter("/");                    ObjectListing result;                    // 统计文件夹下对象的大小                   System.out.println("Objects:");                   do{                       result = obsClient.listObjects(request);                       for (ObsObject obsObject : result.getObjects())                       {                             double objectSize = obsObject.getMetadata().getContentLength() / 1024.0;                           System.out.println("\t" + obsObject.getObjectKey() + ": " + String.format("%.2f", objectSize) + "KB");                       }                       System.out.println("------------------------------");                       request.setMarker(result.getNextMarker());                   }while(result.isTruncated());                                      // 统计子目录的大小                   System.out.println("\nFolder:");                   do{                       result = obsClient.listObjects(request);                       for (String commonPrefix : result.getCommonPrefixes())                       {                           double objectSize = countFolerLength(obsClient, bucketName, commonPrefix);                           System.out.println("\t" + commonPrefix + ": " + String.format("%.2f", objectSize) + "KB");                       }                       System.out.println("------------------------------");                       request.setMarker(result.getNextMarker());                   }while(result.isTruncated());          }                    //统计每个子目录的大小          private static double countFolerLength(ObsClient obsClient, String bucketName, String folder) {                                      double size = 0L;                                      ListObjectsRequest request = new ListObjectsRequest(bucketName);                   request.setPrefix(folder);                                      ObjectListing result;                   do{                       result = obsClient.listObjects(request);                       for (ObsObject obsObject : result.getObjects())                       {                           size += obsObject.getMetadata().getContentLength() / 1024.0;                       }                       request.setMarker(result.getNextMarker());                   }while(result.isTruncated());                                      return size;          }                   3      附录链接OBS JAVA SDK 列举对象其它使用方法,官网参考链接:https://support.huaweicloud.com/sdk-java-devg-obs/zh-cn_topic_0142815500.html
  • [技术干货] OBS通过消息通知去OSS拉起数据工具
    1      工具作用阿里云OSS上的对象数据如果有更新会向工具发送http消息通知,工具会一直监听http消息,启动多线程对消息进行处理,并调用OBS接口回源到阿里云OSS源桶拉取对象数据到OBS。2      效果展示图2.1 阿里云同时更新4个对象图2.2 华为云随后也同步更新4个对象3      使用前准备工具使用前需要有如下3方面准备:1)     需要给阿里云源桶配置http事件通知功能和公共可读权限,如图3.1和图3.2所示,其中接收端地址为工具所在主机的IP及工具所监听端口号。2)     华为云所在的桶需要配置回源功能到阿里云源桶,如图3.3所示。3)     运行工具的Linux平台需要安装JAVA(JDK)。图3.1 阿里云源桶主题创建示例图3.2 阿里云源桶主题订阅者示例(消息推送格式需设置为SIMPLIFIED)图3.3 华为云桶回源设置示例(消息推送格式需设置为SIMPLIFIED)4      工具实现原理工具实现原理流程示意图开发语言:Java(jdk-8.0.1)IDE:Eclipse(Version: 2018-12 (4.10.0))使用到的相关SDK:OBS SDK(eSDK_Storage_OBS_V3.1.2.1_Java)5      工具使用详细步骤(以Linux系统运行平台为例)5.1      拷贝工具目录到工具运行平台将本文附录中的工具包(ObsFetchHttp.zip)解压上传到Linux平台指定目录,效果如下:     其中httpUpdateServer.jar是工具jar包、application.properties是工具运行的配置文件、log4j.properties是日志运行配置文件(建议保持默认配置)。5.2      配置application.properties文件application.properties是工具运行的配置文件,需要将文件中的XXX部分更新为实际信息,其中AK、SK信息为华为云桶所在帐号的AK、SK。5.3      运行工具使用命令“nohup java -jar httpUpdateServer.jar &”运行工具,之后工具就会时时监听阿里云发来的http消息并进行处理。6      附录工具下载链接:https://obs-tools.obs.cn-north-1.myhuaweicloud.com/zdh/ObsFetchHttp.zip
  • [技术干货] (JAVA生成可执行文件)利用OBS API配置和查询桶历史对象CRR
    1      工具作用OBS提供跨区域复制(CRR)功能,此功能开通后,可以将同一个账号下一个桶(源桶)中的数据自动、异步地复制到不同区域的另外一个桶(目标桶)中,但启用跨区域复制功能之前上传的对象,不会被复制到目标桶。为了解决这个问题,CRR提供了历史对象CRR功能,开启此功能后,源桶中的所有数据都会自动、异步地复制到目标桶中,此功能的界面还未上线,但可以通过OBS API**送http、https请求来配置历史对象CRR功能,本文工具对API接口进行封装,使用者只需填写简单的配置信息即可启动桶历史对象CRR功能。2      效果展示源桶obs-chongchong-guangzhou中有1000个对象。使用工具启动源桶obs-chongchong-guangzhou到目的桶obs-chongchong-beijing的历史对象CRR,约10分钟后源桶中数据复制到北京region的目的桶obs-chongchong-beijing中。3      使用前准备工具使用前需要做如下准备:1)     运行工具的平台需要安装JAVA(JDK)4      工具使用详细步骤4.1      拷贝工具目录到工具运行平台将本文附录中的工具包链接(testCrrOld.zip)下载到Linux平台指定目录并解压,效果如下:     其中setBucketCrr.jar是工具jar包、application.properties是工具运行的配置文件、replicationOld-open.xml是配置历史对象CRR的XML内容。4.2      配置application.properties、replicationOld-open.xmlapplication.properties是工具运行的配置文件,需要将文件中的信息更新为实际信息。replicationOld-open.xml是配置历史对象CRR的XML内容,需要参考下表中解释将文件中的信息更新为实际信息。名称描述是否必须Agency用户创建的委托名字是ID规则的特殊辨识符否Prefix对象键值名的前缀,适配于一个或者多个对象。否Bucket规则适用的目的桶名称。是StorageClass对象的存储类型。有效值:STANDARD|WARM|COLD否注:XML中字段更详细的配置指导参考链接——https://support.huaweicloud.com/usermanual-obs/obs_03_0003.html4.3      运行工具使用命令“java –jar setBucketCrr.jar”运行工具,工具会**送OBS配置请求,同时还会返回查询配置的结果信息。5      附录工具下载链接:https://obs-tools.obs.cn-north-1.myhuaweicloud.com/crrApi/testCrrOld.zip
  • [技术干货] OBS JAVA SDK 实践2:模拟桶删的功能(删除非空桶)
    1      背景介绍目前OBS只支持删除空桶,如果桶中有数据,需要先删除桶中所有数据(包含多版本),之后才能删除桶。下面的代码模拟桶删的功能,展示如何一步到位删除非空桶。2      效果展示这里桶obs-chongchong-guangzhou桶中有约2000个对象数据,多个文件夹                                                 使用代码进行桶删后,在桶列表中已经找不到此桶3      java代码参考前提:需要先下载OBS最新的JAVA SDK,参考官网链接:https://developer.huaweicloud.com/sdk?OBS,并在自己的项目中导入SDK中的JAR包。import java.io.IOException;import com.obs.services.ObsClient;import com.obs.services.ObsConfiguration;import com.obs.services.exception.Ob**ception;import com.obs.services.model.DeleteObjectsRequest;import com.obs.services.model.DeleteObjectsResult;import com.obs.services.model.ListVersionsRequest;import com.obs.services.model.ListVersionsResult;import com.obs.services.model.VersionOrDeleteMarker; public class BucketDelete {       private static ObsClient obsClient;        public static void main(String[] args) throws InterruptedException       {           try           {               String endPoint = "XXX";        // e.g "https://obs.cn-north-1.myhuaweicloud.com"               String ak = "XXX";                              // 对象所属的帐户ak               String sk = "XXX";                              // 对象所属的帐户sk                                                              String bucketName = "obs-chongchong-beijing";               // 需要填写为实际的桶名               obsClient = new ObsClient(ak, sk, endPoint);                                                               //列举桶中对象并删除               ListVersionsResult result = obsClient.listVersions(bucketName);                                                              if(result.getVersions().length != 0)               {                    ListVersionsRequest request = new ListVersionsRequest(bucketName);                    // 设置每次批量删除500个对象                    request.setMaxKeys(500);                    ListVersionsResult result1;                    do {                         result1 = obsClient.listVersions(request);                         DeleteObjectsRequest deleteRequest = new DeleteObjectsRequest(bucketName);                         for(VersionOrDeleteMarker v  : result1.getVersions()) {                              deleteRequest.addKeyAndVersion(v.getKey(), v.getVersionId());                         }                                                                                                       DeleteObjectsResult deleteResult = obsClient.deleteObjects(deleteRequest);                         // 获取删除成功的对象                         System.out.println(deleteResult.getDeletedObjectResults());                                                                                                 request.setKeyMarker(result1.getNextKeyMarker());                         request.setVersionIdMarker(result1.getNextVersionIdMarker());                    }while(result.isTruncated());               }                                                                                                               //删除桶               obsClient.deleteBucket(bucketName);               System.out.println("\n------------------\nbucket already delete.");         }         catch (Ob**ception e)         {               e.printStackTrace();               System.out.println("Response Code: " + e.getResponseCode());               System.out.println("Error Message: " + e.getErrorMessage());               System.out.println("Error Code:       " + e.getErrorCode());               System.out.println("Request ID:      " + e.getErrorRequestId());               System.out.println("Host ID:           " + e.getErrorHostId());          }          finally          {               if (obsClient != null)                   {                       try                       {                            obsClient.close();                        }                        catch (IOException e)                            {                            }                        }                    }             }                         }   4      附录链接OBS JAVA SDK使用,官网参考链接:https://support.huaweicloud.com/sdkreference-obs/obs_02_0001.html
  • [技术干货] OBS对象下载记录邮件通知工具
    1      工具作用每天定时收集昨日桶中的对象下载记录,整理后发送通知邮件给客户,使客户能直观看到数据下载情况。2      效果展示收到的邮件效果图3      使用前准备工具使用前需要有如下3方面准备:1)     需要给想记录下载情况的桶配置Logging功能(配置到同一桶中,命名日志前缀为“bucketname-log/”,相当于把日志都放到桶根目录“bucketname-log/”文件夹下)2)     需要在console(建议在默认region,cn-north-1)配置SMN下载Topic(邮件),并增加订阅者(即收件人邮箱地址)3)     运行工具的平台需要安装JAVA(JDK)4      工具实现原理工具实现原理流程示意图开发语言:Java(jdk-8.0.1)IDE:Eclipse(Version: 2018-12 (4.10.0))使用到的相关SDK:OBS SDK(eSDK_Storage_OBS_V3.1.2.1_Java)、SMN SDK(smn-sdk-java2.0-2.0.1)5      工具使用详细步骤(以Linux系统运行平台为例)5.1      拷贝工具目录到工具运行平台将本文附录中的工具包(obs-notify-service.zip)下载后解压到Linux平台指定目录,效果如下:     其中obs-notify-service.jar是工具jar包、application.properties是工具运行的配置文件、auto.sh用于指定工具定时运行时间,auto.sh的脚本内容如下:5.2      配置application.properties文件application.properties是工具运行的配置文件,需要将文件中的XXX部分更新为实际信息。5.3      配置crontab定时任务使用crontab –e命令在linux平台增加定时任务,如下定义每天早上8:10运行此工具:10 8 * * * /var/ftp/zoudanhong_local/obs-notify-service/auto.sh配置完成以后,用crontal –l查看定时任务,确保无误。之后工具就会自动在每天8:10准时给客户发送邮件了~6      附录工具下载链接:https://obs-tools.obs.cn-north-1.myhuaweicloud.com/zdh/obs-notify-service.zip
总条数:1488 到第
上滑加载中