亚马逊AWS官方博客

Category: 大咖专栏

Amazon CloudWatch Events监控您应用的安全

每个应用程序时刻都在产生事件,Amazon CloudWatch Events能帮助您针对应用的事件进行有针对性的响应和处理,及时响应,并处理错误事件,存储和分析潜在的告警信息。在接下来的篇幅里,我将利用AWS的CloudWatch Events,Lambda,SNS,SQS等服务向您展示如何及时分析与处理应用事件。 在这个场景中,我将应用事件划分分三个等级(当然,在您的具体业务场景中,您可以根据实际情况划分任意多的等级),Green,Yellow,Red。Green代表应用正常,您不需要进行任何动作。Yellow表示您应用的健康检查失败,通过Lambda来处理该类型事件。Red表示您的应用在至少一台服务器上已经失败,立即通知运维部门处理。 以下是该场景中的架构示意图: 1. 最左边为您的应用服务器群,他们将各自的事件发送给CloudWatch Events; 2. 在CloudWatch Events中设置Rule来进行区分,并将对应的事件发送相应的目标,如Lambda,SNS,SQS; 3. 目标在收到事件后进行相应的处理; 具体步骤: 1.   创建3个目标,Lambda,SNS,SQS; 1.1, 目标1,创建Lambda函数,SampleAppDebugger; 1.2, 目标2,创建SNS主题,RedHealthNotifier; 1.3, 目标3,创建SQS消息队列,ReportInspectionQueue;   2.   创建CloudWatch Events Rule 2.1, 将以下内容保存为YellowPattern.json; 2.2, 使用以下命令创建名为myCustomHealthStatusYellow的规则; 2.3, 使用以下命令创建目标; 2.4, CloudWatch Event需要将事件发送给Lambda,所以需要给Lambda添加适当权限允许CloudWatch这么做; 3.   重复上面的步骤创建第2条规则,并设置目标为SQS和SNS,特别注意,不要忘记给SNS,SQS设置相应权限以允许CloudWatch发送事件过来; 3.1, 使用以下命令创建名为myCustomHealthStatusRed的规则,这里的RedPattern.json文件其实是将2.1步骤中的YellowPattern.json是一样的,只是将内容中的Yellow替换成了Red; 3.2, 创建两个目标,SQS,SNS; 3.3, 添加权限允许CloudWatch Events发送事件; 其他SNS,SQS权限设置相关,请参考该官方链接:http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/events/resource-based-policies-cwe.html#sns-permissions 4.   进行测试,手动放入一些Red事件(我设置了个小脚本,每次运行都会放入61个事件),看看SQS及SNS情况; 这里我运行了三次脚本,所以SQS中有183条消息 看看邮箱中是否会收到邮件 5.   测试Yellow事件及Lambda反应; Lambda被触发的次数 作者介绍: […]

Read More

使用Oracle Data Pump将数据库迁移到AWS的RDS Oracle数据库

1.Oracle数据库的迁移方法 如何将Oracle数据库从数据中心迁移到AWS云上是DBA经常遇到的问题,迁移Oracle数据库有多种方式: (1)使用AWS DMS服务迁移 (2)使用Oracle SQL Developer迁移 (3)使用Oracle Data Pump迁移 (4)使用Oracle Export/Import迁移 (5)使用Oracle SQL Loader迁移 如果需要了解不同的迁移方法,可以参考 博客《Oracle数据库迁移到AWS云的方案》 。 2.使用Oracle Data Pump迁移 本文主要讨论使用Oracle Data Pump将Oracle数据库迁移到RDS数据库。示例数据库的信息如图。   下面是模拟在数据中心的Oracle11g源数据库中创建用户和表,并将源数据库迁移到AWS云中RDS Oracle 11g数据库的全过程。 步骤一:初始化源数据库并使用Data Pump导出 (1)使用SQL Plus登录源Oracle数据库 sqlplus / as sysdba (2)创建用户test create user test identified by welcome1; (3)为新创建用户grant权限(实际使用请给用户grant合适的权限) grant dba to test; (4)为用户test创建表 create table test.aa(id varchar(20) not null […]

Read More

使用AWS的数据库迁移DMS服务

前面博客《Oracle数据库迁移到AWS云的方案》介绍了AWS数据库迁移的几种基本方法,本文主要介绍如何使用AWS的DMS服务完成数据库的迁移。 1.DMS服务介绍 为了使用户更容易的将数据库迁移到云中,AWS已经在海外区域推出了AWS Database Migration Service服务,如果您的数据库在海外,DMS可以在源数据库不停机的情况下,帮您将数据迁移到AWS云中。DMS的功能非常强大,支持同构数据库的迁移(如Oracle迁移到Oracle),也支持异构数据库直接的迁移,如Oracle到Mysql等)。在数据库迁移期间,源数据库无需停机,并且能将迁移期间数据的更改持续复制到目标数据库。因此迁移完成后,您只需在短暂的停机时间内直接切换数据库,从而保证业务数据的完整性。 在中国BJS区域,还没有推出DMS服务,但是提供了Database Migration Tool(DMT)工具,您可以使用DMT工具来完成数据库迁移。 2.使用DMS完成迁移 使用DMS服务必须确保源或目标数据库有一个在AWS云中。 使用DMS服务的步骤如下: 步骤一:Create migration 登陆AWS全球区域的Console,选择DMS,点击“Create migration”,我们便来到了“welcome”界面,从该界面我们可以看到,通过DMS进行数据迁移我们至少需要一个源数据库、目标数据库和复制实例。当然,DMS 也支持多个源数据库向一个目标数据库的迁移以及单个源数据库向多个目标数据库的迁移。迁移时,数据通过一个运行在复制实例上的任务将源数据库复制到目标数据库。点击“Next”进行复制实例的创建。 步骤二:创建“Replication Instance” 您在进行数据库迁移过程中的第一个任务是创建具有足够存储空间和处理能力的复制实例,通过复制实例来执行您分配的任务并将数据从您的源数据库迁移到目标数据库。此实例所需的大小取决于您要迁移的数据和您需要执行的任务量。具体配置参数见下表1。 如果您需要为网络和加密设置值,请选择高级选项卡。具体参数见表2。 步骤三:创建数据库连接 当您在创建复制实例时,您可以指定源和目标数据库。源数据库和目标数据库可以在AWS的EC2上,也可以是AWS的关系数据库服务(RDS)的DB实例或者本地数据库。在设置源和目标数据库时,             具体参数可以参见表3。您也可以通过高级选项卡来设置连接字符串和加密密钥的值。 等图示上部分的显示变成”Replication instance created successfully”并且“Run test“按钮变成正常,然后测试,确保测试结果为”Connection tested Successfully”,由于需要从AWS服务端连接测试数据库,因此需要设置好security group,设置的security group必须确保复制实例能够访问源和目标数据库。需要的话,可以短暂的将security group 1521 的访问设置为 0.0.0.0/0,测试成功后,点击”Next”按钮。 步骤四:创建“task” 当源数据库和目标数据库建立连接后,您需要创建一个任务来指定哪些表需要迁移,使用目标架构来映射数据并且在目标数据库中创建新表。作为创建任务的一部分,您可以选择迁移类型:迁移现有数据、迁移现有数据并复制正在进行的更改,或只复制更改的数据。 如果选择”Migrate existing data and replicate data changes”选项需要打开Task Settings 中的supplemental loging开关。在Table Mapping中Schema to Migrate选择“Oracle”,点击“Create Task”。 当您创建的task状态从creating变为ready的时候,您的task便创建好了。点击该“task”并点击上方的“Start/Resume”,您数据迁移任务便开始了! 数据库迁移完成后,目标数据库在您选择的时间段内仍会与源数据库保持同步,使您能够在方便的时候切换数据库。 3.总结 […]

Read More

Oracle数据库迁移到AWS云的方案

