樣例代碼
本文介紹如何快速使用EMR Python SDK完成常見操作,例如創(chuàng)建集群、查詢集群列表和擴(kuò)縮容節(jié)點(diǎn)組等。
創(chuàng)建集群
#!/usr/bin/python
from aliyunsdkcore import client
from aliyunsdkemr.request.v20160408 import CreateClusterRequest
clt = client.AcsClient(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),'cn-hangzhou') # set accessId and accessKey
request = CreateClusterRequest.CreateClusterRequest()
request.set_Name("pydemo")
request.set_ZoneId("cn-hangzhou-b")
request.set_LogEnable(False)
request.set_SecurityGroupId("sg-********")
request.set_IsOpenPublicIp(True)
request.set_ChargeType("PostPaid")
request.set_EmrVer("EMR-1.3.0")
request.set_ClusterType("HADOOP")
request.set_IoOptimized(True)
request.set_InstanceGeneration("ecs-2")
# set EcsOrder
request.add_query_param('EcsOrder.1.NodeCount', '1')
request.add_query_param('EcsOrder.1.NodeType', 'MASTER')
request.add_query_param('EcsOrder.1.InstanceType', 'ecs.n1.large')
request.add_query_param('EcsOrder.1.DiskType', 'CLOUD_EFFICIENCY')
request.add_query_param('EcsOrder.1.DiskCapacity', '80')
request.add_query_param('EcsOrder.1.DiskCount', '1')
request.add_query_param('EcsOrder.1.Index', '1')
request.add_query_param('EcsOrder.2.NodeCount', '3')
request.add_query_param('EcsOrder.2.NodeType', 'CORE')
request.add_query_param('EcsOrder.2.InstanceType', 'ecs.n1.large')
request.add_query_param('EcsOrder.2.DiskType', 'CLOUD_EFFICIENCY')
request.add_query_param('EcsOrder.2.DiskCapacity', '80')
request.add_query_param('EcsOrder.2.DiskCount', '4')
request.add_query_param('EcsOrder.2.Index', '2')
request.set_accept_format('json')
result = clt.do_action(request)
print result
由于阿里云產(chǎn)品眾多,所有SDK的生成是通過程序自動(dòng)生成的,所以部分SDK的使用比較不方便。在目前Python SDK中,對(duì)入?yún)⑹荓ist(不管是基本類型的List還是復(fù)雜對(duì)象的List)支持不好,需要特殊處理。
如果是基本類型的List入?yún)ⅲ?qǐng)參見查看集群列表示例代碼中對(duì)StatusList參數(shù)的設(shè)置。
如果是復(fù)雜對(duì)象的List入?yún)ⅲ?qǐng)參見創(chuàng)建集群示例代碼中對(duì)EcsOrder參數(shù)的設(shè)置。
其他List入?yún)ⅲ鏐ootstrapAction參數(shù),推薦您使用Java SDK,使用Java SDK會(huì)更加方便。
其他接口操作類似,具體請(qǐng)參見API概覽。
查看集群列表
#!/usr/bin/python
from aliyunsdkcore import client
from aliyunsdkemr.request.v20160408 import ListClustersRequest
clt = client.AcsClient(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),'cn-hangzhou') # set accessId and accessKey
request = ListClustersRequest.ListClustersRequest()
request.set_accept_format('xml') # xml or json
# 設(shè)置狀態(tài)過濾,只查找RUNNING和IDLE的集群,注意該參數(shù)為可選參數(shù),可以不設(shè)置。
request.add_query_param('StatusList.1', 'RUNNING')
request.add_query_param('StatusList.2', 'IDLE')
result = clt.do_action(request)
print result
擴(kuò)容節(jié)點(diǎn)組
通過調(diào)整指定節(jié)點(diǎn)組數(shù)量擴(kuò)容節(jié)點(diǎn)組。
#!/usr/bin/python
from aliyunsdkcore import client
from aliyunsdkemr.request.v20160408 import ResizeClusterV2Request
clt = client.AcsClient(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),'cn-hangzhou')
request = ResizeClusterV2Request.ResizeClusterV2Request()
request.set_accept_format('json')
# 集群ID
request.set_ClusterId("C-01A1F4A********")
# 待擴(kuò)容節(jié)點(diǎn)組信息,支持同時(shí)對(duì)多個(gè)節(jié)點(diǎn)組擴(kuò)容從1開始計(jì)數(shù)。
request.add_query_param('HostGroup.1.HostGroupId', 'G-F0D0661E0A6E****')
request.add_query_param('HostGroup.1.NodeCount', 1)
#request.add_query_param('HostGroup.2.HostGroupId', 'G-F0D0661E0A6****')
#request.add_query_param('HostGroup.2.NodeCount', 3)
result = clt.do_action(request)
print(result)
縮容節(jié)點(diǎn)組
您可以選擇通過調(diào)整指定節(jié)點(diǎn)組數(shù)量縮容節(jié)點(diǎn)組或通過實(shí)例ID縮容節(jié)點(diǎn)組。
通過調(diào)整指定節(jié)點(diǎn)組數(shù)量縮容節(jié)點(diǎn)組
使用該特性,您需要通過以下命令升級(jí)您的SDK版本。
sudo pip install aliyun-python-sdk-emr --upgrade
#!/usr/bin/python
from aliyunsdkcore import client
from aliyunsdkemr.request.v20160408 import ReleaseClusterHostGroupRequest
clt = client.AcsClient(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),'cn-hangzhou')
request = ReleaseClusterHostGroupRequest.ReleaseClusterHostGroupRequest()
request.set_accept_format('json')
# 集群ID。
request.set_ClusterId("C-01A1F4A********")
# 節(jié)點(diǎn)組ID,可通過ListClusterHostGroup接口獲取節(jié)點(diǎn)組ID。
request.set_HostGroupId("G-D11D3E*******")
# 縮容數(shù)量。
request.set_ReleaseNumber(1)
# 可開啟YARN Decommission,目前只允許對(duì)HADOOP集群的Task組開啟。
request.set_EnableGracefulDecommission(True)
request.set_DecommissionTimeout(60)
result = clt.do_action(request)
print(result)
如果執(zhí)行上面代碼返回如下異常信息,則需要修改相關(guān)的配置信息。
控制臺(tái)方式:您可以在EMR控制臺(tái)YARN服務(wù)的配置頁面,搜索參數(shù)yarn.resourcemanager.nodes.exclude-path,修改參數(shù)值為/etc/ecm/hadoop-conf/yarn-exclude.xml。然后配置并部署配置,使配置生效。
代碼方式:您也可以通過以下代碼完成修改。
request = ModifyClusterServiceConfigRequest.ModifyClusterServiceConfigRequest() request.set_accept_format('json') # 返回結(jié)果格式為JSON。 request.set_ClusterId("C-01A1F4A********") request.set_ServiceName("YARN") request.set_ConfigParams('{"yarn-site":{"yarn.resourcemanager.nodes.exclude-path":"/etc/ecm/hadoop-conf/yarn-exclude.xml"}}') request.set_Comment('for decommission gracefully') request.set_RefreshHostConfig(True) result = clt.do_action(request) print(result)
通過實(shí)例ID縮容節(jié)點(diǎn)組
#!/usr/bin/python
from aliyunsdkcore import client
from aliyunsdkemr.request.v20160408 import ReleaseClusterHostGroupRequest
clt = client.AcsClient(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),'cn-hangzhou')
request = ReleaseClusterHostGroupRequest.ReleaseClusterHostGroupRequest()
request.set_accept_format('json')
# 集群ID。
request.set_ClusterId("C-01A1F4A********")
# 節(jié)點(diǎn)組ID,可通過ListClusterHostGroup接口獲取節(jié)點(diǎn)組ID。
request.set_HostGroupId("G-D11D3E*******")
# 可以指定釋放某些ECS,其與ReleaseNumber同時(shí)設(shè)置時(shí)以InstanceIdList為準(zhǔn)。
request.set_InstanceIdList(["i-1**", "i-2**"])
# 可開啟YARN Decommission,目前只允許對(duì)HADOOP集群的Task組開啟。
request.set_EnableGracefulDecommission(True)
# 優(yōu)雅下線超時(shí)時(shí)長(zhǎng),單位為秒。不填寫時(shí)默認(rèn)超時(shí)時(shí)間為3600s。
request.set_DecommissionTimeout(60)
result = clt.do_action(request)
print(result)