Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何使用boto检查EMR现货实例价格历史记录_Python 3.x_Amazon Web Services_Boto3_Amazon Emr - Fatal编程技术网

Python 3.x 如何使用boto检查EMR现货实例价格历史记录

Python 3.x 如何使用boto检查EMR现货实例价格历史记录,python-3.x,amazon-web-services,boto3,amazon-emr,Python 3.x,Amazon Web Services,Boto3,Amazon Emr,我想使用现货定价以编程方式创建一个EMR集群,以实现一些成本节约。为此,我正在尝试使用boto3从AWS检索EMR现货实例定价,但我从boto3了解到的唯一可用API是使用ec2客户端的decribe\u spot\u price\u history调用- EC2的价格并不表示此处所示的EMR的价格-。这些值几乎是EMR的两倍 有没有一种方法可以让我看到类似于EC2的EMR现货价格历史?我已经检查了AWS online关于这一点的文档和其他几页,但没有发现任何东西 这里有一个代码片段,我用它来检

我想使用现货定价以编程方式创建一个EMR集群,以实现一些成本节约。为此,我正在尝试使用boto3从AWS检索EMR现货实例定价,但我从boto3了解到的唯一可用API是使用ec2客户端的
decribe\u spot\u price\u history
调用-

EC2的价格并不表示此处所示的EMR的价格-。这些值几乎是EMR的两倍

有没有一种方法可以让我看到类似于EC2的EMR现货价格历史?我已经检查了AWS online关于这一点的文档和其他几页,但没有发现任何东西

这里有一个代码片段,我用它来检查大致的定价,我可以用它来对EMR实例进行投标

max\u bid\u price=0.140
最低投标价格=最高投标价格
az_选项=“”
响应=ec2.描述现货价格历史(
过滤器=[{
“名称”:“可用区域”,
‘值’:[‘us-east-1a’、‘us-east-1c’、‘us-east-1d’]
},
{
“名称”:“产品说明”,
“值”:[“Linux/UNIX(亚马逊专有网络)”]
}],
InstanceTypes=['r5.2xlarge'],
EndTime=datetime.now(),
StartTime=datetime.now()
)
#待办事项:如果从现有的3个AZ中选择是一个问题,请在其他AZ中添加更多子网
#‘美国东部-1b’、‘美国东部-1e’、‘美国东部-1f’
对于响应中的现货价格历史记录['SpotPriceHistory']:
打印(现货价格历史记录)

如果浮动(现货价格历史['SpotPrice'])没有所谓的EMR现货定价,正如评论中已经提到的那样。现货定价适用于EC2实例。您可以查看AWS spot advisor页面,找出中断率较低的实例类别,并根据这些类别进行选择

自2017年以来,AWS改变了现货定价的算法,“根据长期供需趋势,价格调整更加渐进”,因此您可能不需要查看历史现货价格。更多关于这方面的细节可以找到

现在,你很可能会很好地使用最后一个价格(+delta)的例子。这可以使用以下代码段实现:

def get_bid_price(instancetype, aws_region):
    instance_types = [instancetype]
    start = datetime.now() - timedelta(days=1)

    ec2_client = boto3.client('ec2', aws_region)
    price_dict = ec2_client.describe_spot_price_history(StartTime=start,
                                                        InstanceTypes=instance_types,
                                                        ProductDescriptions=['Linux/UNIX (Amazon VPC)']
                                                        )
    if len(price_dict.get('SpotPriceHistory')) > 0:
        PriceHistory = namedtuple('PriceHistory', 'price timestamp')
        price_list = [PriceHistory(round(float(item.get('SpotPrice')), 3), item.get('Timestamp'))
                      for item in price_dict.get('SpotPriceHistory')]
        price_list.sort(key=lambda tup: tup.timestamp, reverse=True)

        # Maybe add 10 cents to the last spot price
        bid_price = round(float(price_list[0][0] + .01), 3)
        return bid_price
    else:
        raise ValueError('Invalid instance type: {} provided. '
                         'Please provide correct instance type.'.format(instancetype))

当您使用EMR时,它将按EMR价格+每个EC2价格收费。EMR没有现货价格,您可以获得每个节点的现货价格,然后添加EMR随需价格。这是总价。