当前云已经成为常态,越来越多的企业希望使用云来增加基础设施的弹性、减轻基础设施的维护压力,运维的成本等。很多企业使用云碰到的难题之一是如何将现有的应用迁移到云上,将现有应用的中间件系统、Web系统及其他组件迁移到云上相对容易,一般只需要重新部署或复制即可,但如何将数据库迁移到AWS云中,是很多企业需要面对的一个难题。由于数据库的种类繁多,本文将以Oracle数据库为例,介绍将数据中心的Oracle迁移到云中的基本知识,不同方法涉及的迁移过程,请参考后续的博客。 1.云中数据库的模式 如果要在云中使用Oracle数据库,有两种选择: EC2服务器模式 使用AWS的EC2服务器,在EC2服务器上手工安装Oracle数据库软件,用户需要自己准备Oracle的License,这和用户自己在机房安装Oracle数据库类似。如果在中国以外的区域,用户也可以使用AWS Marketplace里面的不同版本的Oracle镜像,直接初始化Oracle数据库,这种情况你也需要自己准备Oracle的License。 RDS模式 Amazon Relational Database Service (Amazon RDS) 是一种 AWS提供的Web 服务,可以让我们更轻松地在云中设置、 操作和扩展关系数据库,减少管理关系型数据库复杂的管理任务。RDS包括了Oracel、SQL Server、My SQL,等多种数据库引擎,你可以根据需要选择数据库的类型。 根据我们使用模式的不同,能选择的迁移方式也不同。 2.逻辑迁移和物理迁移 数据库的迁移可以分为逻辑迁移和物理迁移两种方式: 逻辑迁移 逻辑迁移一般只是迁移数据库表、视图及其它数据库对象,不要求源库和目标库在底层的存储及表空间完全一致。逻辑迁移适用于EC2服务器模式和RDS模式。 逻辑迁移一般使用Dump/Load+Log Apply的方式,使用Dump工具将数据库对象从源数据库导出,然后Load到目标数据库,最后根据需要同步数据库日志。 物理迁移 物理迁移可以让迁移的源库和目标库在底层的存储文件、存储介质、表空间、用户等信息完全一致。物理迁移适用于EC2服务器模式。 物理迁移(Oracle)一般是使用RMan等物理备份+Log Apply的方式,使用RMan等工具备份数据库,然后在目标系统还原数据库,最后根据需要同步日志。 3.日志同步 在迁移数据库过程中,如果我们的业务有足够停机时间,可以将源数据库设置成只读数据库,然后使用Dump/Load或者备份/还原的方式来创建目标库。因为源库是只读的,迁移过程中源库不会发生变化,因此只需要根据源库数据创建目标库,无需日志的同步。 在迁移数据库过程中,如果我们的业务没有足够的停机时间,此时除了要使用Dump/Load或备份还原的方式迁移已有数据,还需要将迁移过程中变化的数据同步到目标数据库,此时需要日志同步的工具。 4.Oracle数据库同步的方法 将Oracle数据库迁移到AWS云中主要有下面几种方法: 迁移Oracle数据库有多种方式,本文主要介绍以下五种,这五种方式都是逻辑迁移: (1)使用AWS DMS服务迁移 AWS在中国以外的区域提供了数据库迁移DMS服务,支持同构和异构数据库间的迁移,也支持日志的同步。在中国区可以使用AWS提供的DMT(Database Migration Tool)工具完成同构或异构数据库间的迁移。 DMS适合于迁移中小型的数据库。 (2)使用Oracle SQL Developer迁移 Oracle提供的SQL Developer工具里面提供了迁移功能,适合于迁移数据较少的数据库。SQL Developer可以在Oracle的官网里免费下载。 (3)使用Oracle Data Pump迁移 使用Oracle Data Pump工具将数据库导出,复制数据到目标平台,最后使用Data Pump将数据导入到目标数据库。数据量较大或数据少的库都可以使用这种方式。 […]

Read More

手把手教你使用Amazon EMR进行交互式数据查询

