Docker-高级教程-三-

118 阅读41分钟

Docker 高级教程(三)

原文:Pro Docker

协议:CC BY-NC-SA 4.0

十二、使用 ApacheKafka

Apache Kafka 是一个基于发布-订阅模型的消息传递系统。Kafka 集群由一个或多个称为代理的服务器组成。Kafka 将信息按“主题”分类。生产者产生消息并将消息发布到主题。消费者订阅特定的主题并消费发布到该主题的消息的提要。发布到主题的消息不必在产生时就消费,而是在主题中存储可配置的持续时间。消费者可以选择从一开始就消费主题中的消息。Apache ZooKeeper 服务器用于协调 Kafka 集群。Kafka 式的建筑如图 12-1 所示。

A978-1-4842-1830-3_12_Fig1_HTML.jpg

图 12-1。

Apache Kafka Architecture

Apache Kafka 不直接基于 Apache Hadoop,也不使用 Apache Hadoop。但是 Kafka 可以被用作 Apache 水槽的源头、渠道或水槽。在本章中,我们将利用 Docker 映像在 Docker 容器中运行 Apache Kafka。本章包括以下几节。

  • 设置环境
  • 为 Apache Kafka 启动 Docker 容器
  • 查找 IP 地址
  • 列出 Kafka 的日志
  • 创造一个 Kafka 主题
  • 启动 Kafka 制作人
  • 启动 Kafka 消费者
  • 生产和消费消息
  • 停止和移除 Docker 容器

设置环境

本章需要以下软件。

  • -Docker(版本 1.8)
  • Apache ZooKeeper 的 Docker 映像(最新版本)
  • Apache Kafka 的 Docker 映像(最新版本)

连接到将要安装软件的 Amazon EC2 实例;公共 IP 地址对于不同的用户是不同的。

ssh -i "docker.pem" ec2-user@52.91.168.33

安装 Docker 并启动 Docker 服务。

sudo service docker start

OK 信息表示对接器已经启动,如图 12-2 所示。

A978-1-4842-1830-3_12_Fig2_HTML.jpg

图 12-2。

Starting Docker Service

下载 Apache ZooKeeper 的 Docker 图片dockerkafka/zookeeper

sudo docker pull dockerkafka/zookeeper

Docker 镜像被下载,如图 12-3 所示。

A978-1-4842-1830-3_12_Fig3_HTML.jpg

图 12-3。

Downloading dockerkafka/zookeeper Docker Image

选择下载dockerkafka/zookeeper映像是因为相应的 dockerkafka/kafka 映像也是可用的。也下载 Docker 映像dockerkafka/kafka

sudo  docker pull dockerkafka/kafka

Docker 映像dockerkafka/kafka被下载,如图 12-4 所示。

A978-1-4842-1830-3_12_Fig4_HTML.jpg

图 12-4。

Downloading the dockerkafka/kafka Docker Image

为 Apache Kafka 启动 Docker 容器

我们需要启动 Apache ZooKeeper 和 Apache Kafka 容器,因为 Kafka 集群需要这两个容器。首先,使用下面的docker run命令启动 Apache ZooKeeper 的 Docker 容器,其中 ZooKeeper 的端口设置为 2181。Docker 容器使用–d选项在分离模式下启动。

sudo docker run -d --name zookeeper -p 2181:2181  dockerkafka/zookeeper

接下来,使用dockerkafka/kafka映像启动 Kafka 服务器的 Docker 容器。将 Kafka 服务器的端口指定为 9092,并使用–link参数将 Kafka 容器与运行 ZooKeeper 的容器链接起来。

sudo docker run --name kafka  -p 9092:9092 --link zookeeper:zookeeper  dockerkafka/kafka

docker ps命令列出正在运行的容器。

sudo docker ps

两个容器,一个用于 Apache ZooKeeper,另一个用于 Apache Kafka,如图 12-5 所示。

A978-1-4842-1830-3_12_Fig5_HTML.jpg

图 12-5。

Listing Running Docker Containers

查找 IP 地址

要运行 Kakfa 生产者和消费者,我们需要找到运行 ZooKeeper 的 Docker 容器的 IP 地址和运行 Kafka 服务器的 Docker 容器的 IP 地址。运行以下两个命令来导出ZK_IPKAFKA_IP环境变量。

