接下来要开发和部署的这个 Python Web 应用会使用 Bluemix 提供的 dashDB 服务。dasdDB 是一个由 IBM 提供的 SQL 数据库服务,用户可以直接在 Bluemix 上注册使用,不需要在进行本地安装。除了数据存储服务,用户还可以使用 dashDB 来做为数据仓库,并进行数据挖掘等行为。在开发和部署应用程序的过程中,我们会使用 Cloud Foundry 命令行来做为主要的部署工具,同时,还会使用 Bluemix 控制台来对应用进行管理和配置。
点击查看大图
应用的源码存储在 Github 上,访问地址是:https://github.com/acostry/dw-python-dashdb
点击查看大图
通过 Git 命令,可以将应用源码克隆到本地,方便我们进行本地开发,当然读者也可以按照下文的步骤一步步从零开始进行应用开发。
- xius-mbp:dw acostry$ git clone https://github.com/acostry/dw-python-dashdb.git
- Cloning into 'dw-python-dashdb'...
- remote: Counting objects: 10, done.
- remote: Compressing objects: 100% (6/6), done.
- remote: Total 10 (delta 0), reused 0 (delta 0), pack-reused 0
- Unpacking objects: 100% (10/10), done.
- Checking connectivity... done.
- xius-mbp:dw acostry$ cd dw-python-dashdb/
- xius-mbp:dw-python-dashdb acostry$ ls
- Procfile app.py requirements.txt
- README.md dashDB.ddl runtime.txt
要想实现在 Bluemix 平台运行 Python 应用,至少需要包含以下四个文件:Procfile, requirements.txt, runtime.txt 以及 app.py
ibm_dbFlask 是一个开发 Python Web 应用的开源框架,ibm_db 用来在 Python 应用中连接和使用 dashDB。
- Flabsk
- if 'VCAP_SERVICES' in os.environ:
- db2info = json.loads(os.environ['VCAP_SERVICES'])['dashDB'][0]
- db2cred = db2info["credentials"]
- db2conn = ibm_db.connect("DATABASE="+db2cred['db']+";HOSTNAME="+db2cred['hostname']+";PORT="+str(db2cred['port'])+";UID="+db2cred['username']+";PWD="+db2cred['password']+";","","")
这部分代码主要有两个功能:第一,从环境变量 VCAP_SERVICES 里动态读取 dashDB 服务实例的连接信息,并存储在 db2cred 变量里。第二,通过读取的连接信息,建立数据库连接。需要注意的是,只有当应用和 dashDB 数据库实例绑定以后,连接信息才会被写入 VCAP_SERVICES 环境变量,我们这里实现的是动态读取,所以即使还没有绑定数据库实例,代码逻辑也是没有问题的,这也是 Bluemix 推荐的读取 VCAP_SERVICES 信息的方式,不建议硬编码数据库实例信息到代码里,因为被写入环境变量 VCAP_SERVICES 里的信息,有可能会定期的被修改。这也是云上使用服务独有的特点,用户其实不需要关心服务实例具体在哪里,只需要告诉用户通过某种方式可以得到这些连接信息即可。用户需要关心的是如何使用,而不是怎么部署,如何部署以及管理这些服务实例等细节繁琐的问题。关于 VCAP_SERVICES 信息的格式,接下来的章节会讲到。
- # main page to dump some enroll information
- @app.route('/')
- def index():
- page = '<title>Welcome dashDB!</title>'
- page += '<h1>Sample IBM Bluemix Python Web Application which connects to dashDB!</h1>'
- if db2conn:
- # we have a DB2 connection, so obtain enroll information via enroll table, the enroll information need to be updated to dashDB manually:
- stmt = ibm_db.exec_immediate(db2conn,"select * from enroll")
- # fetch the result
- result = ibm_db.fetch_assoc(stmt)
- page += "Enroll Name: "+result["NAME"]+"<br/>Title: "+result["TITLE"]
- page += "<br/>Skill: "+result["SKILL"]+"<br/> Company: "+str(result["COMPANY"])
- page += "<br/>Country: "+str(result["COUNTRY"])
- return page
这段代码的主要功能是从数据库的 enroll 表里查询数据,并将数据显示在 page 的主页上。要想让这段代码正常工作,我们需要首先在数据库里新建一张名为 enroll 的表,并插入一些实验数据,这部分内容可以参考下文的操作 dashDB 数据库相关章节。
- if __name__ == '__main__':
- # Bind to PORT/HOST if defined, otherwise default to 5050/localhost.
- PORT = int(os.getenv('VCAP_APP_PORT', '5050'))
- HOST = str(os.getenv('VCAP_APP_HOST', 'localhost'))
- app.run(host=HOST, port=PORT)
绑定 PORT 和 HOST,根据 Cloud Foundry 的要求,运行在 Bluemix 上的应用,必须绑定 "VCAP_APP_PORT" 和 "VCAP_APP_HOST",否则应用将不能被正常启动和运行。
说了这么多,让我们开始动手部署应用到 Bluemix 吧!
- xius-mbp:dw-python-dashdb acostry$ cf api https://api.ng.bluemix.net
- Setting api endpoint to https://api.ng.bluemix.net...
- OK
- API endpoint: https://api.ng.bluemix.net (API version: 2.54.0)
- Not logged in. Use 'cf login' to log in.
- xius-mbp:dw-python-dashdb acostry$ cf login
- API endpoint: https://api.ng.bluemix.net
- Email> xiuleizh@cn.ibm.com
- Password>
- Authenticating...
- OK
- Select an org (or press enter to skip):
- 1. xiuleizh@cn.ibm.com
- 2. OE_Runtimes_SVT
- 3. BMIX_NG_CNSL_USERS
- Org> 1
- Targeted org xiuleizh@cn.ibm.com
- Select a space (or press enter to skip):
- 1. dev
- 2. dw-space
- Space> 2
- Targeted space dw-space
- API endpoint: https://api.ng.bluemix.net (API version: 2.54.0)
- User: xiuleizh@cn.ibm.com
- Org: xiuleizh@cn.ibm.com
- Space: dw-space
cf push 后面跟的 dw-python-cmd 是应用的名字,请读者在实际部署的时候另取新的名字并保证是云上唯一的,后面的 "--no-start" 参数是告诉 Bluemix 暂时不要启动应用,因为这个实例在代码里用到了 dashDB 服务实例,等配置好 dashDB 服务实例以后再来手工启动应用。
- xius-mbp:dw-python-dashdb acostry$ ls
- Procfile app.py requirements.txt
- README.md dashDB.ddl runtime.txt
- xius-mbp:dw-python-dashdb acostry$ cf push dw-python-cmd --no-start
- Creating app dw-python-cmd in org xiuleizh@cn.ibm.com / space dw-space as xiuleizh@cn.ibm.com...
- OK
- Creating route dw-python-cmd.mybluemix.net...
- OK
- Binding dw-python-cmd.mybluemix.net to dw-python-cmd...
- OK
- Uploading dw-python-cmd...
- Uploading app files from: /Users/acostry/Workspace/dw/dw-python-dashdb
- Uploading 2.8K, 6 files
- Done uploading
- OK
cf create-service 后面有三个参数,第一个 dashDB 是所有服务的名称。第二个 Entry 指的是相应服务的 plan,plan 是和计价相关的概念,读者只需暂时记住就可以了,至于具体的计价信息,可以到服务的文档查看。第三个参数 dashDB-Sample 是所要创建的服务实例的名称,这个名称用户可以自行设定。在命令输出的最后有一个 Attention,这里是告知用户正在使用的服务 plan 是一个收费的服务。但是对于试用用户可以放心使用,每个服务都有一定的免费使用期限和用量,可以放心使用,并不会产生任何费用。
- xius-mbp:dw-python-dashdb acostry$ cf create-service dashDB Entry dashDB-Sample
- Creating service instance dashDB-Sample in org xiuleizh@cn.ibm.com / space dw-space as xiuleizh@cn.ibm.com...
- OK
- Attention: The plan `Entry` of service `dashDB` is not free. The instance `dashDB-Sample` will incur a cost. Contact your administrator if you think this is in error.
cf bind-service 后面需要跟两个参数,一个是具体应用的名字,另外一个是所要绑定的 服务的实例名字。当绑定服务成功后,系统会提示 restage 应用,基本上就是要进行一次应用的重启来使绑定生效。因为在绑定的过程中会有一些服务信息被写入到相关的环境变量里,通过 restage 可以激活这些信息。
- xius-mbp:dw-python-dashdb acostry$ cf bind-service dw-python-cmd dashDB-Sample
- Binding service dashDB-Sample to app dw-python-cmd in org xiuleizh@cn.ibm.com / space dw-space as xiuleizh@cn.ibm.com...
- OK
前文提到,app.py 会从一个叫做 "enroll" 的表里来查找数据,本节的主要内容就是介绍如何通过控制台在 dashDB 数据库中创建表并插入数据。在图 9 显示的服务列表里,点击 dashDB-Sample 进入到 dashDB 服务的管理页面:
点击查看大图
在上图中,点击 "OPEN" 打开 dashDB 数据库实例的管理界面,并单击左侧列表中的 "Run SQL"
点击查看大图
清空上图中的示例 SQL 语句,在运行框里输入如下 SQL 语句,并点击 "Run All" 执行 SQL,完成数据库的初始化。
- create table enroll(name varchar(50) not null primary key, title varchar(50), skill varchar(50), company varchar(50), country varchar(30));
- insert into enroll values ('acostry', 'Software Engineer', 'Cloud Computing', 'IBM', 'China');
点击查看大图
如果碰到执行 SQL 失败,请多尝试几次或者换个时间段来执行,这是因为我们使用的 Bluemix 数据中心位于国外,经常会因为网络的问题出现各种未知错误。
当使用 cf start 命令来启动应用的时候,Bluemix 平台会自动去探测应用类型, 并安装相应的运行时环境:Installing python-2.7.10 安装应用程序定义的第三方依赖:$ pip install -r requirements.txt 生成并上传 Droplet:Uploading droplet (62M) 启动应用:App dw-python-cmd was started using this command `python app.py` 最后给出应用的访问地址等信息:urls: dw-python-cmd.mybluemix.net
- xius-mbp:dw-python-dashdb acostry$ cf start dw-python-cmd
- Starting app dw-python-cmd in org xiuleizh@cn.ibm.com / space dw-space as xiuleizh@cn.ibm.com...
- -----> Downloaded app package (4.0K)
- -------> Buildpack version 1.5.5
- -----> Installing python-2.7.10
- $ pip install -r requirements.txt
- DEPRECATION: --allow-all-external has been deprecated and will be removed in the future. Due to changes in the repository protocol, it no longer has any effect.
- Collecting Flask (from -r requirements.txt (line 1))
- Downloading Flask-0.11.1-py2.py3-none-any.whl (80kB)
- Collecting ibm-db (from -r requirements.txt (line 2))
- Downloading ibm_db-2.0.7.tar.gz (553kB)
- Collecting click>=2.0 (from Flask->-r requirements.txt (line 1))
- Downloading click-6.6.tar.gz (283kB)
- Collecting itsdangerous>=0.21 (from Flask->-r requirements.txt (line 1))
- Downloading itsdangerous-0.24.tar.gz (46kB)
- Collecting Werkzeug>=0.7 (from Flask->-r requirements.txt (line 1))
- Collecting Jinja2>=2.4 (from Flask->-r requirements.txt (line 1))
- Downloading Jinja2-2.8-py2.py3-none-any.whl (263kB)
- Collecting MarkupSafe (from Jinja2>=2.4->Flask->-r requirements.txt (line 1))
- Downloading MarkupSafe-0.23.tar.gz
- Installing collected packages: click, itsdangerous, Werkzeug, MarkupSafe, Jinja2, Flask, ibm-db
- Running setup.py install for click: started
- Running setup.py install for click: finished with status 'done'
- Running setup.py install for itsdangerous: started
- Running setup.py install for itsdangerous: finished with status 'done'
- Running setup.py install for MarkupSafe: started
- Running setup.py install for MarkupSafe: finished with status 'done'
- Running setup.py install for ibm-db: started
- Running setup.py install for ibm-db: finished with status 'done'
- Successfully installed Flask-0.11.1 Jinja2-2.8 MarkupSafe-0.23 Werkzeug-0.11.11 click-6.6 ibm-db-2.0.7 itsdangerous-0.24
- You are using pip version 8.1.1, however version 9.0.1 is available.
- You are using pip version 8.1.1, however version 9.0.1 is available.
- You should consider upgrading via the 'pip install --upgrade pip' command.
- -----> Uploading droplet (62M)
- 0 of 1 instances running, 1 starting
- 1 of 1 instances running
- App started
- OK
- App dw-python-cmd was started using this command `python app.py`
- Showing health and status for app dw-python-cmd in org xiuleizh@cn.ibm.com / space dw-space as xiuleizh@cn.ibm.com...
- OK
- requested state: started
- instances: 1/1
- usage: 1G x 1 instances
- urls: dw-python-cmd.mybluemix.net
- last uploaded: Tue Nov 15 07:14:00 UTC 2016
- stack: cflinuxfs2
- buildpack: python 1.5.5
- state since cpu memory disk details
- #0 running 2016-11-15 08:35:25 PM 0.0% 83.9M of 1G 214.5M of 1G
科学计算和数据分析是 Python 语言应用比较多的领域,Bluemix 对使用 Python 来进行科学计算和数据分析也提供了全面的支持。
Apache Spark 是开源的集群计算框架,主要用于海量数据的计算和分析。IBM Analytics for Apache Spark 服务将 Spark 与 notebook 相结合,可以使用户非常方便的在 Bluemix 上进行科学计算和数据分析。用户只需要几次点击操作就能创建一个 Spark 集群,不需要进行复杂的安装和配置,非常快速的就能体验到 Spark 服务带来的便利。登陆 Bluemix,并点击 Catalog 可以查看更多关于 Apache Spark 服务的介绍。
点击查看大图
在开始进行数据分析之前,需要首先创建 Spark 服务实例,登陆 Bluemix,点击左上角目录按钮,选择 Services > Data&Analytics , 在显示页面里点击 Analytics,如下图所示:
点击查看大图
在上图中,点击 "NEW INSTANCE" 创建一个新的 Spark 服务实例,在弹出页面里设置实例的名称和工作的空间,并点击 "CREATE INSTANCE"
点击查看大图
Spark 实例创建成功以后,会跳转到 My Notebooks 页面,在这里点击 "NEW NOTEBOOK" 来创建一个新的 Notebook
点击查看大图
在创建 Notebook 的时候,我们可以选择创建一个空白的 Notebook,或者上传一个已经存在的 Notebook,同时也可以选择使用 Bluemix 预制的样本来创建。
点击查看大图
为了方便我们讲解 IPython Notebook 的使用,我们在这里使用 Bluemix 预制的样本来创建一个 Notebook
点击查看大图
点击 "CREATE NOTEBOOK" 创建一个基于样本的 IPython Notebook,如下图所示。红方框里是功能按钮用来帮助在 IPython Notebook 里运行 Python 脚本。右上角的 Notebook Tools 可以帮助用户更好的来使用和管理 Notebook,其中:
点击查看大图
关于 IPython Notebook 更多的使用方法,读者可以根据样本程序的引导来进行更全面的学习。同时也可以参考文章《在 Bluemix 上使用 Spark 在浏览器中分析天气数据》 了解更多具体的用法和功能。
在本文中,我们首先介绍了 Bluemix 里的 Buildpacks 机制,进而引出 Python Buildpack。然后通过一个实例来演示如何在 Bluemix 上开发和部署 Python 应用。最后向读者介绍了如何使用 Apache Spark 服务和 Python 来进行科学计算和数据分析。读完本篇文章,相信读者应该已经对在 Bluemix 上如何使用 Python 和相关服务有了比较深刻的理解,并应该具备了够独立部署 Python 应用到 Bluemix 云平台的能力。
来源: http://www.ibm.com/developerworks/cn/cloud/library/cl-cn-apidesigner-publishapi/index.html