本文将带您一步步完成一个利用Amazon EMR进行交互式数据查询的实例,过程包括数据的注入、数据的分析、结果的转存、以及将整个过程自动化的方法。其中涉及的EMR组件主要包括: Hive, Hadoop, presto, sqoop。除EMR外,涉及到的其他服务包括:S3, RDS. 本文所使用的数据源是cloudfront产生的日志。 在按照本文档进行操作之前,读者需了解S3,RDS并能够进行基本的S3,RDS的操作,读者需了解EMR的基本概念。以下是参考资料: 什么是EMR: Amazon Elastic MapReduce (Amazon EMR) 是一种托管数据分析服务的框架,提升企业、研究人员、数据分析师和开发人员轻松、经济高效掌控海量数据的能力。其当前版本中托管的服务包括:Hadoop, Zeppelin, Tez, Ganglia, HBase, Pig, Hive, Presto, ZooKeeper, Sqoop, Mahout, Hue, Phoenix, Oozie, Spark, Hcatalog. EMR让您专注于数据分析,无需担心费时的集群设置、管理或调整,也无需担心所需要的计算能力。 具体参考: https://aws.amazon.com/cn/documentation/elastic-mapreduce/ 什么是S3: Amazon Simple Storage Service (Amazon S3) 为开发人员和 IT 团队提供安全、耐用且高度可扩展的对象存储。S3 可为EMR提供文件存储服务。 具体参考:https://aws.amazon.com/cn/documentation/s3/ 什么是RDS: Amazon Relational Database Service (Amazon RDS) 是一种可让用户在云中轻松设置、操作和扩展关系数据库的 Web […]

Read More

手把手教你如何用Lambda + Alexa调用echo设备

知识补充: 什么是AWS Lambda? AWS Lambda在可用性高的计算基础设施上运行您的代码,执行计算资源的所有管理工作,其中包括服务器和操作系统维护、容量预置和自动扩展、代码监控和记录,只在需要时执行您的代码并自动缩放,从每天几个请求到每秒数千个请求,其提供了AWS基础设施的高可用性,高安全性,高功能性和高可扩展性。 具体可参考: https://docs.aws.amazon.com/zh_cn/lambda/latest/dg/welcome.html 什么是Alexa Skills Kit? Alexa是Echo内置的语音助手,通过它能够唤醒Echo。Alexa的优点在于,它基于云端,因此我们可以随时对其进行改进。Alexa Skills Kit (ASK)是一个由自服务API、工具、文件和实例代码的集合,可轻松构建你自定义的Alexa skills,然后发布。 具体可参考: https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit 1. 打开链接https://aws.amazon.com/,申请亚马逊AWS账号。登录控制台,选择AWS Lambda服务,创建Lambda Function。 2. 选择Alexa Skills Kit 3. 下载需要用到的代码,解压,打开index.js文件,修改文件中的开发者账号ID,如下: https://s3.cn-north-1.amazonaws.com.cn/bjsdemo/LambdaAlexaSkillsKit/RecipeTemplate.zip 修改完成之后,然后打成Zip包上传(注意,这里的打包不需要文件夹,直接把.js文件打包成RecipeTemplate.zip) 接着点击“Create function” 到这里,Lambda 创建成功。 4. 进入https://developer.amazon.com/,创建Alexa Skills Kit。 选择ALEXA 5. 选择“Alexa Skills Kit” 6. 点击“Add a new Skill” 7. 填写Name: Solution Helper,Invocation Name: solution helper 8. […]

Read More

AWS Kinesis的Javascript交互方法

一.介绍 Amazon Kinesis 是一种托管的弹性可扩展服务,能实时处理大规模的流数据。在该服务收集大数据记录流后,可用多种数据处理应用程序实时处理该数据流。Amazon Kinesis Streams 每小时可从数十万种来源中连续捕获和存储数 TB 数据,如网站点击流、财务交易、社交媒体源、IT 日志和定位追踪事件。Amazon Kinesis Streams 数据流的吞吐量每小时可从数 MB 扩展到数 TB,PUT 记录每秒钟可从数千次扩展到数百万。您可以随时根据您的输入数据量动态调节数据流的吞吐量。 AWS为旗下的服务提供了多种开发工具包,支持包括Java、PHP、Python、Ruby、浏览器端等语言或平台。对于Amazon Kinesis,我们除了使用上述的Stream API进行开发外,AWS还提供了Amazon Kinesis Client Library (KCL) 开发适用于 Amazon Kinesis Streams 的使用器应用程序。在本文当中,我们展示如何使用Javascript在浏览器端与Amazon Kinesis进行交互,包括把记录Put到Kinesis,和从Kinesis读取记录。 二.基本概念与限制 在阐述如何AWS Kinesis的Javascript交互方法前,我们有必要对Kinesis Stream当中的关键概念——“分片”和“数据记录”作初步的了解。 分片 分片Share是流中数据记录的唯一标识组。一个流由一个或多个分片组成,每个分片提供一个固定的容量单位。流的总容量是其分片容量的总和。每个分片对应提供 1 MB/s 的写入容量和 2 MB/s 的读取容量。需要注意的是,每个分片可支持最多1000条记录/s的写入,和5个事务/s的读取。用户需要根据上述的容量和数目的限制,为流添加足够多的分片数目,以满足自身需求。 数据记录 数据记录是存储在 Amazon Kinesis Stream中的数据单位。数据记录由序列号、分区键和数据 Blob 组成。 每个数据记录都有一个唯一的序列号。当应用程序对Amazon Kinesis Stream进行写入记录时,Streams将自动为其分配序列号。同一分区键的序列号通常会随时间变化增加;写入请求之间的时间段越长,序列号则越大。但需要注意的是,序列号不能用作相同流中的数据集的索引。用户如果需要在逻辑上分隔数据集,请使用分区键或为每个数据集创建单独的流。 分区键Partition Key用于按分片对流中的数据进行分组。Streams 服务使用与每条数据记录关联的分区键将属于流的数据记录分为多个分片,以便确定给定的数据记录所属的分片。分区键是最大长度限制为 […]

