-
# 1.服务说明 FunctionGraph服务:基于事件驱动的函数托管计算服务。通过函数工作流,只需编写业务函数代码并设置运行的条件,无需配置和管理服务器等基础设施,函数以弹性、免运维、高可靠的方式运行。 # 2.方案说明 ## 2.1 需求及痛点 需求:实现CDN日志实时转存到OBS 痛点:当前CDN日志模块不支持转储能力,需要客户代码实现该能力 ## 2.2 方案设计  **方案说明:** - 定时触发器,固定频率启动函数 - 函数请求CDN日志接口,获取日志下载链接 - 函数请求下载链接,将下载的日志上传到OBS固定目录下。 ## 2.3 服务创建 ### 2.3.1 确认CDN日志记录状态 - 在华为云控制台查看CDN日志记录是否正常,如图可知日志会有5个小时的延迟。  ### 2.3.2 FunctionGraph新建函数 - 登录华为云控制台,进入“管理与部署>统一身份认证服务”,选择“委托”页签,点击创建“委托”。  - 下一步,进入委托配置权限界面。作用范围:全局服务;权限选择:OBS OperateAccess 、CDN LogsReadOnlyAccess。点击确认  - 华为云控制台,选择“计算>函数工作流”,进入函数工作流界面,点击右上角“创建函数”,输入图片中的信息,点击创建函数  - 创建后,进入代码编辑界面,将 Demo代码 的代码内容复制到在线IDE  - 点击配置按钮,配置“环境变量”  **注:** url :https://cdn.myhuaweicloud.com/v1.0/cdn/logs(CDN日志查询的url)。 domain_name :xxx.com(需要转存日志的CDN加速域名)。 obsAddress :xxx.com(用于存日志的OBS桶域名)。 destBucket :******(用于存日志的OBS桶文件夹名称)。 - 在函数配置界面选择“触发器”,点击右侧“创建触发器”,配置内容如下,点击确定。(实例代码中日志转储的日志为最新生成的近一小时日志)  - 在函数配置界面,单击右上角“请选择测试事件”下拉框,选择“配置测试事件”,配置内容如下,点击保存即可。  - 在函数配置界面,单击右上角“请选择测试事件”下拉框,选择“配置测试事件”,配置内容如下,点击保存即可。  - 点击函数的保存按钮即可,函数配置成功。 # 3.FunctionGraph适用说明 该FunctionGraph函数工作流适用于CDN日志转储OBS,转储规则为增量转储,可通过配置触发器以及修改代码实现定时增量转储固定周期的CDN日志。 # 4.Demo代码 ```python # -*- coding:utf-8 -*- import requests import datetime import time import os import sys import json from com.obs.client.obs_client import ObsClient from urllib.parse import urlparse if sys.version_info.major == 2 or not sys.version > '3': import httplib else: import http.client as httplib current_file_path = os.path.dirname(os.path.realpath(__file__)) sys.path.append(current_file_path) TEMP_ROOT_PATH = "/tmp/" # OBS文件下载后的存储路径 region = 'china' # 默认值,用于FunctionGraph连接OBS使用 secure = True # 默认值,用于FunctionGraph连接OBS使用 signature = 'v4' # 默认值,用于FunctionGraph连接OBS使用 port = 443 # 默认值,用于FunctionGraph连接OBS使用 path_style = True # 默认值,用于FunctionGraph连接OBS使用 def handler(event, context): #引用context的logger方法 logger = context.getLogger() #CDN日志记录查询接口的起始时间,转换成时间戳;当前为近6个小时的日志记录 timer = (datetime.datetime.now()-datetime.timedelta(hours=6)).strftime("%Y-%m-%d %H") timeStamp = int(time.mktime(time.strptime(timer,"%Y-%m-%d %H"))*1000) #配置日志转储的起始时间点,转换成时间戳 timeStr = (datetime.datetime.now()-datetime.timedelta(hours=6)).strftime("%Y-%m-%d %H") timeStrStamp = int(time.mktime(time.strptime(timeStr,"%Y-%m-%d %H"))*1000) #配置日志转储的终止时间点,转换成时间戳 timeEnd = (datetime.datetime.now()-datetime.timedelta(hours=5)).strftime("%Y-%m-%d %H") timeSEndStamp= int(time.mktime(time.strptime(timeEnd,"%Y-%m-%d %H"))*1000) #CDN日志记录查询接口参数字段,显示数量为 pageSize* pageNumber pageSize = 5000 pageNumber = 1 #https请求加上verify=False忽略SSL验证后会出现警告,使用以下代码忽略警告 requests.packages.urllib3.disable_warnings() #queryDate 日志的产日日期,用于日志存储路径使用 queryDate = (datetime.datetime.now()-datetime.timedelta(hours=6)).strftime("%Y-%m-%d") #使用start函数 start(context, queryDate, timeStamp, pageSize, pageNumber,timeStrStamp,timeSEndStamp) #定义start函数,进行日志记录查询 def start(context, queryDate, timeStamp, pageSize, pageNumber,timeStrStamp,timeSEndStamp): #引用context的logger方法 logger = context.getLogger() #引用context的中用户参数(新建函数后配置的参数),引用url,domain_name logUrl = context.getUserData('url') domainName = context.getUserData('domain_name') #request的请求参数 params = {'query_date': timeStamp, 'domain_name': domainName, 'page_size': pageSize, 'page_number': pageNumber, 'enterprise_project_id':'ALL'} #request的请求头 headers = {'Content-Type': 'application/json;charset=UTF-8', 'X-Auth-Token': context.getToken()} #发起日志记录接口的请求, res = requests.get(logUrl, params=params, headers=headers, verify=False) # 请求状态码判断,若非200,打印响应信息 if res.status_code != 200: logger.info("query log urls: " + res.url + ", error: " + res.text) return ("query log urls: " + res.url + ", error: " + res.text) #创建res.text的python对象 resJson = json.loads(res.text) #打印res.text的内容 logger.info(res.text) #将响应信息中的total的值赋予total total = resJson['total'] #定义变量i ,用于循环计数 i = 0 #从resjson logs值中循环取值 for val in resJson['logs']: i += 1 #打印 val中的link的值 logger.info(val["link"]) #val中的start_time的值赋予start_time start_time = val["start_time"] #取时间段内日志记录 if int(start_time) >= timeStrStamp and int(start_time) timeSEndStamp: # link分为6个部分,协议、位置、路径、参数、查询、片段。 url = urlparse(val["link"]) # 将url 中的请求地址根据“:”进行分片 netlocs = url.netloc.split(":") # 创建连接 conn = httplib.HTTPConnection(netlocs[0], int(netlocs[1])) conn.request('GET', url.path + "?" + url.query) # CDN日志,OBS的存储路径 objName = os.path.join(val["domain_name"], queryDate, val["name"]) #使用 put_content_to_obs函数 put_content_to_obs(context, objName, conn.getresponse()) else: continue # 判断转储的日志量与total对比;不满足则重新执行start函数 if i > total: start(context, queryDate, timeStamp, pageSize, pageNumber + 1,timeStrStamp,timeSEndStamp) #定义put_content_to_obs函数,上传日志到OBS def put_content_to_obs(context, objName, content): #引用context中的方法获取ak,sk ak = context.getAccessKey() sk = context.getSecretKey() #引用context中的用户定义变量obsAddress,destBucket obsAddress = context.getUserData('obsAddress') destBucket = context.getUserData('destBucket') #创建OBS上传实例 TestObs = ObsClient(access_key_id=ak, secret_access_key=sk, is_secure=secure, server=obsAddress, signature=signature, path_style=path_style, region=region, ssl_verify=False, port=port, max_retry_count=5, timeout=20) #上传日志 resp = TestObs.putContent(destBucket, objName, content=content) #判断执行结果 if resp.status 300: print('requestId:', resp.requestId) else: print('errorCode:', resp.errorCode) print('errorMessage:', resp.errorMessage) ``` # 5.Demo代码说明 ## 5.1 注释说明 ```python #CDN日志记录查询接口的起始时间,转换成时间戳;当前为近6个小时的日志记录 timer = (datetime.datetime.now()-datetime.timedelta(hours=6)).strftime("%Y-%m-%d %H") timeStamp = int(time.mktime(time.strptime(timer,"%Y-%m-%d %H"))*1000) #配置日志转储的起始时间点,转换成时间戳 timeStr = (datetime.datetime.now()-datetime.timedelta(hours=6)).strftime("%Y-%m-%d %H") timeStrStamp = int(time.mktime(time.strptime(timeStr,"%Y-%m-%d %H"))*1000) #配置日志转储的终止时间点,转换成时间戳 timeEnd = (datetime.datetime.now()-datetime.timedelta(hours=5)).strftime("%Y-%m-%d %H") timeSEndStamp= int(time.mktime(time.strptime(timeEnd,"%Y-%m-%d %H"))*1000) ``` **示例说明:** 假设代码执行时间为 2021-12-30 20:30 日志记录查询接口的查询时间为 timestamp=2021-12-30 14:00 至 2021-12-30 20:30 由于CDN的日志生成时间延迟6小时,则 2021-12-30 14:00 至 2021-12-30 20:30 的时间内只有2021-12-30 14:00 的日志文件生成。 由于设置触发器每小时触发一次,即可每小时上传一次最新生成的日志,实现增量上传。 ## 5.2 Context说明 | 方法名 | 方法说明 | |:---|:---| | getRequestID() | 获取请求ID。 | | getRemainingTimeInMilliSeconds () | 获取函数剩余运行时间。 | | getAccessKey() | 获取用户委托的AccessKey(有效期24小时),使用该方法需要给函数配置委托。 | | getSecretKey() | 获取用户委托的SecretKey(有效期24小时),使用该方法需要给函数配置委托。 | | getUserData(string key) | 通过key获取用户通过环境变量传入的值。 | | getFunctionName() | 获取函数名称。 | | getRunningTimeInSeconds () | 获取函数超时时间。 | | getVersion() | 获取函数的版本。 | | getMemorySize() | 分配的内存。 | | getCPUNumber() | 获取函数占用的CPU资源,单位为millicore(1 core=1000 millicores)。取值与MemorySize成比例,默认是128M内存占0.1个核(100 millicores),函数占用的CPU为基础CPU:200 millicores,再加上内存按比例占用的CPU,计算方法:内存/128 * 100 + 200。 | | getProjectID() | 获取projectID。 | | getPackage() | 获取函数组。 | | getToken() | 获取用户委托的token(有效期24小时),使用该方法需要给函数配置委托。 | | getLogger() | 获取context提供的logger方法,返回一个日志输出类,通过使用其info方法按“时间-请求ID-输出内容”的格式输出日志。如调用info方法输出日志:logg = context.getLogger() logg.info("hello") | # 6.实测结果 - FunctionGraph函数界面,点击测试按钮。查看执行结果以及转储到OBS中的日志。 **a.FunctionGraph 函数界面**  **b.OBS界面查看日志** 
-
1.dwscontroller后台数据库rms 请参考数据库登录2.执行如下sql语句获取obsUser,ak,sk信息select obsUser,ak,sk FROM rds_obs_info;sk 进行解密解密请参考 加密密文解密: https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=170251
-
假设名称为15的文件夹里有多张图片,想清空此文件夹并且删除它,在nodejs里面应该怎么搞?试了一下用这个方法 ,但是它只能删文件,不能删文件夹 obsClient.deleteObject( { Bucket, Key: filename, },
-
项目:茅台需求:第三方系统需要调用ABC cube的上传文件的后端接口进行文件上传的操作;文档中,通过调用AppCube的Rest接口实现与OBS的对接。将action设置为putobject文件上传失败https://support.huawei.com/bescloud/BES%20Cloud%20Open%20Platform/1.2/topic/view.do?projectid=bes_cloud_platform_zh&lang=zh&pidid=pid_129668509270112493999&topicid=ZH-CN_TOPIC_0000001145287835请求地址:https://studio.e.huawei.com/u-route/baas/sys/v1.0/connectors/003W000000hTvtW4Nugi/action请问想第三方系统调用该接口去进行文件上传,该如何设置参数?
-
请问除了拿到流的方式下载,怎么获取到http方式url地址下载?
-
>摘要:本文是我们对clickhouse做了最简单的支持obs的适配改造。 本文分享自华为云社区[《clickhouse存算分离在华为云实践》](https://bbs.huaweicloud.com/blogs/303532?utm_source=zhihu&utm_medium=bbs-ex&utm_campaign=ei&utm_content=content),作者: he lifu。 clickhouse是一款非常优秀的OLAP数据库系统,2016年刚开源的时候就因为卓越的性能表现得到大家的关注,而近两年国内互联网公司的大规模应用和推广,使得它在业内声名鹊起,且受到了大家一致的认可。 从网络上公开分享的资料和客户使用的案例总结来看,clickhouse主要是应用在**实时数仓**和**离线加速**两个场景,其中有些实时业务为了追求极致的性能会上全SSD的配置,考虑到实时数据集的有限规模,这种成本尚能够接受,但是对于离线加速的业务,数据集普遍会很大,这个时候上全SSD配置的成本就会显得昂贵了,有没有办法既能满足较高的性能又能把成本控制的尽量低?我们的想法是弹性伸缩,把数据存储到低廉的对象存储上面,通过动态增加计算资源的方式满足高频时段的高性能需求,通过回收计算资源的方式控制低频时段的成本,所以我们把目标放在了存算分离这个特性上。 # 一.存算分离现状 clickhouse是存算一体的数据库系统,数据是直接落在本地磁盘上(包括云硬盘),关注社区动态的读者已经知道最新的版本可以支持数据持久化到对象存储和HDFS上了,以下是我们对clickhouse做了最简单的支持obs的适配改造,和原生的支持S3一样: ### 1.配置S3磁盘  ### 2.创建表并灌入数据  ### 3.检查本地盘数据  ### 4.检查对象存储数据  从上面几个图片来看, 可以发现本地磁盘上的数据文件内容记录了obs上的文件名(uuid),也就是说clickhouse和obs对象之间是通过本地数据文件中的“映射”关系关联起来的,注意这个“映射”关系是持久化在本地的,意味着需要冗余以满足可靠性。 然后进一步,我们看到社区也在努力把clickhouse往存算分离的方向推进: - v21.3版本引入的Add the ability to backup/restore metadata files for DiskS3,允许把本地数据文件到obs对象的映射关系、本地数据的目录结构等属性,放到obs对象的属性里(object的metadata),这样解耦了数据目录必须在本地的限制,也解除了维持映射关系的本地文件可靠性而至少双副本的条件; - v21.4版本引入的S3 zero copy replication,使得多个副本间可以共享一份远端数据,显著的降低了存算一体引擎多副本存储的开销。 但事实上,通过验证测试可以发现当前阶段存算分离距离可以上生产还有很长路要走,比如:atomic库下的表怎么搬到对象存储上(表定义sql文件中标识唯一性的UUID和数据目录UUID的对应关系)、弹性扩缩容时候如何快速有效均衡数据(拷贝数据会极大拉长操作窗口)、修改本地磁盘文件和远端对象如何保障一致性、节点宕机如何快速恢复等等棘手的问题。 # 二.我们的实践 在云原生的时代,存算分离是趋势也是我们的工作方向,接下来的讨论将围绕华为公有云对象存储obs来展开。 ### 1.引入文件语义 这里需要重点强调下华为云对象存储obs和其他竞品的最大差异化点:**obs支持文件语义,支持文件和文件夹的rename操作**。这点对于我们在接下来的系统设计和弹性伸缩实现上非常有价值,所以我们把obs的驱动集成进了clickhouse,然后修改了clickhouse的逻辑,这样数据在obs上长的和本地一模一样了: Local Disk:  OBS:  有了完整的数据目录结构后,再支持merge、detach、attach、mutate以及part回收等操作就比较方便了。 ### 2.离线场景 From bottom to top,我们再来看系统结构,离线加速场景中去除了对zookeeper的依赖,每个shard一个replica:  然后是扩缩容节点时候的数据均衡功能,通过obs的rename操作完成对part级别的低成本移动(和clickhouse copier工具的数据重新分发均衡不一样),节点宕机后新节点从对象存储侧构造出本地数据文件目录。 ### 3.融合场景 ok,在上面离线场景的基础上我们继续融入实时场景(下图中的“实时集群”部分),不同业务的clickhouse集群,可以通过冷热分离分层存储的方式(这一功能相对比较成熟,业内普遍采用它来降低存储成本),把冷数据从实时集群里淘汰出来,再通过obs rename操作挂载到“离线集群”中,这样我们可以覆盖数据从实时到离线的完整的生命周期(包括从hive到clickhouse的ETL过程):  # 三.未来的展望 前面的实践是我们在存算分离方向的第一次尝试,还在不断的改进优化中,从宏观的角度来看仍旧是把obs作为拉远了的磁盘来使用,不过感谢obs的高吞吐,相同计算资源的前提下SSD和obs跑Star Schema Benchmark的性能延迟在5x左右,但是存储成本得到了显著的降低10x。未来,我们会在前面工作的基础上,去除obs作为拉远磁盘的属性,把单个表的数据统一在一个数据目录下,收编clickhouse的元数据,把它做成无状态的计算节点,达到sql on hadoop的效果,类似impala一样的MPP数据库。
-
您好,如题,断点续传支持的文件类型是本地文件路径,我们调用时,前端上传会是MultipartFile文件类型,需要读取文件内容转成file才能实现,这会背离断点续传初衷(失败后从断点开始上传),请问有更合适的方法实现吗?参考文档断点续传上传_对象存储服务 OBS_SDK参考_Java_上传对象_华为云 (huaweicloud.com)
-
您好,我使用java断点续传接口时,将服务关闭让上传失败后再次调用上传接口时发现上传进度又是从0开始了,请问这个续传应该怎么实现从失败的进度继续?参考的断点续传上传_对象存储服务 OBS_SDK参考_Java_上传对象_华为云 (huaweicloud.com)
-
官网下载的版本是OBSBrowserPlus-win64,不支持win server2012的操作系统,现在应该下载哪个版本的呢,急用,可电话联系18549921504
-
官网下载的版本是OBSBrowserPlus-win64,不支持win server2012的操作系统,现在应该下载哪个版本的呢,急用,可电话联系18549921504
-
感谢华为云团队给的这次学习的机会,我有幸参加了华为云HCIA-Cloud Service职业认证训练营活动。在本次活动中,认识了许多的小伙伴,也得到了班主任小助手的各种帮助,也感谢老师在课程中的精彩演讲。通过本次课程中我学习了通过HCIA-Cloud Service认证,将证明您掌握云服务概念和价值,华为云服务架构和生态,华为云计算服务、存储服务、网络服务、安全服务、管理与监控、关系型数据库、CDN&云视频服务和创新应用服务的管理和应用,具备使用各类云服务产品进行应用部署和维护的能力,可以助力企业实现ICT环境的云转型。我比较感兴趣的是对象存储。它具有数据稳定,业务可靠:OBS支撑华为手机云相册,数亿用户访问,稳定可靠。通过跨区域复制、AZ之间数据容灾、AZ内设备和数据冗余、存储介质的慢盘/坏道检测等技术方案,保障数据持久性高达99.9999999999%,业务连续性高达99.995%,远高于传统架构。还具有多重防护,授权管理:OBS通过可信云认证,让数据安全放心。支持多版本控制、敏感操作保护、服务端加密、防盗链、VPC网络隔离、访问日志审计以及细粒度的权限控制,保障数据安全可信。还具有千亿对象,千万并发:OBS通过智能调度和响应,优化数据访问路径,并结合事件通知、传输加速、大数据垂直优化等,为各场景下用户的千亿对象提供千万级并发、超高带宽、稳定低时延的数据访问体验。与此同时,他具备简单易用,便于管理:OBS支持标准REST API、多版本SDK和数据迁移工具,让业务快速上云。无需事先规划存储容量,存储资源和性能可线性无限扩展,不用担心存储资源扩容、缩容问题。OBS支持在线升级、在线扩容,升级扩容由华为云实施,客户无感知。同时提供全新的POSIX语言系统,应用接入更简便的优势。
jerryxiaofei
发表于2021-11-27 22:38:34
2021-11-27 22:38:34
最后回复
jerryxiaofei
2021-11-27 22:38:34
1056 0 -
# 场景描述 大文件的文本数据(好几个G),上传至OBS,通过CDM迁移,转换成拥有指定分割符和换行符的文本数据。# 故障现象 ### 现存文本数据的每一行数据后面,都有分隔符及换行符。而目标文本数据需要每行数据的后面没有分隔符只有换行符。# 解决方案 可以将文本数据上传到OBS,通过CDM迁移至另一个OBS,在迁移设置中更换换行符和分隔符,从而获得一个拥有指定分隔符和换行符的文本数据。# 操作步骤 ### 1、将文件上传至[源]OBS ### 2、开通CDM服务(按需)后,在【表/文件迁移】新建作业,点击源连接旁边的【+】新建连接。 其中:AK和SK可在华为云右上方【我的凭证】生成。 ( https://console.huaweicloud.com/iam/?region=cn-north-4#/mine/accessKey ) ### 3、配置连接源后新建作业,选择上面 上传至[源]OBS的文件,如下配置换行符和字段分隔符。 ### 4、配置好后运行作业,此时源OBS中的文件已迁移至目标OBS,文件也按配置做了转换。可下载迁移转换好的文件进行查看。  # 参考知识 1、CMD产品: https://www.huaweicloud.com/product/cdm.html 2、OBS产品: https://www.huaweicloud.com/product/obs.html
-
因为项目需要,appcube会安装到客户的本地环境,项目中需要用到文件存储功能,所以考虑使用华为云obs,但是不清楚线下部署的appcube,能否使用华为云的obs服务,是否有相关成功的案例,希望能给个方案
-
以下为个人整理总结,供大家参考讨论~块存储: 块存储是直接操作盘,通常将数据拆分成数据块,然后对盘进行直接的读写。块存储中检索方式就是利用地址。在块存储层面,使用者往往不感知数据的组织方式以及结构,仅仅使用最粗暴的方式将数据进行存储:即将数据按照固定的大小分块,每个块通过逻辑块编号(LBA,Logical Block Addressing)来进行寻址,通过提供对磁盘直接进行操作的接口来进行数据存储。 文件存储: 文件存储是我们在使用计算机过程中接触最多的存储类型。我们所说的文件或目录都来源于文件存储。如Windows上的NTFS,Linux上的ext4,XFS等。文件存储主要作用是用于对文件数据进行组织和管理。文件存储中的文件的数据包括:元数据和数据。数据是文件的实体内容;而文件元数据是指用于管理该文件的一些信息数据,如文件大小,名字和属性等。从功能上看,文件存储单纯的是一套管理软件。从层次上看,文件存储一般基于块存储之上。 文件和目录组成了一颗庞大的文件树,文件作为树的叶子节点。在Windows下,我们可以通过鼠标点击的方式一层一层的打开一个文件所在的路径;在Linux下,我们可以通过tree命令来查看某个目录下的子目录树。在文件存储中,访问文件采用路径方式进行交互式访问,也可以通过标准的文件系统接口进行访问。 对象存储: 对象存储将数据以一个独立的对象的方式进行存储。一个pdf文件,一个视频或其他任意类型的文件都是一个对象。在对象存储中,没有文件系统中的层次结构。对象存储中引入桶的概念,所有的对象存储在各个桶中,整体采用扁平化的方式进行管理。每个桶里的对象都是唯一的,通过对象名进行索引。在对象存储中,访问对象通常采用API方式进行访问。
-
上传的文本文件 “abcdefghijklmnopqrstuvwxyz0123456789”上传完成后报上面的错误 Error transferring http://s********ev.obs.cn-north-1.myhuaweicloud.com/20211101220513870 - server replied: Illegal character CNTL=0x15
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签