export ZK_IP=$(sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' zookeeper)

export KAFKA_IP=$(sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' kafka)

随后,回显ZK_IPKAFKA_IP变量。ZK_IP输出为172.17.0.1KAFKA_IP输出为 172.17.0.2,如图 12-6 所示。我们将在后续章节中使用这些 IP 地址。

A978-1-4842-1830-3_12_Fig6_HTML.jpg

图 12-6。

Finding IP Addresses for Zookeeper and Kafka Servers

列出 Kafka 的日志

docker logs命令输出 Docker 容器“kafka”的日志。

sudo docker logs -f kafka

输出表明 Kafka 服务器已经启动,如图 12-7 所示。

A978-1-4842-1830-3_12_Fig7_HTML.jpg

图 12-7。

Listing Kafka Logs

在随后的部分中,我们将创建一个 Kafka 主题,启动一个 Kafka 生产者,启动一个 Kafka 消费者,并在 Kafka 生产者处产生要在 Kafka 主题处发布的消息,并在 Kafka 消费者处消费这些消息。

创造一个 Kafka 主题

首先,我们需要创建一个 Kafka 主题来发布消息。使用以下命令启动交互式终端。

sudo docker exec -it kafka bash

kafka-topics. sh –create命令在交互终端创建一个 Kafka 主题。用–topic选项指定要创建的主题为“测试”。将 ZooKeeper 地址指定为之前获取的 ZooKeeper 的 IP 地址,并在环境变量ZK_IP中设置。将 ZooKeeper 端口指定为 2181。使用--partitions选项将分区数量设置为 1,使用--replication-factor选项将复制因子设置为 1。

kafka-topics.sh --create --topic test --zookeeper 172.17.0.1:2181 --replication-factor 1 --partitions 1

该命令的输出被创建为“测试”主题,如图 12-8 所示。

A978-1-4842-1830-3_12_Fig8_HTML.jpg

图 12-8。

Creating a Kafka topic

启动 Kafka 制作人

接下来,从运行 kafka 服务器的“Kafka”容器的交互终端使用以下命令启动 Kafka 生成器。代理列表被指定为172.17.0.2:9092,其中 IP 地址是之前导出的环境变量KAFKA_IP。Kafka 服务器监听的端口是 9092。通过–topic选项将消息发布的主题设置为“测试”。

kafka-console-producer.sh --topic test --broker-list 172.17.0.2:9092

Kafka producer 控制台启动,如图 12-9 所示。

A978-1-4842-1830-3_12_Fig9_HTML.jpg

图 12-9。

Starting the Kafka Producer

启动 Kafka 消费者

对于 kafka 消费者控制台,我们需要为“Kafka”容器启动另一个交互式终端。

sudo docker exec -it kafka bash

运行以下命令来启动 Kafka 消费者控制台,以使用通过–topic选项指定的发布到“test”主题的消息。ZooKeeper host:port–zookeeper选项设置为172.17.0.1:2181,其中 IP 地址为环境变量ZK_IP,端口为 2181。--from-beginning选项意味着从一开始就要使用消息。

kafka-console-consumer.sh --topic test --from-beginning --zookeeper 172.17.0.1:2181

Kafka 消费者控制台启动,如图 12-10 所示。

A978-1-4842-1830-3_12_Fig10_HTML.jpg

图 12-10。

Starting the Kafka Consumer

生产和消费消息

在本节中,我们将把消息从 Kafka 生产者发布到在我们启动生产者时配置的 Kafka 主题“test ”,并在也订阅了“test”主题的 Kafka 消费者处消费这些消息。

如图 12-11 所示,在制作人控制台发布一条消息“Docker 的 Kafka 你好”。单击 Enter 导航到控制台中的下一行。

A978-1-4842-1830-3_12_Fig11_HTML.jpg

图 12-11。

Producing a Message at the Kafka Producer

发布到“测试”主题的消息在 Kafka 消费者处被消费,并在消费者控制台中被输出,如图 12-12 所示。

A978-1-4842-1830-3_12_Fig12_HTML.jpg

图 12-12。

Consuming Messages at the Consumer

类似地,从 Kafka 生产者发布更多消息到“测试”主题,如图 12-13 所示。

A978-1-4842-1830-3_12_Fig13_HTML.jpg

图 12-13。

Producing More Messages at the Producer

消息在 Kafka 消费者控制台得到输出,如图 12-14 所示。

A978-1-4842-1830-3_12_Fig14_HTML.jpg

图 12-14。

Consumming Messages

停止和移除 Docker 容器

要停止 Docker 容器,运行docker stop命令。按如下方式停止“kafka”容器。

sudo docker stop kafka

“kafka”容器可以用docker rm命令删除。

sudo docker rm kafka

同样,停止并删除 Docker 容器“zookeeper”。

sudo docker stop zookeeper

sudo docker rm zookeeper

摘要

在本章中,我们使用了 Apache ZooKeeper 和 Apache Kafka 的 Docker 容器来运行链接到 Apache ZooKeeper 进程的 Kafka 服务器进程。我们创建了一个 Kafka 主题,启动了一个 Kafka 生产者,启动了一个 Kafka 消费者,从 Kafka 生产者向主题发布消息,并在消费者处消费这些消息。在下一章,我们将讨论使用 Apache Solr 和 Docker。

十三、使用 Apache Solr

Apache Solr 是一个基于 Apache Lucene(一个文本搜索引擎库)的开源搜索平台。Apache Solr 是可伸缩的和可靠的,并提供索引和查询服务。Cloudera 搜索基于 Apache Solr。在本章中,我们将使用 Apache Solr 的官方 Docker 映像在 Docker 容器中运行 Apache Solr。本章包括以下几节。

  • 设置环境
  • 启动 Apache Solr 服务器的 Docker 容器
  • 启动交互式外壳
  • 登录 Solr 管理控制台
  • 创建核心管理索引
  • 加载样本数据
  • 在 Solr 管理控制台中查询 Apache Solr
  • 使用 REST API 客户端查询 Apache Solr
  • 删除数据
  • 列出日志
  • 停止 Apache Solr 服务器

设置环境

本章需要以下软件。

  • -Docker 引擎(版本 1.8)
  • apache solr 的 docker image

我们将使用一个基于 Ubuntu Server 14.04 LTS (HVM)的 Amazon EC2 实例,SSD 卷类型- ami-d05e75b8。使用用户名“ubuntu”和 Amazon EC2 实例的公共 IP 地址登录 Amazon EC2 实例。

ssh -i "docker.pem" ubuntu@54.208.53.110

Amazon EC2 上的 Ubuntu 实例被登录,如图 13-1 所示。

A978-1-4842-1830-3_13_Fig1_HTML.jpg

图 13-1。

Logging in to Ubuntu on AmazonEC2

按照第一章所述,在 Ubuntu 上安装 Docker。启动 Docker 服务。如果 Docker 已经启动,则输出一条消息“start:Job is has running:Docker”。

sudo service docker start

Docker 服务状态可以通过以下命令输出。

sudo service docker status

如图 13-2 所示,输出一条指示 docker 进程正在运行的消息。

A978-1-4842-1830-3_13_Fig2_HTML.jpg

图 13-2。

Starting and Finding Docker Service Status

接下来,用docker pull命令下载 Apache Solr 的官方 Docker 映像。

sudo docker pull solr

如图 13-3 所示下载 Docker 镜像。

A978-1-4842-1830-3_13_Fig3_HTML.jpg

图 13-3。

Downloading Docker Image solr

启动 Apache Solr 服务器的 Docker 容器

要启动 Apache Solr 服务器,请运行docker run命令,并将端口用–p指定为 8983。用–name选项指定容器名为“solr_on_docker”,这是任意的。–d命令参数使 Docker 容器以分离模式运行。

sudo docker run -p 8983:8983  -d --name  solr_on_docker  solr

docker ps命令列出正在运行的 Docker 容器。

sudo docker ps

运行 Apache Solr 的 Docker 容器被列出,包括分配给容器的容器 id,如图 13-4 所示。

A978-1-4842-1830-3_13_Fig4_HTML.jpg

图 13-4。

Starting Docker Container for Apache Solr

运行docker logs命令来输出 Docker 容器的日志。docker 命令中可以使用容器名或容器 id。

sudo docker logs -f 8061f79d1f16

容器日志表明 Apache Solr 服务器已经启动,如图 13-5 所示。

A978-1-4842-1830-3_13_Fig5_HTML.jpg

图 13-5。

Listing Docker Container Log

启动交互式 Shell

以用户“solr”的身份启动 Docker 容器的交互式 shell。

sudo docker exec -it –user=solr solr_on_docker bash

交互式 shell(或 tty)启动,如图 13-6 所示。

A978-1-4842-1830-3_13_Fig6_HTML.jpg

图 13-6。

Starting TTY

Apache Solr 命令可以在交互终端中运行。

登录 Solr 管理控制台

如果运行 Apache Solr 服务器的 Docker 容器运行在不同于管理控制台的主机上,则使用运行 Docker 引擎和 Docker 容器的 Amazon EC2 实例的公共 DNS 名称。从 Amazon EC2 管理控制台获取公共 DNS。公共 DNS 为ec2-54-208-53-110.compute-1.amazonaws.com,如图 13-7 所示。

A978-1-4842-1830-3_13_Fig7_HTML.jpg

图 13-7。

Finding the Public DNS

使用 URL http://ec2-54-208-53-110.compute-1.amazonaws.com:8983/ 访问 Apache Solr 管理控制台。仪表板如图 13-8 所示。

A978-1-4842-1830-3_13_Fig8_HTML.jpg

图 13-8。

Logging in to Solr Admin Console

创建核心索引

接下来,创建一个核心,这是要存储在 Apache Solr 中的数据的索引。从 tty 运行bin/solr create_core命令来创建一个名为gettingstarted的内核。

bin/solr create_core -c gettingstarted

一个名为“gettingstarted”的新内核被创建,如图 13-9 所示。

A978-1-4842-1830-3_13_Fig9_HTML.jpg

图 13-9。

Creating a Core called “gettingstarted”

在 Solr 管理控制台中,选择核心管理,如图 13-10 所示。

A978-1-4842-1830-3_13_Fig10_HTML.jpg

图 13-10。

Selecting Core Admin

在型芯选择器中选择gettingstarted型芯,如图 13-11 所示。

A978-1-4842-1830-3_13_Fig11_HTML.jpg

图 13-11。

Selecting the gettingstarted Core

如图 13-12 所示,在空白处选择概览选项卡。会列出索引统计信息,如版本、文档数、最大文档数和已删除数。

A978-1-4842-1830-3_13_Fig12_HTML.jpg

图 13-12。

Displaying the Overview of the gettingstarted Core

加载样本数据

Apache Solr 支持 XML、JSON 和 CSV 格式的文档索引。我们将使用 XML 格式进行索引。根元素必须是<add/>,并且每个文档必须包含在<doc/>元素中。id字段是必填的。我们将索引下面的 XML 格式文档。将文件存储为solr.xml

<add>

<doc>

<field name="id">SOLR1000</field>

<field name="name">Solr, the Enterprise Search Server</field>

<field name="manu">Apache Software Foundation</field>

<field name="cat">software</field>

<field name="cat">search</field>

<field name="features">Advanced Full-Text Search Capabilities using Lucene</field>

<field name="features">Optimized for High Volume Web Traffic</field>

<field name="features">Standards Based Open Interfaces - XML and HTTP</field>

<field name="features">Comprehensive HTML Administration Interfaces</field>

<field name="features">Scalability - Efficient Replication to other Solr Search Servers</field>

<field name="features">Flexible and Adaptable with XML configuration and Schema</field>

<field name="features">Good unicode support: héllo (hello with an accent over the e)</field>

<field name="price">0</field>

<field name="popularity">10</field>

<field name="inStock">true</field>

<field name="incubationdate_dt">2006-01-17T00:00:00.000Z</field>

</doc>

</add>

将 solr.xml 复制到 Docker 容器中的/opt/solr目录。从 Ubuntu 主机而不是 Docker 容器运行下面的docker cp命令,将solr.xml文档复制到 id 为8061f79d1f16的 Docker 容器,该容器运行 Apache Solr 服务器。容器 id 可以从docker ps命令的输出中获得。

sudo docker cp solr.xml 8061f79d1f16:/opt/solr/solr.xml

solr.xml文档被复制到 Docker 容器中的/opt/solr目录,如图 13-13 所示。

A978-1-4842-1830-3_13_Fig13_HTML.jpg

图 13-13。

Copying solr.xml to DockerContainer

使用以下命令启动交互式终端(tty)。

sudo docker exec -it –user=solr solr_on_docker bash

/opt/solr目录运行以下命令,列出目录中的文件和目录。solr.xml应被列出,如图 13-14 所示。

A978-1-4842-1830-3_13_Fig14_HTML.jpg

图 13-14。

Listing the solr.xml File in Docker Container

运行以下命令将 solr.xml 发布到gettingstarted索引。

bin/post -c gettingstarted ./solr.xml

solr.xml文件被索引,如图 13-15 所示。

A978-1-4842-1830-3_13_Fig15_HTML.jpg

图 13-15。

indexing solr.xml

在 Solr 管理控制台中查询 Apache Solr

可以从 Solr 管理控制台查询索引文档。选择查询页签,如图 13-16 所示。

A978-1-4842-1830-3_13_Fig16_HTML.jpg

图 13-16。

Selecting the Query tab

请求处理程序(qt)应该设置为/select,查询应该设置为*。*选择索引中的所有文件,如图 13-17 所示。起始索引设置为 0,要选择的行数设置为 10。将wt(响应编写器)设置为json,以 JSON 格式返回查询到的文档。其他支持的格式有 XML 和 CSV。

A978-1-4842-1830-3_13_Fig17_HTML.jpg

图 13-17。

The /select Request Handler

点击执行查询,如图 13-18 所示。

A978-1-4842-1830-3_13_Fig18_HTML.jpg

图 13-18。

Clicking on Execute Query

查询结果返回为 JSON,如图 13-19 所示。

A978-1-4842-1830-3_13_Fig19_HTML.jpg

图 13-19。

JSON Response from Query

版本字段被添加到返回的 JSON 文档中,如图 13-20 所示。

A978-1-4842-1830-3_13_Fig20_HTML.jpg

图 13-20。

The version field added automatically

使用 REST API 客户端查询 Apache Solr

Apache Solr 索引的文档也可以使用 REST 客户端访问,比如curl。例如,从“solr”容器的交互终端运行下面的curl命令,查询gettingstarted索引中的所有文档。

curl http://ec2-54-208-53-110.compute-1.amazonaws.com:8983/solr/gettingstarted/select?q=*%3A*&wt=json&indent=true

gettingstarted索引中被索引的所有文档得到如图 13-21 所示的输出。

A978-1-4842-1830-3_13_Fig21_HTML.jpg

图 13-21。

Running a REST Client Query

再比如,查询文档中带有“Lucene”的所有文档。

curl "``http://ec2-54-208-53-110.compute-1.amazonaws.com:8983/solr/gettingstarted/select?wt=json&indent=true&q=Lucene

由于被索引的单个文档中包含“Lucene ”,因此该文档将被返回,如图 13-22 所示。

A978-1-4842-1830-3_13_Fig22_HTML.jpg

图 13-22。

Running a REST Client Query using term ‘Lucene’

要查询具有特定字段文本的文档,请使用q参数中的field=text格式。例如,搜索“名称”字段中带有“Lucene”的所有文档。

curl "``http://ec2-54-208-53-110.compute-1.amazonaws.com:8983/solr/gettingstarted/select?wt=json&indent=true&q=name:Lucene

由于索引中的单个文档的名称字段不包含“Lucene ”,因此没有返回任何文档,如图 13-23 所示。

A978-1-4842-1830-3_13_Fig23_HTML.jpg

图 13-23。

Running a REST Client Query with “Lucene” in “name” Field

还可以使用 REST 客户端执行短语搜索。例如,搜索短语“企业搜索”。

curl "``http://ec2-54-208-53-110.compute-1.amazonaws.com:8983/solr/gettingstarted/select?wt=json&indent=true&q=\"Enterprise+Search

由于单个文档中包含“企业搜索”,因此该文档将返回,如图 13-24 所示。

A978-1-4842-1830-3_13_Fig24_HTML.jpg

图 13-24。

Running a REST Query using a Phrase

删除数据

要删除文档,请运行与发布文档相同的工具,即发布工具。使用 XML <delete><id></id></delete>指定要删除的文档 id。要删除的索引由–c选项指定。

bin/post -c gettingstarted -d "<delete><id>SOLR1000</id></delete>"

如图 13-25 所示,id 为SOLR1000,的被索引的单个文档被删除。

A978-1-4842-1830-3_13_Fig25_HTML.jpg

图 13-25。

Deleting a Single Document

随后,运行与之前相同的 curl 命令来搜索所有文档。

curl http://ec2-54-208-53-110.compute-1.amazonaws.com:8983/solr/gettingstarted/select?q=*%3A*&wt=json&indent=true

没有找到如图 13-26 所示的文件,因为唯一索引的文件已被删除。

A978-1-4842-1830-3_13_Fig26_HTML.jpg

图 13-26。

REST Query does not list any Document after deleting the only document

删除唯一的索引文档后,在 Solr 管理控制台中运行一个查询,没有返回任何文档,如返回的 JSON 文档中的字段值 0 所示,如图 13-27 所示。

A978-1-4842-1830-3_13_Fig27_HTML.jpg

图 13-27。

Query in Sole Admin Console does not list any document after Deleting the only Document

列出日志

Apache Solr 服务器上运行的所有命令的 Docker 容器日志可以使用docker logs命令输出。

sudo docker logs -f solr_on_docker

Docker 容器日志的输出如图 13-28 所示。

A978-1-4842-1830-3_13_Fig28_HTML.jpg

图 13-28。

Listing Docker Container Logs

停止 Apache Solr 服务器

可以用docker ps命令列出正在运行的 Docker 容器。solr_on_docker容器列为运行中,如图 13-29 所示。

A978-1-4842-1830-3_13_Fig29_HTML.jpg

图 13-29。

Listing Running Docker Containers

要停止solr_on_docker容器,运行docker stop命令,如图 13-30 所示。

sudo docker stop solr_on_docker

运行docker ps命令再次列出正在运行的 Docker 容器。solr_on_docker容器没有被列出。

A978-1-4842-1830-3_13_Fig30_HTML.jpg

图 13-30。

Stopping Docker Container for Apache Solr

Docker 映像仍然会用docker images命令列出,如图 13-31 所示。

A978-1-4842-1830-3_13_Fig31_HTML.jpg

图 13-31。

Listing Docker Image for a stopped Docker Container

如果要删除 Docker 映像,首先必须在停止后删除 Docker 容器solr_on_docker

sudo docker rm solr_on_docker

sudo docker rm solr

摘要

在本章中,我们使用 Apache Solr 的官方 Docker 映像在 Docker 容器中运行 Apache Solr 服务器。我们创建了一个核心索引,并向该索引发布了一个文档。随后,我们从 Solr 管理控制台和 REST 客户端工具 curl 查询文档。在下一章,我们将和 Docker 讨论 Apache Spark。

十四、使用 Apache Spark

Apache Spark 是一个用于大型数据集的数据处理引擎。Apache Spark 比 Apache Hadoop MapReduce 快得多(内存快 100 倍)。在集群模式下,Spark 应用作为独立的进程运行,由主程序驱动程序中的SparkContext对象协调。SparkContext可以连接到几种类型的集群管理器,为 Spark 应用分配资源。支持的集群管理器包括独立的集群管理器、Mesos 和 YARN。Apache Spark 旨在访问来自各种数据源的数据,包括 HDFS、Apache HBase 和 NoSQL 数据库,如 Apache Cassandra 和 MongoDB。在这一章中,我们将使用我们用于几个 Apache Hadoop 框架(包括 Apache Hive 和 Apache HBase)的相同的 CDH Docker 映像。我们将使用 Docker 容器中的 YARN cluster manager 在集群模式下运行 Apache Spark Master。

  • 设置环境
  • 运行 CDH 的 Docker 容器
  • 以纱线集群模式运行 Apache Spark 作业
  • 在 yarn-client 模式下运行 Apache Spark 作业
  • 运行 Apache Spark Shell

设置环境

本章需要以下软件。

  • -Docker 引擎(版本 1.8)
  • apache spark 的 docker image

使用 Amazon EC2 实例的公共 IP 地址连接到该实例。公共 IP 地址可以从 Amazon EC2 控制台找到,如附录 a 中所述。

ssh -i "docker.pem" ec2-user@54.208.146.254

启动 Docker 服务并验证状态是否为已启动。

sudo service docker start

sudo service docker status

下载 CDH 的 Docker 镜像,svds/cdh 镜像(如果之前章节没有下载的话)。

sudo docker pull svds/cdh

Docker 镜像 svds/cdh 被下载,如图 14-1 所示。

A978-1-4842-1830-3_14_Fig1_HTML.jpg

图 14-1。

Downloading svds/cdh Docker Image

运行 CDH 的 Docker 容器

使用 Apache Spark 主端口 as 8088 为 CDH 框架启动一个 Docker 容器。

sudo docker run  -p 8088 -d --name cdh svds/cdh

列出正在运行的 Docker 容器。

sudo docker ps

包括 Apache Spark 在内的 cdh 进程启动,容器 CDH 被列为正在运行,如图 14-2 所示。

A978-1-4842-1830-3_14_Fig2_HTML.jpg

图 14-2。

Starting Docker Container for CDH including Apache Spark

为 cdh 容器启动一个交互式终端。

sudo docker exec -it cdh bash

交互终端启动,如图 14-3 所示。

A978-1-4842-1830-3_14_Fig3_HTML.jpg

图 14-3。

Starting the TTY

在 YARN 模式中,Spark 应用可以提交给 yarn-cluster 模式或 yarn-client 模式中的集群。在 yarn-cluster 模式下,Apache Spark 驱动程序运行在一个由 yarn 管理的应用主机中。在纱线客户端模式下。Spark 驱动程序在 YARN 之外的客户端进程中运行,而应用主机仅用于向 YARN 请求资源。根据提交申请的方式,--master参数为yarn-clusteryarn-client。在 yarn-client 模式下,Spark 驱动程序登录到控制台。

我们将使用每种应用提交模式运行 Spark 应用。我们将使用示例应用org.apache.spark.examples.SparkPi

以纱线集群模式运行 Apache Spark 作业

要使用 1000 次迭代在纱线簇模式下提交 Spark 应用SparkPi,运行下面的spark-submit命令,将--master参数作为纱线簇。

spark-submit --master yarn-cluster --class org.apache.spark.examples.SparkPi /usr/lib/spark/examples/lib/spark-examples-1.3.0-cdh5.4.7-hadoop2.6.0-cdh5.4.7.jar 1000

前面的命令从交互终端运行,如图 14-4 所示。

A978-1-4842-1830-3_14_Fig4_HTML.jpg

图 14-4。

Submitting the Spark Application in yarn-cluster Mode

火花应用的输出如图 14-5 所示。

A978-1-4842-1830-3_14_Fig5_HTML.jpg

图 14-5。

Output from Spark Job in yarn-cluster Mode

下面列出了来自spark-submit命令的更详细的输出:

spark-submit --master yarn-cluster --class org.apache.spark.examples.SparkPi /usr/lib/spark/examples/lib/spark-examples-1.3.0-cdh5.4.7-hadoop2.6.0-cdh5.4.7.jar 1000

15/10/23 19:12:52 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

15/10/23 19:12:54 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032

15/10/23 19:12:56 INFO yarn.Client: Requesting a new application from cluster with 1 NodeManagers

15/10/23 19:12:56 INFO yarn.Client: Verifying our application has not requested more than the maximum memory capability of the cluster (8192 MB per container)

15/10/23 19:12:56 INFO yarn.Client: Will allocate AM container, with 896 MB memory including 384 MB overhead

15/10/23 19:12:56 INFO yarn.Client: Setting up container launch context for our AM

15/10/23 19:12:56 INFO yarn.Client: Preparing resources for our AM container

15/10/23 19:12:59 WARN shortcircuit.DomainSocketFactory: The short-circuit local reads feature cannot be used because libhadoop cannot be loaded.

15/10/23 19:12:59 INFO yarn.Client: Uploading resource file:/usr/lib/spark/lib/spark-assembly-1.3.0-cdh5.4.7-hadoop2.6.0-cdh5.4.7.jar -> hdfs://localhost:8020/user/root/.sparkStaging/application_1445627521793_0001/spark-assembly-1.3.0-cdh5.4.7-hadoop2.6.0-cdh5.4.7.jar

15/10/23 19:13:05 INFO yarn.Client: Uploading resource file:/usr/lib/spark/examples/lib/spark-examples-1.3.0-cdh5.4.7-hadoop2.6.0-cdh5.4.7.jar -> hdfs://localhost:8020/user/root/.sparkStaging/application_1445627521793_0001/spark-examples-1.3.0-cdh5.4.7-hadoop2.6.0-cdh5.4.7.jar

15/10/23 19:13:06 INFO yarn.Client: Setting up the launch environment for our AM container

15/10/23 19:13:07 INFO spark.SecurityManager: Changing view acls to: root

15/10/23 19:13:07 INFO spark.SecurityManager: Changing modify acls to: root

15/10/23 19:13:07 INFO spark.SecurityManager: SecurityManager: authentication disabled; ui acls disabled; users with view permissions: Set(root); users with modify permissions: Set(root)

15/10/23 19:13:07 INFO yarn.Client: Submitting application 1 to ResourceManager

15/10/23 19:13:08 INFO impl.YarnClientImpl: Submitted application application_1445627521793_0001

15/10/23 19:13:09 INFO yarn.Client: Application report for application_1445627521793_0001 (state: ACCEPTED)

15/10/23 19:13:09 INFO yarn.Client:

client token: N/A

diagnostics: N/A

ApplicationMaster host: N/A

ApplicationMaster RPC port: -1

queue: root.root

start time: 1445627587658

final status: UNDEFINED

tracking URL: http://4b4780802318:8088/proxy/application_1445627521793_0001/

user: root

15/10/23 19:13:10 INFO yarn.Client: Application report for application_1445627521793_0001 (state: ACCEPTED)

15/10/23 19:13:11 INFO yarn.Client: Application report for application_1445627521793_0001 (state: ACCEPTED)

15/10/23 19:13:24 INFO yarn.Client: Application report for application_1445627521793_0001 (state: RUNNING)

15/10/23 19:13:24 INFO yarn.Client:

client token: N/A

diagnostics: N/A

ApplicationMaster host: 4b4780802318

ApplicationMaster RPC port: 0

queue: root.root

start time: 1445627587658

final status: UNDEFINED

tracking URL: http://4b4780802318:8088/proxy/application_1445627521793_0001/

user: root

15/10/23 19:13:25 INFO yarn.Client: Application report for application_1445627521793_0001 (state: RUNNING)

15/10/23 19:13:26 INFO yarn.Client: Application report for

15/10/23 19:13:51 INFO yarn.Client: Application report for application_1445627521793_0001 (state: FINISHED)

15/10/23 19:13:51 INFO yarn.Client:

client token: N/A

diagnostics: N/A

ApplicationMaster host: 4b4780802318

ApplicationMaster RPC port: 0

queue: root.root

start time: 1445627587658

final status: SUCCEEDED

tracking URL: http://4b4780802318:8088/proxy/application_1445627521793_0001/A

user: root

在纱线聚类模式下,Spark 应用结果不会输出到控制台,如果最终状态为SUCCEEDED,则必须使用浏览器中的跟踪 URL http://4b4780802318:8088/proxy/application_1445627521793_0001/AResourceManager访问纱线容器日志。

在 yarn-client 模式下运行 Apache Spark 作业

要在 yarn-client 模式下提交使用 1000 次迭代的 Spark 应用SparkPi,运行下面的spark-submit命令,将--master参数作为 yarn-client。

spark-submit

--master yarn-client

--class org.apache.spark.examples.SparkPi

/usr/lib/spark/examples/lib/spark-examples-1.3.0-cdh5.4.7-hadoop2.6.0-cdh5.4.7.jar

1000

火花提交命令的输出如图 14-6 所示。

A978-1-4842-1830-3_14_Fig6_HTML.jpg

图 14-6。

Submitting Spark Application in yarn-client Mode

来自 Apache Spark 应用的更详细的输出如下所示,其中包括近似计算的 Pi 值。

spark-submit --master yarn-client --class org.apache.spark.examples.SparkPi /usr/lib/spark/examples/lib/spark-examples-1.3.0-cdh5.4.7-hadoop2.6.0-cdh5.4.7.jar 1000

15/10/23 19:15:19 INFO spark.SparkContext: Running Spark version 1.3.0

15/10/23 19:15:43 INFO cluster.YarnScheduler: Adding task set 0.0 with 1000 tasks

15/10/23 19:15:43 INFO scheduler.TaskSetManager: Starting task 0.0 in stage 0.0 (TID 0, 4b4780802318, PROCESS_LOCAL, 1353 bytes)

15/10/23 19:15:43 INFO scheduler.TaskSetManager: Starting task 1.0 in stage 0.0 (TID 1, 4b4780802318, PROCESS_LOCAL, 1353 bytes)

15/10/23 19:15:57 INFO scheduler.TaskSetManager: Finished task 999.0 in stage 0.0 (TID 999) in 22 ms on 4b4780802318 (999/1000)

15/10/23 19:15:57 INFO scheduler.TaskSetManager: Finished task 998.0 in stage 0.0 (TID 998) in 28 ms on 4b4780802318 (1000/1000)

15/10/23 19:15:57 INFO cluster.YarnScheduler: Removed TaskSet 0.0, whose tasks have all completed, from pool

15/10/23 19:15:57 INFO scheduler.DAGScheduler: Stage 0 (reduce at SparkPi.scala:35) finished in 14.758 s

15/10/23 19:15:57 INFO scheduler.DAGScheduler: Job 0 finished: reduce at SparkPi.scala:35, took 15.221643 s

Pi is roughly 3.14152984

运行 Apache Spark Shell

Apache Spark shell 在 yarn-client 模式下启动,如下所示。

spark-shell --master yarn-client

显示如图 14-7 所示的scala>命令提示符。Spark 上下文被创建并作为“sc”可用。SQL 上下文也可以作为“SQL context”使用。

A978-1-4842-1830-3_14_Fig7_HTML.jpg

图 14-7。

The scala> Command Prompt

spark-shell命令更详细的输出如下。

root@4b4780802318:/# spark-shell --master yarn-client

15/10/23 19:17:16 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

15/10/23 19:17:16 INFO spark.SecurityManager: Changing view acls to: root

15/10/23 19:17:16 INFO spark.SecurityManager: Changing modify acls to: root

15/10/23 19:17:16 INFO spark.SecurityManager: SecurityManager: authentication disabled; ui acls disabled; users with view permissions: Set(root); users with modify permissions: Set(root)

15/10/23 19:17:16 INFO spark.HttpServer: Starting HTTP Server

15/10/23 19:17:16 INFO server.Server: jetty-8.y.z-SNAPSHOT

15/10/23 19:17:16 INFO server.AbstractConnector: Started SocketConnector@0.0.0.0:56899

15/10/23 19:17:16 INFO util.Utils: Successfully started service 'HTTP class server' on port 56899.

Welcome to

____              __

/ __/__  ___ _____/ /__

_\ \/ _ \/ _ / __/  '_/`

/___/ .__/\_,_/_/ /_/\_\   version 1.3.0

/_/

Using Scala version 2.10.4 (OpenJDK 64-Bit Server VM, Java 1.7.0_79)

Type in expressions to have them evaluated.

Type :help for more information.

15/10/23 19:17:22 INFO spark.SparkContext: Running Spark version 1.3.0

15/10/23 19:17:45 INFO repl.SparkILoop: Created spark context..

Spark context available as sc.

15/10/23 19:17:45 INFO repl.SparkILoop: Created sql context (with Hive support)..

SQL context available as sqlContext.

15/10/23 19:17:45 INFO storage.BlockManagerMasterActor: Registering block manager 4b4780802318:48279 with 530.3 MB RAM, BlockManagerId(2, 4b4780802318, 48279)

scala>

运行下面的 Scala 脚本,它由一个 Hello World 程序的 Spark shell 中的HelloWorld模块组成。

object HelloWorld {

def main(args: Array[String]) {

println("Hello, world!")

}

}

HelloWorld.main(null)

Scala 脚本的输出如图 14-8 所示。

A978-1-4842-1830-3_14_Fig8_HTML.jpg

图 14-8。

Output from Scala Script

摘要

在本章中,我们使用 spark-submit 命令在 Docker 容器中的 YARN 集群上运行了 Apache Spark 应用。我们以 yarn-cluster 和 yarn-client 模式提交了示例应用。我们还在 Spark shell 中运行了一个HelloWorld Scala 脚本。

这一章结束了关于 Docker 的书。除了在 Docker 上运行一些常用的软件,我们还讨论了主要的 Docker 管理任务,例如安装 Docker、下载 Docker 映像、创建和运行 Docker 容器、启动交互式 shell、在交互式 shell 中运行命令、列出 Docker 容器、列出 Docker 容器日志、停止 Docker 容器以及删除 Docker 容器和 Docker 映像。在本书的范围内,只有一些软件应用可以被讨论。在 https://hub.docker.com/ 的 Docker hub 上还有更多 Docker 图片。

十五、使用亚马逊 EC2

亚马逊网络服务(AWS)提供各种服务,亚马逊弹性计算云(Amazon EC2)就是其中之一。Amazon EC2 可用于创建虚拟主机服务器。Amazon EC2 在创建虚拟服务器时提供了大量实例 ami(Amazon 机器映像)供选择。在本附录中,我们将讨论创建和配置 Amazon EC2 实例以安装 Docker 和 Docker 映像。Amazon EC2 实例不是运行 Docker 软件的必要条件,可以使用本地或远程的替代平台。

  • 创建 Amazon EC2 实例
  • 创建密钥对
  • 启动 Amazon EC2 实例
  • 连接到 Amazon EC2 实例
  • 查找公共 IP 地址
  • 查找公共 DNS
  • 添加默认安全组
  • 停止 Amazon EC2 实例
  • 更改实例类型

创建 Amazon EC2 实例

我们已经使用基于 Linux 的 Amazon EC2 实例来部署 Docker 和 Docker 映像。Amazon EC2 不是必需的,可以使用本地 Linux 安装等替代方法。Linux 平台需要支持 64 位软件。我们使用了两种不同的 64 位(必需的)ami:

Ubuntu Server 14.04 LTS (HVM), SSD Volume Type - ami-d05e75b8 64 bit   Red Hat Enterprise Linux version 7.1 (HVM), EBS General Purpose (SSD) Volume Type (ami-12663b7a) 64 bit  

要创建一个 Amazon EC2 实例,需要一个 Amazon Web Services 帐户,可以在 https://aws.amazon.com/getting-started/?nc2=h_l2_cc 创建。要创建一个 Amazon EC2 实例,请导航到 https://aws.amazon.com/ec2/ 并点击登录控制台。从列出的 Amazon Web Services 中选择 EC2。点击实例➤实例,列出账户中已经创建的 Amazon EC2 实例。单击 Launch Instance 创建一个新的 Amazon EC2 实例,如图 A-1 所示。

A978-1-4842-1830-3_15_Fig1_HTML.jpg

图 A-1。

Launching an Amazon EC2 Instance

选择要从中创建虚拟服务器的 AMI。一些非盟驻苏特派团有资格获得免费等级。比如选择 Ubuntu AMI,如图 A-2 所示。

A978-1-4842-1830-3_15_Fig2_HTML.jpg

图 A-2。

Selecting an AMI

在选择实例类型时,根据支持的容量和虚拟 CPU(vcpu)等功能的不同,可以使用不同的类型。选择一种实例类型,例如通用➤ t2.micro,然后单击查看并启动,如图 A-3 所示。

A978-1-4842-1830-3_15_Fig3_HTML.jpg

图 A-3。

Review and Launch

在审核实例启动中点击启动,如图 A-4 所示。

A978-1-4842-1830-3_15_Fig4_HTML.jpg

图 A-4。

Launch

将显示一个对话框,用于创建或选择现有的密钥对。授权需要密钥对。要创建新的密钥对,选择“创建新的密钥对”选项,如图 A-5 所示。

A978-1-4842-1830-3_15_Fig5_HTML.jpg

图 A-5。

Selecting “Create a new key pair”

指定密钥对名称并点击下载密钥对,如图 A-6 所示。密钥对被创建和下载。连接到实例时需要在创建实例时为 Amazon EC2 实例选择的密钥对,这将在本附录的后面讨论。

A978-1-4842-1830-3_15_Fig6_HTML.jpg

图 A-6。

Download Key Pair

或者,选择“选择一个现有的密钥对”选项,并点击如图 A-7 所示的启动实例。

A978-1-4842-1830-3_15_Fig7_HTML.jpg

图 A-7。

Choose an existing Key Pair

将显示启动状态。点击实例 id,显示如图 A-8 所示的实例。

A978-1-4842-1830-3_15_Fig8_HTML.jpg

图 A-8。

Launch Status

该实例被列出,并且最初处于“挂起”状态,如图 A-9 所示。

A978-1-4842-1830-3_15_Fig9_HTML.jpg

图 A-9。

Amazon EC2 Instance in Pending State

当一个实例完全启动后,实例状态变为“正在运行”,如图 A-10 所示。

A978-1-4842-1830-3_15_Fig10_HTML.jpg

图 A-10。

Running Instance

创建密钥对

如前所述,连接 Amazon EC2 实例需要一个密钥对。密钥对可以在创建实例时创建,也可以单独创建。要创建密钥对,请分别选择网络和安全➤密钥对,如图 A-11 所示。

A978-1-4842-1830-3_15_Fig11_HTML.jpg

图 A-11。

Network & Security ➤ Key Pairs

列出已经创建的密钥对。可以通过选择密钥对并点击删除来删除密钥对。在如图 A-12 所示的对话框中点击是。

A978-1-4842-1830-3_15_Fig12_HTML.jpg

图 A-12。

Delete Key Pair

要创建新的密钥对,点击创建密钥对,如图 A-13 所示。

A978-1-4842-1830-3_15_Fig13_HTML.jpg

图 A-13。

Create Key Pair

指定一个密钥对名称并点击创建按钮,如图 A-14 所示。

A978-1-4842-1830-3_15_Fig14_HTML.jpg

图 A-14。

Create Button

如图 A-15 所示,创建一个新的密钥对。

A978-1-4842-1830-3_15_Fig15_HTML.jpg

图 A-15。

New Key Pair

启动 Amazon EC2 实例

当创建一个新的 Amazon EC2 实例并选择 Launch 时,该实例就会启动。可以通过选中实例旁边的复选框并选择操作➤实例状态➤启动来启动已停止的实例,如图 A-16 所示。

A978-1-4842-1830-3_15_Fig16_HTML.jpg

图 A-16。

Actions ➤ Instance State ➤ Start

在启动实例对话框中点击是,启动如图 A-17 所示。

A978-1-4842-1830-3_15_Fig17_HTML.jpg

图 A-17。

Starting an instance

连接到 Amazon EC2 实例

已经启动的实例可以从本地机器(例如本地 Linux 实例)连接到,而没有与所连接的实例一样多的 RAM 和不同的 Linux 发行版。如图 A-18 所示,可以通过点击 connect 来获得用于连接正在运行的实例的 ssh 命令。

A978-1-4842-1830-3_15_Fig18_HTML.jpg

图 A-18。

Connect

在“连接到实例”对话框中,将显示 ssh 命令。“docker.pem”是用于创建实例的密钥对,也下载到 Amazon EC2 实例要连接的本地实例。ubuntu 实例的用户名是“Ubuntu”,如图 A-19 所示,而 Red Hat 实例的用户名是“ec2-user”。

A978-1-4842-1830-3_15_Fig19_HTML.jpg

图 A-19。

Connect To Your Instance dialog

ssh 命令中显示的 IP 地址是 Amazon EC2 实例的公共 IP 地址。

查找公共 IP 地址

公共 IP 地址也可以从 EC2 控制台获得,如图 A-20 所示。

A978-1-4842-1830-3_15_Fig20_HTML.jpg

图 A-20。

Public IP Address

查找公共 DNS

要从远程浏览器连接到 Amazon EC2 实例流程,比如第一章中的HelloWorld应用,需要公共 DNS。公共 DNS 也可以从 EC2 管理控制台获得,如图 A-21 所示。

A978-1-4842-1830-3_15_Fig21_HTML.jpg

图 A-21。

Public DNS

公共 DNS 最初可能不会显示。要显示公共 DNS,在 EC2 管理控制台中选择服务➤ VPC,如图 A-22 所示。VPC 是分配给用户的虚拟私有云。

A978-1-4842-1830-3_15_Fig22_HTML.jpg

图 A-22。

Services ➤ VPC

在 VPC 仪表板中,选择您的 VPC,如图 A-23 所示。

A978-1-4842-1830-3_15_Fig23_HTML.jpg

图 A-23。

Your VPCs

选择如图 A-24 所示的 VPC 列表。

A978-1-4842-1830-3_15_Fig24_HTML.jpg

图 A-24。

Selecting the VPC

从操作中,选择编辑 DNS 主机名,如图 A-25 所示。

A978-1-4842-1830-3_15_Fig25_HTML.jpg

图 A-25。

Edit DNS Hostnames

在编辑 DNS 主机名对话框中,为 DNS 主机名选择是,并点击保存,如图 A-26 所示。

A978-1-4842-1830-3_15_Fig26_HTML.jpg

图 A-26。

Edit DNS Hostnames Dialog

添加默认安全组

为了能够从远程浏览器进行连接,需要设置入站和出站规则,以允许来自任何来源、在 0-65535 范围内的所有端口上使用任何协议的所有流量。“默认”安全组默认配置为允许所有流量。我们需要将“默认”安全组分配给运行 Docker 的 Amazon EC2 实例。选择实例,然后选择操作➤网络➤更改安全组,如图 A-27 所示。

A978-1-4842-1830-3_15_Fig27_HTML.jpg

图 A-27。

Actions ➤ Networking ➤ Change Security Groups

在更改安全组面板中,可能没有选择“默认”组,如图 A-28 所示。

A978-1-4842-1830-3_15_Fig28_HTML.jpg

图 A-28。

The “default” group not selected

选择“默认”安全组的复选框,并点击分配安全组,如图 A-29 所示。

A978-1-4842-1830-3_15_Fig29_HTML.jpg

图 A-29。

Assign Security Groups

默认的安全组被分配给 Amazon EC2 实例。要查找可用的安全组及其入站/出站规则,请单击网络与安全➤安全组,如图 A-30 所示。

A978-1-4842-1830-3_15_Fig30_HTML.jpg

图 A-30。

Network & Security ➤ Security Groups

应该列出“默认”安全组。选择“默认”组。选择入站选项卡。类型应该列为“所有流量”,协议应该列为“所有”,端口范围应该列为“所有”,源应该列为 0.0.0.0。要编辑入站规则,点击入站➤编辑,如图 A-31 所示。

A978-1-4842-1830-3_15_Fig31_HTML.jpg

图 A-31。

Inbound ➤ Edit

入站规则将显示出来,并应保持默认设置,如图 A-32 所示。点击保存。

A978-1-4842-1830-3_15_Fig32_HTML.jpg

图 A-32。

Edit inbound rules dialog

同样,选择出站选项卡。类型应列为“所有流量”,协议应列为“所有”,端口范围应列为“所有”,目的地应列为 0.0.0.0。点击编辑,如图 A-33 所示。

A978-1-4842-1830-3_15_Fig33_HTML.jpg

图 A-33。

Outbound ➤ Edit

将显示出站规则的默认设置,并应保持默认设置,如图 A-34 所示。点击保存。

A978-1-4842-1830-3_15_Fig34_HTML.jpg

图 A-34。

Edit outbound rules dialog

分配给实例的安全组列在安全组列中,如图 A-35 所示。

A978-1-4842-1830-3_15_Fig35_HTML.jpg

图 A-35。

Security Groups column

停止 Amazon EC2 实例

要停止一个 Amazon EC2 实例,请选择该实例,然后选择 Actions ➤实例状态➤停止,如图 A-36 所示。

A978-1-4842-1830-3_15_Fig36_HTML.jpg

图 A-36。

Actions ➤ Instance State ➤ Stop

可以选择多个实例并一起停止,如图 A-37 所示。

A978-1-4842-1830-3_15_Fig37_HTML.jpg

图 A-37。

Stopping Multiple Instances

在停止实例对话框中,点击是,停止如图 A-38 所示。

A978-1-4842-1830-3_15_Fig38_HTML.jpg

图 38。

Stop Instance dialog

实例被停止。

更改实例类型

要增加或减少实例的容量,可能需要更改实例类型,例如从微型实例更改为中型实例。在更改实例类型之前,必须首先停止实例,然后在修改类型之后重新启动实例。要更改实例类型,请选择实例并选择操作➤实例设置➤更改实例类型,如图 A-39 所示。

A978-1-4842-1830-3_15_Fig39_HTML.jpg

图 39。

Actions ➤ Instance Settings ➤ Change Instance Type

在 Change Instance Type 对话框中,选择要应用的实例类型,例如 m3.medium,如图 A-40 所示。

A978-1-4842-1830-3_15_Fig40_HTML.jpg

图 A-40。

Change Instance Type dialog

点击应用,如图 A-41 所示。

A978-1-4842-1830-3_15_Fig41_HTML.jpg

图 A-41。

Applying a new Instance Type

实例类型升级到 m3.medium,如图 A-42 所示。请记住,升级实例类型可能会使该实例不符合空闲层的条件。

A978-1-4842-1830-3_15_Fig42_HTML.jpg

图 A-42。

Upgraded Instance Type

摘要

在附录 A 中,我们讨论了基于 AMI 创建 Amazon EC2 实例、启动实例、连接实例、查找公共 IP 地址、查找公共 DNS、更改实例类型和停止实例。