Read More

算法改变世界 - 从Prisma 的走红说开去

假设你是一个摄影爱好者,估计最近这几天应该正忙着用一款热门的手机App去修图并晒到朋友圈里面。原因很简单,用这款软件提供的滤镜处理过的照片看起来更像是个艺术品,而不是那种常见的苍白的脸蛋和色彩失真的风景。这款爆红的程度可媲美Pokémon Go 的App的名字叫做Prisma。对于这个现象级的App,一个笑话是这样说的,“全球有一半的人正在用Pokémon GO抓皮卡丘玩,另一半的人则用Prisma在修图”。 6月24日,俄罗斯总理梅德韦杰夫在自己拥有230万粉丝的Instagram上传了一张莫斯科风景照,解说文字是“滤镜里的莫斯科”。这张照片使用了Prisma的其中一款滤镜,让整张照片呈现出浓郁的铅笔画效果,获得了超过7.8万个点赞。 Prisma 面世是在今年的6月11日,是由一个不足9人的名为Prisma Lab的俄罗斯团队在一个半月以内开发出来。一经面世就引起了轰动,在发布短短4天后就成了年轻人的新宠,10个国家的App Store榜首,两周内下载量超过160万。这个数字也创造了一个App下载的新的记录。   包括我在内的许多人喜欢这款应用的原因是因为它所提供的30多款滤镜完全不同于VSCO、Snapseed 以及Instagram 这些成名已久的的软件,经它处理过的图片看起来就像是我们熟悉的毕加索、梵高、爱德华.蒙克的作品,或者是强烈的线条、简洁概括夸张的造型,或者是用色阴暗的紫、绿色调的蚀刻风格,又或者是粗旷而狂野的印象派。总之,一幅色彩暗淡、构图不佳的照片一经处理就变成了大师范的艺术品。这样的软件如何不让像我这样的低级别的摄友痴狂呢。   如果仅仅是几个还算不错的滤镜也难逃昙花一现的结局,就如同曾经大热过许多款软件一样。但是如果你可以了解这些滤镜的来源,恐怕你会和我一样会大吃一惊了。不同与传统的设计出来的滤镜,Prisma 有自己一套独特的方法。当用户上传照片时,Prisma系统会使用基于神经网络的人工智能算法,获取著名绘画大师和主要流派的艺术风格,然后对你的照片进行智能化处理。也就是说,它所提供的每一个滤镜,都是模仿过去伟大艺术家的风格而对你的照片进行智能分析和重绘而产生的。   作为一个程序员,这个励志故事却有着不一样的味道。通常情况下,我们总是习惯于在我们熟悉的领域去捕捉灵感,并将这种灵光乍现的想法都过程序变成一个个具体的应用。但是如果你已经读过上面的故事,你应该也会与我一样蹦出来这样的一个想法,人工智能或许可以可以让我们跳出这样的思维的局限。让我们可以在跟更广阔的领域去发掘新的需求。   为了验证这个想法,我打算复制Prisma 核心算法的实现。当然,这种实现并不是你想像的那么高深莫测。在一篇名为“Neural networks with artistic talent” 的博客文章里面,我大致梳理出来了这个算法的脉络。早在2015年9月在ariV 上面就刊出了德国学者的一篇名为”A Neural Algorithm of Artistic Style“论文。在这片文章里面,了如何使用神经网络学习一副画的绘画风格,并把这种风格用于处理一幅照片使之具有了该种艺术风格。而这篇论文所提出的算法据说所就是Prisma 的核心。 看到这里我想许多人都会产生实现这个算法的冲动。且慢下手,因为有意境找到了一个更简洁的方法。斯坦福大学的Justin Johnson 已经在github 上面为我们提供了一个很好的框架,而基于这个项目的成果实现这个算法就变得轻而易举。 实现这个深度学习的算法需要具备一定的条件,重要的就是计算的性能。而目前解决这个问题的通常思路就是使用GPU来提高处理能力。对于普通程序员来说,我们通常并不具备这一类的资源。但解决问题的思路已经有人给出了。早在2014年2月Netflix 久通过他们的技术博客分享过一篇实现分布式神经网络的文章,文章的题目是“Distributed Neural Networks with GPUs in the AWS Cloud“。 于是我的尝试就从AWS 提供的云计算的环境 。我需要的仅仅是启动一个AWS EC2 的实例,EC2这个服务可以理解为一个托管的虚拟服务器。 Amazon EC2 提供多种经过优化,适用于不同使用案例的实例类型,而适合于深度计算的类型无疑就是G2这个 […]

