简体   繁体   English

如何获取 AWS EMR 的实例列表?

[英]How to get the list of instances for AWS EMR?

Why is the list for EC2 different from the EMR list?为什么 EC2 的列表与 EMR 列表不同?

EC2: https://aws.amazon.com/ec2/spot/pricing/ EC2: https : //aws.amazon.com/ec2/spot/pricing/

EMR: https://aws.amazon.com/emr/pricing/ EMR: https : //aws.amazon.com/emr/pricing/

Why are not all the types of instances from the EC2 available for EMR?为什么不是所有类型的 EC2 实例都可用于 EMR? How to get this special list?如何获得这份特别名单?

In case your question is not about the amazon console如果您的问题与亚马逊控制台无关
(then it would surely be closed as off-topic ): (那么它肯定会被关闭为题外话):

As a programming solution, you are looking something like this: ( using python boto3 )作为编程解决方案,您看起来像这样:(使用 python boto3

import boto3
client = boto3.client('emr')
for instance in client.list_instances():
  print("Instance[%s] %s"%(instance.id, instance.name))

This is what I use, although I'm not 100% sure it's accurate (because I couldn't find documentation to support some of my choices (-BoxUsage, etc.)).这就是我使用的,虽然我不是 100% 确定它是准确的(因为我找不到文档来支持我的一些选择(-BoxUsage 等))。

It's worth looking through the responses from AWS in order to figure out what the different values are for different fields in the pricing client responses.值得查看来自 AWS 的响应,以找出定价客户端响应中不同字段的不同值。

Use the following to get the list of responses:使用以下命令获取响应列表:

   default_profile = boto3.session.Session(profile_name='default')
    # Only us-east-1 has the pricing API
    # - https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/pricing.html
    pricing_client = default_profile.client('pricing', region_name='us-east-1')
    service_name = 'ElasticMapReduce'
    product_filters = [
        {'Type': 'TERM_MATCH', 'Field': 'location', 'Value': aws_region_name}
    ]
    response = pricing_client.get_products(
        ServiceCode=service_name,
        Filters=product_filters,
        MaxResults=100
    )
    response_list.append(response)

    num_prices = 100
    while 'NextToken' in response:
       # re-query to get next page

Once you've gotten the list of responses, you can then filter out the actual instance info:获得响应列表后,您可以过滤掉实际的实例信息:

  emr_prices = {}
  for response in response_list:
      for price_info_str in response['PriceList']:
          price_obj = json.loads(price_info_str)
          attributes = price_obj['product']['attributes']

          # Skip pricing info that doesn't specify a (EC2) instance type
          if 'instanceType' not in attributes:
              continue
          inst_type = attributes['instanceType']

          # AFAIK, Only usagetype attributes that contain the string '-BoxUsage' are the ones that contain the prices that we would use (empirical research)
          # Other examples of values are <REGION-CODE>-M3BoxUsage, <REGION-CODE>-M5BoxUsage, <REGION-CODE>-M7BoxUsage (no clue what that means.. )
          if '-BoxUsage' not in attributes['usagetype']:
              continue

          if 'OnDemand' not in price_obj['terms']:
              continue

          on_demand_info = price_obj['terms']['OnDemand']
          price_dim = list(list(on_demand_info.values())[0]['priceDimensions'].values())[0]
          emr_price = Decimal(price_dim['pricePerUnit']['USD'])

          emr_prices[inst_type] = emr_price

Realistically, it's straightforward enough to figure this out from the boto3 docs.实际上,从 boto3 文档中弄清楚这一点很简单。 In particular, the get_products documentation.特别是get_products文档。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM