用Amazon Web Services进行云计算,第5部分:用SimpleDB在云中处理数据集

日期: 2009-05-31 作者:Prabhakar Chaganti 来源:TechTarget中国 英文

  学习基本的Amazon SimpleDB(SDB)概念,研究boto(一个用于与SDB交互的开放源码Python库)提供的一些功能。在这个“用Amazon Web Services进行云计算”系列中,学习如何使用Amazon Web Services进行云计算。了解这些服务如何为设计和构建可伸缩、可靠的应用程序提供一种可选方案。在本文中,学习一些基本概念和boto提供的一些功能。

  Amazon SimpleDB

  Amazon SDB是一个快速的可伸缩实时数据集索引和查询框架,基于Amazon Web Services的应用程序可以用它轻松地存储和获取结构化数据。它能够与其他Amazon Web Services很好地协作,比如Elastic Compute Cloud(EC2)和Simple Storage Service(S3)。可以使用SDB在Amazon Web Services环境中构建完整的应用程序组合。只需根据使用量为服务付费。还提供一定的免费使用量。

  SDB提供的特性包括:

  可靠性
  SDB跨多个数据中心冗余地存储带索引的数据,保证它们随时可用。

  速度
  SDB能够快速地获取数据,尤其是在Amazon Web Services环境中从EC2实例发出请求时。

  简单性
  访问和使用SDB的编程模型非常简单,而且可以从多种编程语言使用SDB。

  安全性
  SDB提供很高的安全水平。只允许授权的用户访问数据。

  灵活性
  SDB支持动态地存储数据,不需要预先定义的模式。

  低成本
  SDB的费用非常低廉。只需根据实际使用量付费。

  下面讨论支撑SDB的概念。

  

  域是存储结构化数据和运行查询的容器。在域中存储的数据称为条目。从概念上说,域与电子表格中的工作单标签相似;条目与电子表格中的行相似。可以对域运行查询,但是当前的SDB版本还不支持跨域查询。

  每个域与下面的元数据相关联:

  ·最后一次更新元数据的日期和时间
  ·域中条目的数量
  ·域中属性名-值对的数量
  ·域中独特属性名的数量
  ·域中所有条目名的总大小(字节数)
  ·域中所有属性值的总大小(字节数)
  ·域中所有独特属性名的总大小(字节数)

  与Simple Queue Service(SQS)一样,SDB也采用“最终一致性”模型。SDB维护每个域的多个拷贝,从而提供容错能力。对域的每个修改都会传播到所有拷贝。
 
  根据系统负载和网络延时不同,这个操作有时候要花费几秒时间,所以域的消费者可能无法立即看到修改。修改最终会传播到整个SDB,但是在设计基于SDB的应用程序时一定要考虑到传播延时的影响。

  条目

  条目代表域中的对象,它们包含属性和值。从概念上说,条目与电子表格中的行相似 — 属性是列,值是单元格。属性可以包含多个值。无论数据结构是什么样的,SDB都会自动地为域编制索引。

  SDB还对针对域执行的查询有时间限制。如果查询花费的时间超过5秒,SDB就会停止查询并返回一个错误。

  SDB中的域很灵活,没有任何固定的模式。域中的每个条目可以包含一组独特的属性(不超过256个)。属性甚至可以与域中其他条目的所有其他属性完全不同。

  限制

  当前的SDB版本有一些限制,在设计应用程序时应该考虑到这些限制。表1给出这些限制。

              

  表1. 当前限制

  SDB入门

  要想开始使用SDB,首先需要注册一个Amazon Web Services账户。本系列的第2部分详细介绍了如何注册Amazon Web Services账户。创建Amazon Web Services账户之后,必须为账户启用Amazon SDB服务:

  ·登录Amazon Web Services账户。
  ·导航到SDB主页。
  ·单击页面右边的Sign Up For This Web Service。
  ·提供必需的信息并完成注册过程。

  与任何Amazon Web Services的所有通信都要通过SOAP接口或查询接口。在本文中,通过一个第三方库使用查询接口与SDB通信。

  需要获得自己的访问键,可以通过在Web Services帐户信息页面上选择View Access Key Identifiers获得访问键。现在设置了Amazon Web Services并为账户启用了SDB服务。

  与SDB交互

  这个示例使用第三方开放源码Python库boto,通过在Python shell中运行代码片段熟悉SDB。

  安装boto并设置环境

  下载boto。撰写本文时的最新版本是1.6b。把存档文件解压到您选择的目录中。进入此目录并运行setup.py把boto安装到本地Python环境中,见清单1。

  清单1. 安装boto
    