Read More

手把手教你调校AWS PB级数据仓库

什么是一个好的数据仓库? Redshift是AWS云计算中的一个完全托管的,PB级别规模的数据仓库服务。即使在数据量非常小的时候(比如几百个GB的数据)你就可以开始使用Redshift,Redshift集群可以随着你数据的增加而不断扩容,甚至达到PB级。云计算中数据仓库的优势非常明显,不需要license,不需要预先配置非常大的数据仓库集群,扩容简单,仅仅需要为你实际所使用的数据仓库付费。 Redshift作为一个企业级数据仓库完全支持SQL语法,无学习成本,支持很多种客户端连接,包括各种市场上的BI工具,报表以及数据分析工具。 Redshift的概览 Redshift通过支持大规模并行处理(MPP),列式存储,对不同列数据使用不同数据压缩算法,关系型数据仓库(SQL),灵活的扩容管理等众多优点,兼顾了数仓性能,同时也考虑学习成本及使用成本。 Redshift系统架构及要点 图1,Redshift系统架构图 主节点负责客户端与计算节点之间的所有通讯,编译代码并负责将编译好的代码分发给各个计算节点处理,负责分配数据到不同的计算节点,主节点对客户不可见的,无需客户管理主节点的压力,更重要的是主节点免费。 计算节点是具体的干活的,并处理好的任务送给主节点进行合并后返回给客户端应用程序。每个计算节点都有自己独立的CPU,内存以及直连存储。Redshift集群规模大小通常就是指计算节点的个数以及计算节点机器类型。 节点分片是指将计算节点被分成若干的分片,根据计算节点类型不同,每个节点包含的分片数量不同,通常1个vCPU对应一个分片,ds2的机型除外。每个分片都会分配独立的内存及存储资源,接受来自主节点分配的任务。分片跟另外一个重要概念Dist Key紧密相关, 这里先提一下,接下来会具体介绍Dist Key。 排序键(Sort Key)是一个顺序键,即Redshift会根据这个键来将数据按顺序存储在硬盘上。Redshift的查询优化程序(只要理解有这么个东西存在就好,客户不需要任何维护,对客户也是透明的)也会根据这个排序来进行执行查询优化计划。这是Redshift性能调优的一个非常重要的参数。 分配键(Distribution Key)是控制加载到表的数据如何分布在各个计算节点的一个键,有好几种分布的风格,接下来会重点讲到,这是Redshift调优的非常重要的另外一个参数。 Redshift的几个常用最佳实践 选择最佳排序键 如果最近使用的数据查询频率最高,则指定时间戳列作为排序键的第一列; 如果您经常对某列进行范围筛选或相等性筛选,则指定该列作为排序键; 如果您频繁联接表,则指定联接列作为排序键和分配键; 熟悉Redshift的朋友可能知道可以指定多列作为排序键,而且排序键还有两种方式,组合式和交叉式。限于篇幅的原因,在接下来的调优测试中我们采用的是某一列作为排序键,如果有对其他排序键风格感兴趣的朋友,可以单独联系我们进行讨论。 选择最佳分配键 选择表分配方式的目的是通过在执行查询前将数据放在需要的位置来最大程度地减小重新分配步骤的影响,最好这个查询不需要二次移动数据。 分配键有三种风格,均匀分布(Even),键分布(Key),全分布(All),默认是均匀分布。 根据共同列分配事实数据表和一个维度表; 事实数据表只能有一个分配键。任何通过其他键联接的表都不能与事实数据表并置。根据联接频率和联接行的大小选择一个要并置的维度。将维度表的主键和事实数据表对应的外键指定为 DISTKEY。 根据筛选的数据集的大小选择最大的维度; 只有用于联接的行需要分配,因此需要考虑筛选后的数据集的大小,而不是表的大小。 在筛选结果集中选择基数高的列; 例如,如果您在日期列上分配了一个销售表,您可能获得非常均匀的数据分配,除非您的大多数销售都是季节性的。但是,如果您通常使用范围受限谓词进行筛选以缩小日期期间的范围,则大多数筛选行将位于有限的一组切片上并且查询工作负载将偏斜。 将一些维度表改为使用 ALL 分配; 如果一个维度表不能与事实数据表或其他重要的联接表并置,您可以通过将整个表分配到所有节点来大大提高查询性能。使用 ALL 分配会使存储空间需求成倍增长,并且会增加加载时间和维护操作,所以在选择 ALL 分配前应权衡所有因素。 优化COPY,提高数据加载速度 当你将要数据加载到Redshift的某个表时,不要让单个输入文件过大,最好是将这些输入文件切成多份,具体数量最好是跟分片数量匹配,这样可以充分利用所有分片,配合分配键能达到最佳效果。 图2,COPY输入的最优方式 让COPY选择自动压缩 作为数据仓库,Redshift通常会需要大量导入数据,这时使用做多的,效率最好的是COPY命令。在使用COPY时建议将COMPUPDATE参数设置为ON,这样数据在加载进库时是自动压缩的,好处是可以节省存储空间,提高查询的速度,不过这会增加数据加载进表的时间,这个可以根据你的业务需求,再具体衡量。 Redshift调优实战 测试结论 选择合适的排序键,分配键,及自动压缩对表的查询速度,存储效率很大提升。本次测试中,优化后查询速度有高达75%的提升,存储空间节省50%。 相同节点类型情况下,多节点性能比单节点性能提升明显。本次测试中,采用了4节点与单节点对比,4节点查询速度比单节点提升75%。 节点数量相同的情况下,dc系列节点的查询速度比ds系列节点的查询速度要快。本次测试中,采用了dc1.large和ds1.xlarge两种节点类型进行对比,dc系列节点的查询速度比ds系列快20% 。 使用JOIN与不使用JOIN查询速度无明显差别。本次测试中,三个不同的查询及对应的JOIN查询,在查询速度上的差别非常小。这部分的详细测试结果,请参见附录一。 查询速度达到一定值时,再增加节点对查询优化的效果有限。本次测试中,在相同环境中,将节点数量从8个dc1.large节点增加到12个dc1.large节点,三个查询只有一个查询的速度有一定提升,其他2个查询速度基本没有太大变化。这部分的详细测试结果,请参见附录二。 图3,调优前后性能对比图 […]

Read More

分布式神经网络框架 CaffeOnSpark在AWS上的部署过程

一、介绍 Caffe 是一个高效的神经网络计算框架,可以充分利用系统的GPU资源进行并行计算,是一个强大的工具,在图像识别、语音识别、行为分类等不同领域都得到了广泛应用。有关Caffe的更多内容请参考项目主页: http://caffe.berkeleyvision.org/ 不过Caffe的常用部署方式是单机的,这就意味着它的水平扩展能力受到了限制。使用者可以通过在系统中添加多个GPU的方式提高并发度,不过其并发能力最终受到单系统可支撑的GPU数量的限制。同时,神经网络计算往往又是计算消耗很大的,所以人们在使用Caffe的时候都可能会希望有一种并行计算框架可以支持Caffe。 而我们知道Spark是基于内存的计算框架,基于Yarn, Mesos或者是Standalone模式,它可以充分利用多实例计算资源。因此,如果能够结合Caffe和Spark,Caffe的能力将得到更充分的发挥。 基于这些原因,Yahoo开源的CaffeOnSpark框架受到的极大的关注。 有关CaffeOnSpark的源代码和相关文档,请大家参考: https://github.com/yahoo/CaffeOnSpark 今天我们要进一步讨论的是如何在AWS EC2上部署CaffeOnSpark, 充分利用AWS服务提供的GPU实例构建强大的分布式神经网络计算框架。 在CaffeOnSpark的文档中有明确指出EC2上部署CaffeOnSpark的步骤,具体请参考: https://github.com/yahoo/CaffeOnSpark/wiki/GetStarted_EC2 但是文档的一些部分写得比较简单,初步接触的读者可能在执行过程中遇到一些问题,所以在这里将我个人的安装配置过程整理了一下供大家参考。 安装过程大概可以分为四部分: 下面会在“环境准备”一节中具体描述这几个步骤的细节。 二、环境准备 首先我们打开文档https://github.com/yahoo/CaffeOnSpark/wiki/GetStarted_EC2, 看看文档中刚开始的部分对于环境准备的要求。 里面首先提到我们需要准备“EC2 Key pair”, 就是要准备EC2启动需要的密钥对。当然,为了创建“EC2 Key pair”,为了启动EC2,你首先需要一个AWS账号。有关AWS账号的申请和基本使用这里就不细述了,请参考其它相关文档。需要注意的是你拿到的AWS账号需要有基本的权限才能完成CaffeOnSpark的安装工作,其中包括创建EC2实例,创建安全组等。 “EC2 Key pair”是你在创建EC2实例时创建的密钥对,创建过程中你有一次机会下载私钥文件,就是文中提到的pem文件。如果你之前没有创建过EC2,你也可以直接在EC2控制台的“网络与安全->密钥对”界面中点击“创建密钥对”按钮进行创建。同样,创建过程中你有一次机会下载pem文件,下载后注意保管好该文件,后面都会依赖这个文件。 按文档的描述,有了以上的资源以后就可以执行以下命令: 为了准备环境,我们需要先理解一下上面的脚本。脚本的刚开始部分是一系列变量的定义,我们先了解这些变量的作用。 第一句比较简单,从变量名可以知道这是指定了要使用的AMI的ID: 这个镜像是一个已经安装好Spark、CaffeOnSpark,并加载了常用神经网络测试数据的Ubuntu镜像。该镜像由CaffeOnSpark团队提供,已经共享给所有AWS账号。 不过稍有AWS使用经验的同学会意识到,这样的命令是针对特定的区域(Region)的,因为同一个AMI镜像拷贝到不同AWS区域时它们的AMI ID是不一样的。在命令行中如果指定了一个AMI的ID,就意味着这些命令只能在特定的AWS区域正常工作。 所以我们需要继续查看后续命令,看看哪里指定了区域。幸运的是,命令的第二行就是指定区域的命令: 我们知道区域代码“eu-west-1”指的是欧洲(爱尔兰) 区域,意味着我们运行完这个样例后我们的CaffeOnSpark群集是运行在欧洲(爱尔兰) 区域的。因为EC2 key pair也是按区域分的,所以我们创建的EC2 key pair也应该是在欧洲(爱尔兰) 区域。 为了在欧洲(爱尔兰) 区域创建你的EC2 key pair,你可以点击AWS控制台右上角的区域选择框,选择欧洲(爱尔兰) 区域,然后再按步骤进入EC2的控制台创建EC2 key pair. 同时,你也可以去EC2控制台的“映像->AMI”界面查找镜像ID为ami-5ff7782c的镜像,记得查看时选择“映像类型”为“公有映像”,而不是“我拥有的”。找到这个镜像你还可以仔细查看一下其它相关信息。 如果你发现镜像列表中没有ID为ami-5ff7782c的镜像,有可能你阅读本文的时候相关方已经更新了新的镜像,你可以去CaffeOnSpark的主页 https://github.com/yahoo/CaffeOnSpark […]

Read More