$ cd directory_where_you_unzipped_boto

$ python setup.py install
 
  设置一些环境变量,引用Amazon Web Services访问键。可以从Web Services帐户信息页面获得访问键。

  清单2. 设置环境变量
    
# Export variables with your AWS access keys
$ export AWS_ACCESS_KEY_ID=Your_AWS_Access_Key_ID
$ export AWS_SECRET_ACCESS_KEY=Your_AWS_Secret_Access_Key
 
  启动Python shell并导入boto库,从而确认所有设置都是正确的,见清单3。

  清单3. 检查设置
    
$ python
Python 2.4.5 (#1, Apr 12 2008, 02:18:19)
[GCC 4.0.1 (Apple Computer, Inc. build 5367)] on darwin
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import boto
>>>
 
  用boto体验SDB

  使用SDBConnection类提供与SDB交互的主要接口。从Python控制台使用boto。示例调用SDBConnection对象上的不同方法,然后查看SDB返回的响应,这有助于熟悉API和体验SDB概念。

  第一步是使用前面导出到环境中的Amazon Web Services访问键,创建一个连接到SDB的连接对象。boto库总是先检查是否设置了这些环境变量。如果设置了这些变量,boto在创建连接时自动地使用它们。

  清单4. 创建到SDB的连接
    
>>> import boto
>>> sdb_conn = boto.connect_sdb()
>>>
 
  然后,可以使用上面创建的sdb_conn对象与SDB交互。可以通过指定域名创建新的域。

  清单5. 创建域
    
>>> d1 = sdb_conn.create_domain(‘devworks-dom-1’)
>>>
 
  获取所有域的列表,这返回一个结果集对象,它实际上是一个Python列表,见清单6。可以循环遍历这个列表并访问每个域的所有相关信息。

  清单6. 列出所有域
    
>>> all_domains = sdb_conn.get_all_domains()
>>>
>>> len(all_domains)
1
>>>
>>> for d in all_domains:
…     print d.name

devworks-dom-1
 
  还可以按名称获取单一域。

  清单7. 列出单一域
    
>>> my_domain = sdb_conn.get_domain(‘devworks-dom-1’)
>>>
>>> print my_domain.name
devworks-dom-1
 
  当然,在添加条目之前,刚创建的域是空的。在域中创建一个新条目,然后在其中添加属性。

  清单8. 创建新条目
    
>>> my_domain = sdb_conn.get_domain(‘devworks-dom-1’)
>>>
>>> i1 = my_domain.new_item(‘test_item_1’)
>>>
>>> i1[‘cars’] = ‘BMW’
>>>
>>> i1[‘fruits’] = [‘apple’, ‘orange’, ‘mango’]
>>>
 
  可以通过指定条目名从域中获取条目。条目名必须是惟一的,这与关系数据库中的主键概念相似。

  清单9. 获取条目及其属性
    
>>> my_item = my_domain.get_item(‘test_item_1’)
>>>
>>> print my_item
{u’cars’: u’BMW’, u’fruits’: [u’apple’, u’mango’, u’orange’]}
>>>
 
  返回的条目对象是一个动态的Item对象。在访问任何属性时,它会自动地从SDB获取条目的所有属性。对条目属性值的任何更新会自动保存到SDB中。

  清单10. 更新属性
>>> my_item[‘cars’]
u’BMW’
>>>
>>> my_item[‘cars’] = ‘Honda’
>>>
>>> my_item[‘cars’]
‘Honda’
>>>
 
  还可以通过使用SDBConnection类并指定域和条目名来获取条目和属性。

  清单11. 使用SDBConnection获取条目
    
>>>
>>> sdb_conn.get_attributes(‘devworks-dom-1′,’test_item_1’)
{u’cars’: u’Honda’, u’fruits’: [u’apple’, u’mango’, u’orange’]}
>>>
 
  如果一个条目没有任何属性,SDB就会自动删除它。还可以显式地删除条目及其属性。

  清单12. 删除条目及其属性
    
>>> sdb_conn.get_attributes(‘devworks-dom-1′,’test_item_1’)
{u’cars’: u’Honda’, u’fruits’: [u’apple’, u’mango’, u’orange’]}
>>>
>>> sdb_conn.delete_attributes(‘devworks-dom-1′,’test_item_1’)
True
>>> sdb_conn.get_attributes(‘devworks-dom-1′,’test_item_1’)
{}
>>>
 
  清单13. 删除域
    
>>> sdb_conn.delete_domain(‘devworks-dom-1’)
True
>>>
 
  查询SDB域

  SDB提供一种用于搜索结构化数据的定制查询语言,可以查询与条目相关联的属性名-值对。查询表达式的基本组成部分称为谓词。每个谓词由方括号限定,其中包含属性、比较操作符和要比较的值。例如,谓词[‘desc’ = ‘Hello Devworks’]定义针对desc属性的相等比较。每个谓词单独计算并产生一组条目名。可以使用union和intersection等集操作符组合多个谓词,从而构建复杂的查询。

  在查询中使用谓词时,一定要考虑到SDB按照词典次序执行所有谓词比较。必须确保数据以适当的字符串形式存储在属性中。注意,如果查询花费的时间超过5秒,SDB就会自动终止它。

  清单14. 创建一些测试数据
    
>>> d2 = sdb_conn.create_domain(‘devworks-dom-2’)
>>>
>>> i1 = d2.new_item(‘car1’)
>>>
>>> i1[‘make’]= ‘BMW’
>>> i1[‘color’]=’grey’
>>> i1[‘year’]=’2008′
>>> i1[‘desc’]=’Sedan’
>>> i1[‘model’]=’530i’
>>>
>>> i2 = d2.new_item(‘car2’)
>>>
>>> i2[‘make’]= ‘BMW’
>>> i2[‘color’]=’white’
>>> i2[‘year’]=’2007′
>>> i2[‘desc’]=’Sports Utility Vehicle’
>>> i2[‘model’]=’X5′
>>>
 
  清单15. 包含一个谓词的查询
>>> rs = d2.query(“[‘make’ = ‘BMW’]”)
>>> for result in rs:
…     print result.name

car1
car2
>>>
 
  清单16. 包含多个谓词的查询
>>> rs = d2.query(“[‘make’ = ‘BMW’] intersection [‘year’ = ‘2007’]”)
>>> for result in rs:
…     print result.name

car2
>>>
 
  这种查询语言支持多种比较操作符。它允许执行范围查询和多值属性查询。强烈建议您阅读Amazon Web Services提供的介绍查询语言的文章,了解它提供的所有功能及创建和调整查询的最佳实践。

  还可以获取域的元数据,从而了解域中的条目总数等信息。

  清单17. 域的元数据
>>> my_domain = sdb_conn.get_domain(‘devworks-dom-2’)
>>>
>>> my_metadata = my_domain.get_metadata()
>>>
>>> print my_metadata.item_count
2
>>> print my_metadata.item_names_size
8
>>> print my_metadata.attr_value_count
10
>>> print my_metadata.attr_names_size
22
>>> print my_metadata.attr_values_size
56
>>> print my_metadata.timestamp      
1231798889
>>>
            
  结束语

  本文介绍了Amazon的SDB服务。您学习了一些基本概念和boto(一个用于与SDB交互的开放源码Python库)提供的一些功能。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