Hadoop-现代大数据处理-三-

111 阅读1小时+

Hadoop 现代大数据处理(三)

原文:Modern big data processing with Hadoop

协议:CC BY-NC-SA 4.0

九、设计数据可视化解决方案

一旦我们拥有了 Hadoop 生态系统中的数据并对其进行了处理,下一个合乎逻辑的步骤就是构建驱动业务决策的分析。

在本章中,我们将学习以下主题:

  • 数据可视化
  • Apache 德鲁伊
  • Apache superset(Apache super set)

数据可视化

数据可视化是通过图形方式理解原始数据中各种实体之间关系的过程。这是一项非常强大的技术,因为它使最终用户能够以非常简单的形式获得消息,而无需了解底层数据。

数据可视化在大数据洞察的可视化交流中发挥着非常重要的作用。这既是一门艺术,也是一门科学,在理解数据方面需要一些努力;同时,我们也需要对目标受众有所了解。

到目前为止,我们已经看到任何类型的数据都可以存储在 Hadoop 文件系统 ( HDFS )中。为了将复杂的数据结构转换成可视化的形式,我们需要了解用于表示数据的标准技术。

在数据可视化中,信息以图形的形式传达给最终用户,这些图形可以是 1D、2D、三维甚至更高维度。这完全取决于我们试图传达的意思。

让我们看一下用于向用户传达视觉信息的标准图形:

  • 条形图/柱形图
  • 折线图/面积图
  • 圆形分格统计图表
  • 雷达图
  • 散点图/气泡图
  • 标签云
  • 泡泡图

条形图/柱形图

这是数据的 2D 图形表示,其中数据点显示为垂直/水平条。每个条代表一个数据点。当数据点不涉及时间维度时,这些点的显示顺序可能不会有任何不同。当我们处理用于表示条形图的时间序列数据时,我们通常遵循沿 X(水平)轴显示的时间顺序。

让我们看一下由四个数据点生成的示例图表。数据代表每个用户拥有的数量:

解读:图中既有行和列的文本数据,也有视觉效果。如果仔细观察,文本数据的大小更小,只有四条记录。但是视觉图形在不了解任何数据的情况下直接传达了信息。

图表传达的信息是:

  • 西塔比所有人都有钱
  • 吉塔的钱最少

其他解释也是可能的。它们留给读者。

折线图/面积图

这也是典型的 2D 图表,其中每个数据点都表示为画布上的一个点,并且属于同一数据集的所有这些点都用一条线连接起来。当从水平/垂直轴到直线的区域被完全覆盖时,该图表成为面积图。

同一图形中可以有多条线,表示同一实体的多个数据系列。

让我们根据与之前相同的数据来看一下这个面积图的示例:

这些是图表的属性:

  • x 轴有所有人的列表
  • y 轴表示从 0100 的量
  • 图表上四个地方画有点,对应于表格形式的值
  • 点是用直线连接的
  • 该区域填充在线下方,使其成为面积图

圆形分格统计图表

这也是一个 2D 图表,绘制成一个圆圈中的多个扇区。当我们想要突出所有数据点的相对重要性时,此图表非常有用。

让我们看一下使用与之前相同的数据集绘制的示例图表,以便更好地理解它:

如你所见,很容易理解使用这张图表的每个人所拥有的金额的相对重要性。

得出的结论与前面的图表相似。但是图是一个简单的圆,这里没有多个维度给用户增加负担。

雷达图

这也是一个 2D 图形,其中数据轴是等距扇区的边缘(像饼图的边缘)。当我们想要了解每个数据点的相对重要性的多维度时,此图非常有用。

为了更好地理解这个图表,让我们看一下这个样本数据和图表:

数据由八列组成:

  • 第一列:所有用户列表
  • 第二栏至第八栏:一周中的天数以及当天每人拥有的美元

我们想画一张图表,向我们展示以下内容:

  • 每天总美元数
  • 每个人每天拥有的美元

我们已经在雷达图中绘制了所有这些信息,其中轴是扇区(天),上限为 400 的最大值。每个用户的价值被一个接一个地画出来,这样我们就知道总价值,而不是相对价值(这类似于面积叠加)。

散点图/气泡图

散点图可以是多维图形。当我们沿着轴渲染画布上对应于数值的每个数据点时,这是一个更容易理解的图形。该图有助于理解轴上每个点的相对重要性。

气泡图是散点图的变体,画布上的点将数值显示为大气泡(表示其重要性)。

让我们用这个例子来看看这两个图形:

左侧的图形是气泡图,右侧的图形是散点图。

让我们看看生成的数据和图表。

输入数据:

  • 由五行组成,而我们在列中有销售产品数量

用气泡图:

  • y 轴显示产品数量
  • x 轴只是位置轴,并不反映输入数据的值
  • 画布上的每个点都显示了与产品数量相对应的销售额

使用散点图:

  • y 轴显示完成的销售额
  • x 轴显示销售的产品
  • 画布上的每个点显示输入中的每一行

其他图表

还有许多其他类型的图形可能在本节中没有涉及,但值得在d3js.org网站上探索。这将使您了解如何表示数据,以便向用户传达非常好的信息。

Hadoop 中的实用数据可视化

Hadoop 拥有丰富的数据源和应用生态系统,可以帮助我们构建丰富的可视化。在接下来的章节中,我们将了解两个这样的应用:

  • Apache 德鲁伊
  • Apache superset(Apache super set)

我们还将学习如何使用 Apache 超集处理关系数据库(如 MySQL)中的数据。

Apache 德鲁伊

Apache Druid 是一个分布式、高性能的柱状商店。其官网为 druid.io

Druid 允许我们存储实时和历史数据,本质上是时间序列。它还提供了快速的数据聚合和灵活的数据探索。该架构支持以千兆字节大小存储数万亿个数据点。

为了更好的了解德鲁伊建筑,请参考static.druid.io/docs/druid.…的这份白皮书。

德鲁伊组件

让我们快速了解一下德鲁伊集群的不同组件:

| 组件 | 描述 | | 德鲁伊经纪人 | 这些节点知道数据在集群中的位置。这些节点由应用/客户端联系,以获取德鲁伊内部的数据。 | | 德鲁伊协调员 | 这些节点管理历史节点上的数据(加载、删除和负载平衡数据)。 | | 德鲁伊霸主 | 该组件负责接受任务并返回任务的状态。 | | 德鲁伊路由器 | 当数据量在万亿字节或更高范围时,需要这些节点。这些节点将请求路由到代理。 | | 德鲁伊历史 | 这些节点存储不可变的段,是德鲁伊集群的骨干。它们服务于加载段、删除段,并服务于对段请求的查询。 |

其他所需组件

下表列出了其他几个必需的组件:

| 组件 | 描述 | | 动物园管理员 | Apache Zookeeper 是一个高度可靠的分布式协调服务 | | 元数据存储 | MySQL 和 PostgreSQL 是流行的关系数据库系统,用于跟踪所有部门、主管、任务和配置 |

Apache Druid 安装

Apache Druid 可以独立安装,也可以作为 Hadoop 集群的一部分安装。在本节中,我们将看到如何通过 Apache Ambari 安装 Druid。

adservice

首先,我们调用 Hadoop 集群中服务列表下方的操作下拉列表。

屏幕如下所示:

选择德鲁伊和超集

在这个设置中,我们将同时安装德鲁伊和超集。超集是可视化应用,我们将在下一步中了解它。

选择屏幕如下所示:

选择两种服务后,单击下一步。

服务器上的服务放置

在这一步中,我们将可以选择安装应用的服务器。为此,我选择了节点 3。您可以选择任何想要的节点。

屏幕看起来像这样:

更改完成后,单击下一步。

选择奴隶和客户

在这里,我们可以选择为安装的组件选择需要从属节点和客户端的节点。我留下了已经为我选择的选项:

服务配置

在这一步中,我们需要为德鲁伊和超集应用使用的元数据存储选择数据库、用户名和密码。随意选择默认的。我给了 MySQL 作为他们两个的后端存储。

屏幕如下所示:

一旦更改看起来不错,点击屏幕底部的“下一步”按钮。

服务安装

在此步骤中,应用将自动安装,状态将在计划结束时显示。

安装完成后,单击下一步。对当前屏幕的更改如下所示:

安装摘要

一旦一切顺利完成,我们会看到一个已经完成的总结。完成后,单击完成:

将样本数据摄入 Druid

一旦我们的 Hadoop 集群中运行了所有与 Druid 相关的应用,我们就需要一个样本数据集,为了运行一些分析任务,我们必须加载该数据集。

让我们看看如何加载样本数据。从网上下载德鲁伊档案:

[druid@node-3 ~$ curl -O http://static.druid.io/artifacts/releases/druid-0.12.0-bin.tar.gz
% Total % Received % Xferd Average Speed Time Time Time Current
                               Dload Upload Total Spent Left Speed
100 222M 100 222M 0 0 1500k 0 0:02:32 0:02:32 --:--:-- 594k

提取档案:

[druid@node-3 ~$ tar -xzf druid-0.12.0-bin.tar.gz

将示例维基百科数据复制到 Hadoop:

[druid@node-3 ~]$ cd druid-0.12.0
[druid@node-3 ~/druid-0.12.0]$ hadoop fs -mkdir /user/druid/quickstart
[druid@node-3 ~/druid-0.12.0]$ hadoop fs -put quickstart/wikiticker-2015-09-12-sampled.json.gz /user/druid/quickstart/

提交导入请求:

[druid@node-3 druid-0.12.0]$ curl -X 'POST' -H 'Content-Type:application/json' -d @quickstart/wikiticker-index.json localhost:8090/druid/indexer/v1/task;echo
{"task":"index_hadoop_wikiticker_2018-03-16T04:54:38.979Z"}

这一步之后,德鲁伊会自动将数据导入到德鲁伊集群中,进度可以在霸王控制台看到。

该界面可通过http://<overlord-ip>:8090/console.html访问。屏幕如下所示:

一旦摄取完成,我们将看到作业状态为成功。

In case of FAILED imports, please make sure that the backend that is configured to store the Metadata for the Druid cluster is up and running. Even though Druid works well with the OpenJDK installation, I have faced a problem with a few classes not being available at runtime. In order to overcome this, I have had to use Oracle Java version 1.8 to run all Druid applications.

现在我们准备开始使用德鲁伊来完成可视化任务。

MySQL 数据库

Apache 超集还允许我们读取关系数据库管理系统(如 MySQL)中的数据。我们还将在本节中创建一个示例数据库,稍后我们可以将它与超集一起使用来创建可视化。

样本数据库

雇员数据库是一个标准数据集,其中包含示例组织及其雇员、工资和部门数据。我们将看看如何为我们的任务设置它。

本节假设 MySQL 数据库已经配置并运行。

下载样本数据集

在任何可以访问 MySQL 数据库的服务器上,使用以下命令从 GitHub 下载示例数据集:

[user@master ~]$ sudo yum install git -y
[user@master ~]$ git clone https://github.com/datacharmer/test_db
Cloning into 'test_db'...
remote: Counting objects: 98, done.
remote: Total 98 (delta 0), reused 0 (delta 0), pack-reused 98
Unpacking objects: 100% (98/98), done.

将数据复制到 MySQL

在这一步中,我们将把文件中的数据内容导入到 MySQL 数据库中:

[user@master test_db]$ mysql -u root < employees.sql
INFO
CREATING DATABASE STRUCTURE
INFO
storage engine: InnoDB
INFO
LOADING departments
INFO
LOADING employees
INFO
LOADING dept_emp
INFO
LOADING dept_manager
INFO
LOADING titles
INFO
LOADING salaries
data_load_time_diff
NULL

验证表的完整性

这是一个重要的步骤,只是为了确保我们导入的所有数据都正确地存储在数据库中。验证发生时会显示完整性检查的摘要:

[user@master test_db]$ mysql -u root -t < test_employees_sha.sql
+----------------------+
| INFO                 |
+----------------------+
| TESTING INSTALLATION |
+----------------------+
+--------------+------------------+------------------------------------------+
| table_name   | expected_records | expected_crc                             |
+--------------+------------------+------------------------------------------+
| employees    | 300024 | 4d4aa689914d8fd41db7e45c2168e7dcb9697359 |
| departments  |  9 | 4b315afa0e35ca6649df897b958345bcb3d2b764 |
| dept_manager |               24 | 9687a7d6f93ca8847388a42a6d8d93982a841c6c |
| dept_emp     | 331603 | d95ab9fe07df0865f592574b3b33b9c741d9fd1b |
| titles       | 443308 | d12d5f746b88f07e69b9e36675b6067abb01b60e |
| salaries     | 2844047 | b5a1785c27d75e33a4173aaa22ccf41ebd7d4a9f |
+--------------+------------------+------------------------------------------+
+--------------+------------------+------------------------------------------+
| table_name   | found_records    | found_crc                        |
+--------------+------------------+------------------------------------------+
| employees    | 300024 | 4d4aa689914d8fd41db7e45c2168e7dcb9697359 |
| departments  |  9 | 4b315afa0e35ca6649df897b958345bcb3d2b764 |
| dept_manager |               24 | 9687a7d6f93ca8847388a42a6d8d93982a841c6c |
| dept_emp     | 331603 | d95ab9fe07df0865f592574b3b33b9c741d9fd1b |
| titles       | 443308 | d12d5f746b88f07e69b9e36675b6067abb01b60e |
| salaries     | 2844047 | b5a1785c27d75e33a4173aaa22ccf41ebd7d4a9f |
+--------------+------------------+------------------------------------------+
+--------------+---------------+-----------+
| table_name   | records_match | crc_match |
+--------------+---------------+-----------+
| employees    | OK | ok        |
| departments  | OK | ok        |
| dept_manager | OK            | ok |
| dept_emp     | OK | ok        |
| titles       | OK | ok        |
| salaries     | OK | ok        |
+--------------+---------------+-----------+
+------------------+
| computation_time |
+------------------+
| 00:00:11         |
+------------------+
+---------+--------+
| summary | result |
+---------+--------+
| CRC     | OK |
| count   | OK |
+---------+--------+

现在数据被正确加载到名为员工的 MySQL 数据库中。

单一标准化表格

在数据仓库中,与许多小型相关表相比,标准化表是一种标准做法。让我们创建一个包含员工、工资、部门

MariaDB [employees]> create table employee_norm as select e.emp_no, e.birth_date, CONCAT_WS(' ', e.first_name, e.last_name) full_name , e.gender, e.hire_date, s.salary, s.from_date, s.to_date, d.dept_name, t.title from employees e, salaries s, departments d, dept_emp de, titles t where e.emp_no = t.emp_no and e.emp_no = s.emp_no and d.dept_no = de.dept_no and e.emp_no = de.emp_no and s.to_date < de.to_date and s.to_date < t.to_date order by emp_no, s.from_date;
Query OK, 3721923 rows affected (1 min 7.14 sec)
Records: 3721923  Duplicates: 0  Warnings: 0

MariaDB [employees]> select * from employee_norm limit 1\G
*************************** 1\. row ***************************
    emp_no: 10001
birth_date: 1953-09-02
 full_name: Georgi Facello
    gender: M
 hire_date: 1986-06-26
    salary: 60117
 from_date: 1986-06-26
   to_date: 1987-06-26
 dept_name: Development
     title: Senior Engineer
1 row in set (0.00 sec)

MariaDB [employees]> 

一旦我们有了规范化的数据,我们将看到如何使用这个表中的数据来生成丰富的可视化。

Apache superset(Apache super set)

超集是一个现代化的企业级商业智能应用。这个应用的重要特性是,我们可以直接从浏览器运行所有分析。没有必要为此安装任何特殊软件。

如果你还记得,我们已经在前面的章节中安装了超集和德鲁伊。现在我们需要学习如何使用超集来构建丰富的可视化。

访问超集应用

在网络浏览器中打开http://<SERVER-IP>:9088/。如果一切运行正常,我们将看到如下登录屏幕:

输入admin作为安装过程中选择的用户名和密码。

超集仪表板

仪表板是超集应用的重要部分。他们让我们以图形形式展示分析计算的结果。仪表板是从切片创建的,而切片又是从超集应用中配置的各种数据源构建的。

成功登录后,不会有任何自动为我们创建的仪表盘。我们将看到一个空白的仪表板列表,如下所示:

为了构建仪表板,我们首先需要配置数据源。因此,让我们点击顶部导航中的源菜单,然后点击刷新德鲁伊元数据:

完成这一步后,我们将进入数据源页面,一个新的数据源将自动出现在这里。还记得我们之前把这个数据集上传到德鲁伊吗?

现在我们可以点击数据源名称(绿色),这将把我们带到数据源探索页面:

正如我们所看到的,这个页面被分成多个部分。

  • 左侧界面:
    • 数据源和图表类型:在这个栏目中,我们可以选择我们需要使用的数据源,也可以选择右边我们想要看到的图形类型。
    • 时间:这是我们可以将数据源的数据限制在给定时间范围内的栏目。初学者往往会对该列出错,因为他们在右侧看不到任何数据。因此,选择一个开始时间值(为了获得更好的结果,建议选择 100 年前这样的相对值)。
    • 分组依据:该列用于根据输入数据的维度对数据进行分组。
    • 其他选项:分组依据下面还有其他选项,我们将在接下来的步骤中探讨。
  • 右侧界面:
    • 这个用户界面包含我们在左侧选择的选项的结果。

理解维基百科编辑数据

在我们开始构建可视化之前。让我们更仔细地看看我们摄入到 Druid 中的数据,以及我们可以从这些数据中呈现什么类型的图形:

| 公制/尺寸 | 数据类型 | 描述 | | delta | LONG | 以数字形式表示的变化 | | deleted | LONG | 从文章中删除了数字形式的数据 | | added | LONG | 添加数据,以数字形式测量 | | isMinor | STRING | 布尔值,指示这是否是次要编辑 | | page | STRING | 维基百科中发生变化的页面 | | isRobot | STRING | 变化是由机器人(不是人类,而是某种形式的程序)完成的吗 | | channel | STRING | 维基百科频道发生了变化 | | regionName | STRING | 进行更改的地理区域名称 | | cityName | STRING | 进行更改的城市名称 | | countryIsoCode | STRING | 进行变更的国家的国际标准化组织代码 | | user | STRING | 做出更改的维基百科用户或 IP 地址 | | countryName | STRING | 进行更改的国家的名称 | | isAnonymous | STRING | 更改是否由匿名用户完成(未登录状态)? | | regionIsoCode | STRING | 进行变更的地理区域的国际标准化组织代码 | | metroCode | STRING | 这类似于美国的邮政编码(见http://www . nlsinfo . org/usersvc/NLSY97/NLSY97 rnd 9 geocodecodebooksupplement/GATT 101 . html) | | namespace | STRING | 维基百科文章/页面命名空间 | | comment | STRING | 为此更改添加的注释 | | isNew | STRING | true如果这是新的一页(见en.wikipedia.org/wiki/Wikipe… | | isUnpatrolled | STRING | true如果变更不是巡逻变更(见en.wikipedia.org/wiki/Wikipe… |

因此,我们列出了数据的所有属性。让我们看一下示例一,以更好地理解我们正在谈论的内容:

{
  "time": "2015-09-12T00:47:21.578Z",
  "channel": "#en.wikipedia",
  "cityName": null,
  "comment": "Copying assessment table to wiki",
  "countryIsoCode": null,
  "countryName": null,
  "isAnonymous": false,
  "isMinor": false,
  "isNew": false,
  "isRobot": true,
  "isUnpatrolled": false,
  "metroCode": null,
  "namespace": "User",
  "page": "User:WP 1.0 bot/Tables/Project/Pubs",
  "regionIsoCode": null,
  "regionName": null,
  "user": "WP 1.0 bot",
  "delta": 121,
  "added": 121,
  "deleted": 0
}

一旦我们对数据维度有了一些了解,我们就需要看看我们可以从这些数据中回答什么类型的问题。这些问题是我们容易获得的见解。稍后,我们可以用最适合我们的图形形式来表示这些。

让我们看看从这些数据中我们可以回答的一些问题。

一维洞见:

  • 哪些城市是产生变化的地方?
  • 哪些页面被更改了?
  • 哪些国家做出了改变?
  • 创建了多少新页面?

沿尺寸计数:

  • 每个城市有多少变化?
  • 哪些是做出改变的顶级城市?
  • 哪些是促成这些变化的顶级用户?
  • 经常更改的名称空间有哪些?

多维洞察:

  • 所有国家在上午 9 点到 10 点之间发生了多少变化?
  • 机器人编辑的挂钟时间是什么时候?
  • 哪个国家的变化起源最多,是在什么时候被机器人瞄准的?

看起来很有趣,对吧?为什么我们不尝试使用 Apache 超集来创建一个具有这些见解的仪表板呢?

为此,我们需要在超集应用中遵循这个简单的工作流程:

  1. 数据来源:
    • 从支持的数据库中定义新的数据源
    • 刷新 Apache 德鲁伊数据源
  2. 创建切片
  3. 使用切片制作仪表板

如果我们回想一下,我们已经在前面的章节中完成了步骤 1 。所以,我们可以马上进入第二步和第三步。

使用维基百科数据创建超集切片

让我们看看使用超集应用中的切片功能可以生成什么类型的图形。

唯一用户数

在此切片中,我们将看到如何生成图形来查找对数据集中的编辑做出贡献的唯一用户。

首先,我们需要从顶部导航进入切片页面。之后,屏幕看起来是这样的:

在此页面中,单击加号图标(+)添加新切片:

之后,我们会看到系统中配置的数据源列表。我们必须点击数据源名称:

在我们点击 wikiticker 之后,我们会进入可视化页面,在那里我们定义想要呈现为图形的维度。

对于当前的用例,让我们从用户界面中选择以下选项:

| 用户界面位置 | 图形 | 解释 | | 补充报道 | | 选择数据源作为【德鲁伊-安巴里】。【维基百科】和图形类型为大数字*。*在时间部分,选择自 5 年前开始的值,并将其余值保留为默认值。在公制部分。从自动完成中选择 COUNT(DISTINCT user_unique)。在子标题部分,添加屏幕上显示的唯一用户数。之后,点击顶部的查询按钮。 | | 图形输出 | | 我们在这张图中看到了查询的结果。 | | 保存切片 | | 点击顶部的另存为按钮会显示一个类似这样的弹出窗口,我们需要在其中添加相应的值。将切片保存为Unique Users并将其添加到名为My Dashboard 1的新仪表板中。 |

听起来很简单,对吧?我们先不要急着看仪表盘。在接下来的部分中,让我们根据数据创建更多分析。

美国顶级地区的词云

在这一节中,我们将学习如何为美国顶级地区构建一个单词云,这些地区为我们在 Druid 中的数据源中的维基百科编辑做出了贡献。我们可以继续编辑上一节中的相同切片,或者转到一个空白切片,如前一节所述。

让我们专注于生成单词云时需要选择的值:

| 用户界面位置 | 图形 | 解释 | | 补充报道 | | 选择数据源为[德鲁伊-安巴里]。[维基百科]图形类型为 Word Cloud。在时间部分,选择自 5 年前的值,并将其余值保留为默认值。 | | | | 在“系列”部分。从下拉列表中选择地区名称。在度量中,选择计数(*),这是总编辑计数。 | | | | 在“过滤器”部分,选择“国家/地区代码”;它应该在美国。添加另一个过滤器以仅选择有效区域(跳过空代码)。如图所示,添加这些值。 | | 图形输出 | | 点击查询后,我们看到这个美丽的字云。 | | 保存切片 | | 点击顶部的另存为按钮会显示一个类似这样的弹出窗口,我们需要在其中添加相应的值。将切片另存为Word Cloud - Top US Regions并将其添加到名为My Dashboard 1 的新仪表板中。 |

单词云的意义在于我们可以根据单词的相对大小来看到最上面的单词。当我们想要看到相对意义的单词较少时,这种可视化是有帮助的。

让我们尝试从数据中生成另一个图形。

太阳爆发图——十大城市

在本节中,我们将了解到一种不同类型的图表,这种图表我们在本章中还没有见过。但是首先,让我们提出用例。

我们希望在所有三个级别找到每个频道、城市名称和命名空间的唯一用户;也就是说,图形应该能够向我们展示:

  • 每个频道的唯一用户
  • 每个频道/城市名称的唯一用户
  • 每个频道/城市名称/命名空间的唯一用户

为了显示这种层次数据,我们可以使用太阳爆发图。

让我们看看需要选择什么类型的值来呈现这种类型的图表:

| 用户界面位置 | 图形 | 解释 | | 补充报道 | | 选择数据源为[德鲁伊-安巴里]。[维基百科]图形类型为 Sunburst。在时间部分,选择自 5 年前的值,并将其余值保留为默认值。 | | | | 在层次部分,从下拉列表中选择channelcityNamenamespace。在主要指标和次要指标中,选择计数(DISTINCT user_unique),这是用户总数。 | | | | 在过滤器部分,选择城市名称,并使用正则表达式匹配添加非空条件 | | | | 点击顶部的“另存为”按钮将显示如下弹出窗口。我们需要在这里添加相应的值。将切片另存为Sunburst - Top 10 Cities并将其添加到名为My Dashboard 1 的新仪表板中。 | | 图形输出 | | 点击查询后,我们看到这个美丽的图形。 |

如我们所见,图中有三个同心环:

  • 最内环是channel维度
  • 中环显示cityName尺寸
  • 最外环是namespace维度

当我们悬停在最内环上时,我们可以看到它是如何扩展到最外环的。同样的事情也发生在其他戒指上。

当我们想要对数据进行漏斗分析时,这种图形非常有用。让我们在下一节中看看另一种类型的分析。

通过定向强制布局的前 50 个通道和名称空间

定向力布局 ( DFL )是一个点与点相互连接的网络布局。由于是力布局,我们可以看到d3.js应用物理引擎时,屏幕上的点在移动。

在这个网络图中,我们希望通过唯一的用户数度量来了解名称空间和通道之间的连通性。由于这是一个网络图,我们将看到节点在不同的路径上重复。

让我们看看如何得出这个图表:

| 用户界面位置 | 图形 | 解释 | | 补充报道 | | 选择数据源为[德鲁伊-安巴里]。[维基百科]和图形类型为定向力布局*。在时间部分,选择自 5 年前开始的值,并将其余值保留为默认值。 | | | | 在源/目标部分,从下拉菜单中选择channelnamespace。在度量部分,选择计数(DISTINCT user_unique),这是用户总数。我们将世界排名限制在 50 名,这样我们就只能看到前 50 名。* | | | | 点击顶部的另存为按钮会显示一个类似这样的弹出窗口,我们需要在其中添加相应的值。将切片保存为DFL - Top 50 Channels & Namespaces。将其添加到名为My Dashboard 1的新仪表板中。 | | 图形输出 | | 点击查询后,我们看到这个美丽的图形。 |

请随意拖动图形中的节点,以了解更多关于它们如何相互连接的信息。节点的大小表示唯一的用户数及其细分(类似于阳光爆发图)。

让我们在下一节花一些时间学习另一个可视化和业务用例。

前 25 名国家/渠道分布

现在我们将学习桑基图,这是一种类似瀑布的方式来表示数据之间的分解和互连。在这种情况下,我们希望了解在唯一用户指标方面,通道名称和国家名称维度是如何关联的:

| 用户界面位置 | 图形 | 解释 | | 补充报道 | | 选择数据源作为【德鲁伊-安巴里】。【维基百科】和作为桑基的图形类型。在时间部分,选择 5 年前的“自”值,其余值默认。 | | | | 在源/目标部分,从下拉菜单中选择channelcountryName。在指标中,选择总编辑计数()。将行限制保持在 25;所以我们只会看到前 25 项。* | | | | 在过滤器部分,选择国家名称并启用正则表达式过滤器,以便只选择那些具有有效国家名称的记录。 | | | | 点击顶部的另存为按钮将显示一个弹出窗口。我们需要在这里添加相应的值。将切片另存为Top 25 Countries/Channels Distribution并将其添加到名为My Dashboard 1的新仪表板中。 | | 图形输出 | | 点击查询后,我们看到这个美丽的图形。 |

至此,我们可以生成的所有分析列表都已完成。现在在下一节中,我们将看到如何在仪表板中使用它(这是我们最初的目标)。

创建维基百科编辑来自切片的仪表板

到目前为止,我们已经看到了如何在 Apache 超集应用中为维基百科编辑存储在 Apache Druid 数据库中的数据创建切片。现在是时候让我们看看如何创建一个仪表板,以便我们可以与业务团队或任何其他我们想要分享见解的团队共享它。

在这个过程中,第一步是单击顶部导航栏上的仪表板菜单。这将带我们进入添加新仪表板页面,我们需要填写以下详细信息。

| 元素 | 描述 | | | 标题 | 这是我们要创建的仪表板的名称 | 我的仪表板 1 | | 鼻涕虫 | 仪表板的简称 | dash1 | | 部分 | 我们要添加到仪表板的切片列表。 |

  1. Sunburst-Top 10 Cities
  2. DFL-Top 50 Channels & Namespace
  3. Top 25 countries/channels contribution
  4. Cloud-the top region of the United States
  5. Unique user

| | 其他字段 | 我们可以将其他字段留空,因为它们不是创建仪表板所必需的 | |

这是本页的图片:

一旦更改看起来不错,点击屏幕底部的保存按钮。

这将带我们进入下一步,我们可以看到仪表板已成功创建:

我们可以在仪表板列表中看到我的仪表板 1。要访问此仪表板,请单击它,我们将进入仪表板屏幕:

如我们所见,我们有一种非常强大的方式来表示所有原始数据。这肯定会对最终用户产生影响,确保信息得到传达。

到目前为止,我们已经学习了如何从存储在 Apache Druid 柱状数据库中的数据创建切片和仪表板。在下一节中,我们将看到如何连接到关系数据库管理系统,并根据这些数据生成切片和仪表板。

带有 RDBMS 的 Apache 超集

Apache 超集是使用 Python 编程语言构建的,并且支持许多关系数据库,因为它使用 SQLAlchemy 作为数据库驱动程序。这些驱动程序的安装超出了本节的范围。但是,安装这些应该非常容易。大多数时候,操作系统供应商会为我们打包它们。所以,我们不用担心手动安装这些。

支持的数据库

以下是 Apache 超集支持的一些数据库:

| 数据库名称 | Python 包名 | 驾驶员 URI 前缀 | 详情 | | 关系型数据库 | mysqlclient | mysql:// | 甲骨文数据库 | | 一种数据库系统 | psycopg2 | postgresql+psycopg2:// | 世界上最先进的开源数据库 | | 很快 | pyhive | presto:// | 开源分布式查询引擎 | | 神谕 | cx_Oracle | oracle:// | 甲骨文公司创建的多模型数据库管理系统。 | | Sqlite | | sqlite:// | 快速、可扩展的嵌入式数据库库 | | 红移 | sqlalchemy-redshift | postgresql+psycopg2:// | 亚马逊红移是建立在 PostgreSQL 上的柱状数据库 | | MSSQL | pymssql | mssql:// | 微软 SQL 服务器 | | 黑斑羚 | impyla | impala:// | Apache Impala 是运行在 Hadoop 上的大规模并行处理 SQL 引擎 | | SparkSQL | pyhive | jdbc+hive:// | Apache Spark 模块,用于在 Spark 程序中编写 SQL。 | | 青梅 | psycopg2 | postgresql+psycopg2:// | Greenplum 是一个先进的、功能齐全的开源数据平台 | | 雅典娜(智慧与技艺的女神) | PyAthenaJDBC | awsathena+jdbc:// | 亚马逊雅典娜是无服务器交互式查询服务 | | 垂直的 | sqlalchemy-vertica-python | vertica+vertica_python:// | Vertica 是大数据分析软件 | | 钟罩 | sqlalchemy-clickhouse | clickhouse:// | 开源分布式柱状数据存储 |

Portions of the above table is extracted from the official documentation of Apache Superset (superset.incubator.apache.org/installatio…)

了解员工数据库

如果您还记得,在前面的部分中,我们已经导入了一个名为 Employees 的示例数据库,并将其加载到 MySQL 数据库中。我们将深入研究这个示例数据存储,以便了解我们可以从中生成哪些类型的分析。

雇员表

employees表包含员工的详细信息(随机生成的数据),具有以下属性

| | 数据类型 | 描述 | | emp_no | INTEGER | 员工编号 | | birth_date | DATE | 员工出生日期 | | first_name | STRING | 员工的名字 | | last_name | STRING | 员工的姓氏 | | gender | STRING | 员工性别,男性为男,女性为女 | | hire_date | STRING | 员工的最新加入日期 |

部门表

departments表由组织中每个部门的基本细节组成。这张表进一步说明了这一点:

| 表列 | 数据类型 | 描述 | | dept_no | STRING | 部门编号 | | dept_name | STRING | 部门名称 |

部门经理表

dept_manager表记录了员工担任给定部门经理的情况。更多详情见下表:

| 表列 | 数据类型 | 描述 | | emp_no | INT | 担任该部门经理的员工 ID | | dept_no | STRING | 部门标识 | | from_date | DATE | 员工担任该部门经理的起始日期。 | | to_date | DATE | 员工担任该部门经理的截止日期。 |

部门员工表

dept_emp表由显示每个员工属于一个部门的时间的所有记录组成。

| 表列 | 数据类型 | 描述 | | emp_no | INT | 员工编号 | | dept_no | STRING | 部门标识 | | from_date | DATE | 员工所属部门的起始日期 | | to_date | DATE | 该部门员工的最后日期 |

标题表

标题表包含从给定日期到结束日期的所有员工角色。更多细节如下所示:

| 表列 | 数据类型 | 描述 | | emp_no | INT | 员工 Id | | title | STRING | 员工的指定 | | from_date | DATE | 员工担任此角色的开始日期 | | to_date | DATE | 员工履行此职责的最后日期 |

薪金表

salaries表由给定员工的薪资历史记录组成。下表解释了更多详细信息:

| 表列 | 数据类型 | 描述 | | emp_no | INT | 员工 Id | | salary | INT | 员工工资 | | from_date | DATE | 计算薪资的起始日 | | to_date | DATE | 计算薪资的最后一天。 |

标准化员工表

employee_norm表由员工、工资、部门、dept_emp和职称表的数据组成。让我们详细看看这张表:

| 表列 | 数据类型 | 描述 | | emp_no | INT | 员工编号 | | birth_date | DATE | 员工出生日期 | | full_name | STRING | 员工全名 | | gender | STRING | 员工的性别 | | hire_date | DATE | 员工加入日期 | | salary | INT | 该期间员工的工资 | | from_date | DATE | 薪资期间开始 | | to_date | DATE | 薪资期间结束 | | dept_name | STRING | 员工在此薪资期间工作的部门 | | title | STRING | 在此期间指定员工 |

了解了员工数据库中的各种表格后,我们现在对目前掌握的数据有了一些了解。现在,下一个任务是找出我们可以从这些数据中生成什么类型的分析。我们将在下一节中了解这一点。

员工数据库的超集切片

一旦我们对存储在 MySQL 数据库中的数据类型有了一些基本的了解。我们现在将看到我们可以从这些数据中回答什么类型的问题。

一维洞见:

  • 组织中有多少员工?
  • 组织中所有员工的工资总额是多少?
  • 有多少个部门?

多维洞察

  • 每年支付的工资总额是多少?
  • 每个部门的总工资是多少?
  • 谁是每年收入最高的员工?

如果我们按照这些思路思考,我们应该能够回答关于数据的非常重要的问题,并且应该能够生成漂亮的图形。

让我们举几个例子来说明在接下来的部分中我们可以生成什么类型的可视化。

注册 MySQL 数据库/表

在我们开始为员工表生成切片之前,我们应该首先注册它。注册过程包括以下步骤。

通过单击顶部导航栏中“源”菜单中的“数据库”下拉列表打开数据库,如下所示:

之后,我们需要点击页面上的加号(+)图标:

这将把我们带到一个页面,在那里我们可以注册新的数据库。屏幕如下所示:

我们将填写如下所示的详细信息。

| 字段名 | | 描述 | | | 数据库ˌ资料库 | employees | 我们要注册的数据库的名称。(在 MySQL 数据库中输入与其相同的名称) | | | SQL anywhere uri | mysql+pymysql://superset:superset@master:3306/employees | URI 可以编程访问这个数据库。这将包括协议/驱动程序、用户名、密码、主机名和数据库名 | | | 其他字段 | | 将它们保留为默认值 | |

在此之后,点击保存按钮,这将使用 Apache 超集保存数据库详细信息。我们将进入表格列表页面,如下所示:

如我们所见,我们已经在 MySQL 后端注册了员工数据库。

在下一步中,我们需要从顶部菜单中选择表格:

因为我们没有注册任何表,所以我们将看到一个像这样的空页面:

为了注册一个新的表,我们必须点击用户界面中的加号(图标),这将我们带到以下页面:

输入如下所示的字段值,完成后单击保存:

| 字段名 | | 描述 | | 表名 | employee_norm | 我们要注册的表的名称。 | | 数据库ˌ资料库 | employees | 选择已经向超集注册的数据库。 |

现在我们可以看到该表已成功注册,如下图屏幕所示:

超集的一个重要特性是,它将根据数据类型自动选择我们可以对表的列执行的不同类型的操作。这决定了我们在用户界面的其余部分显示哪些类型的维度和指标。

为了选择这些选项,我们需要通过单击编辑图标来编辑表格,我们将看到此页面:

正如我们所看到的,Apache 超集已经自动识别了每个字段的数据类型,它还为我们提供了一个选项来为各种活动选择这些维度。下表列出了这些活动:

| 活动 | 描述 | | 可分组 | 如果选中该复选框,则该字段可用作分组操作的一部分(在 SQL 中为GROUP BY)。 | | 可滤过的 | 如果选中该复选框,则该字段可用作条件操作(WHERE子句)的一部分。 | | 区分计数 | 如果选中该复选框,则该字段可用作字段计数(DISTINCT)操作的一部分。 | | 总和 | 如果选择了复选框,则该字段可用作SUM()功能的一部分。 | | 最小/最大 | 指示该字段可用作查找最小值和最大值的一部分。 | | 是暂时的 | 指示该字段是时间维度。 |

如上所示进行更改,然后单击保存按钮。

现在,我们准备在接下来的步骤中开始创建切片和仪表板。

切片和仪表板创建

正如我们在前面几节中看到的,为了创建仪表板,我们首先需要创建切片。在本节中,我们将学习创建几个切片。

部门薪资拆分

在这一部分中,我们将学习如何创建可视化,显示每个部门的薪资细分百分比:

| 用户界面位置 | 图形 | 描述 | | 补充报道 | | 数据源&图表类型:选择【员工】。数据源为【员工 _ 定额】,图表类型为“分布-国家职业类别 3 -饼图”在时间部分,选择出生日期作为时间栏,选择 100 年前作为起栏。在指标部分,从下拉列表中选择 sum_salary 作为值,部门名称作为分组依据。 | | 图形输出 | | 点击“查询”按钮将会显示这张喜欢的图表。用部门薪资分手这个名字保存。 |

就像上一节一样,看看在没有任何编程知识的情况下创建好看的图形有多容易。

在下一节中,我们将从同一员工数据库中了解另一种类型的图形。

薪酬多样性

这是一个重要的图表,在这里我们确定了在整个组织历史中,不同性别之间的工资差异。这里我们用平均工资作为分析的基础。

| 用户界面位置 | 图形 | 描述 | | 补充报道 | | Datasource & Chart Type: select [employees].[employee_norm] as the datasource and Time Series - line chart as chart type 在时间部分,选择出生日期作为时间列& 100 年前作为自列。在指标部分,选择平均工资作为指标,性别作为Group By。 | | 输出 | | 显示每个性别每年平均工资的图形。用标题工资差异保存 |

从图中我们可以看出,男女之间的工资差距很大,而且非常接近。同期平均工资也有类似的增长。

在下一节中,我们将学习生成另一种类型的图形,这将使我们对数据有不同的见解。

每年每个角色的薪资变化

这是一个重要的统计数据,我们想知道组织中不同职位的工资变化有多大。

| 用户界面位置 | 图形 | 描述 | | 补充报道 | | Datasource & Chart Type: select [employees].[employee_norm] as the datasource and Time Series - Percentage Change as chart type In the Time section, Select from_date as Time column , Year as Time Granularity & 100 years ago as Since column.在指标部分,选择 sum_salary 作为指标,标题为 By。 | | 输出 | | 点击查询,我们会得到下面的图形。用名称每年每个角色的薪资变化保存。 |

从这张图中我们可以发现,很少有角色在组织内的总薪酬中有非常大的差异。

到目前为止,我们已经创建了三个切片,我们将使用到目前为止创建的切片创建一个新的仪表板。

仪表板创建

在这一步中,我们将通过转到仪表板页面并单击添加仪表板图标(如前几节所示)来创建新的仪表板。

我们将看到下面的屏幕,在这里我们选择到目前为止创建的三个切片,然后单击保存:

仪表板保存成功后,我们可以看到它是这样的:

正如我们所看到的,仪表板是以简单的方式表达大量数据的非常强大的方式。

摘要

在本章中,我们学习了数据可视化,以及它如何帮助用户在不了解底层数据的情况下接收所需的消息。然后,我们看到了以图形方式可视化数据的不同方法。

我们浏览了用于可视化数据的 Hadoop 应用,如 Apache Druid 和 Apache 超集,并学习了如何将它们与 MySQL 等关系数据库一起使用。我们还看到了一个示例数据库,以帮助我们更好地理解应用。

在下一章中,我们将学习如何在云上构建我们的 Hadoop 集群。

十、使用云开发应用

在计算的早期,CPU 能力和存储非常匮乏,因此购买相关设备的成本非常高。随着 80 年代初苹果和微软在个人计算发展方面的进步,越来越多的个人和组织获得了这些计算设备。随着行业发展芯片制造方式,数十亿(如果不是数万亿)个晶体管被放在单个芯片上,这些计算设备的尺寸已经大幅缩小,从占据整个房间到在数据中心包含单个机架单元。当计算速度和存储设备容量开始增加时,个人和企业开始意识到高效管理其计算资源正在成为一项挑战。

互联网的广泛使用也对个人如何获取资源做出了重大贡献。

在本章中,我们将涵盖以下主题:

  • 什么是云?
  • 云中可用的技术
  • 规划云基础设施
    • 云中的高可用性
    • 云中的业务连续性规划
    • 云中的安全性
  • 在云中构建 Hadoop 集群
  • 云和内部应用
  • 云中的数据访问

什么是云?

云计算,简称 Cloud,是一种在互联网上租用和使用电子存储空间、计算能力、网络带宽、IP 地址、数据库、网络服务器等资源的简单方式。云推动了按使用付费模式,即客户只为这些资源的使用付费,就像电网为其客户的电力消耗付费一样。

云计算已经改变了个人和组织在互联网上访问和管理其服务器和应用的方式。在云计算出现之前,每个人都习惯在自己的场所或专用数据中心管理自己的服务器和应用。单个芯片上多核计算的原始计算能力(中央处理器和图形处理器)的增加以及存储空间(硬盘和固态硬盘)的增加给有效利用可用计算资源带来了挑战。

云中可用的技术

随着云计算应用的增加,企业已经开始构建各种技术,并将其提供给消费者。我们将浏览率先推出云产品的组织列表,以及它们提供的不同类型的技术。

以下是提供云服务的公司列表:

  • Microsoft Azure (Azure)
  • 亚马逊网络服务
  • 谷歌云平台
  • 国际商用机器公司
  • 销售队伍
  • 精力
  • 神谕
  • VMware

正在以下列形式向消费者提供各种类型的资源:

  • 平台即服务
  • 基础设施即服务
  • 软件即服务
  • 后端即服务
  • 网络即服务

随着此类产品的增加,许多组织无需关注基础设施,如房地产、服务器、防火墙、负载平衡器、交换机、电源等。但是他们可以从云提供商那里购买这些服务,然后专注于他们正在构建的应用。

现在,让我们看看顶级提供商微软、亚马逊和谷歌提供了哪些技术:

| 技术 | 蔚蓝 | 亚马逊网络服务 | 谷歌云 | 描述 | | 服务器 | Azure 计算 | 亚马逊 EC2 | 谷歌计算引擎 ( GCE ) | 这项技术旨在提供随需应变的服务器,这些服务器可以是虚拟化的,也可以是专用/裸机的。 | | 储存;储备 | 天蓝色存储 | 亚马逊 EBS | 谷歌存储 | 这是按需存储,可以根据需要连接到计算节点。一些供应商提供了按需扩展这些存储设备大小的能力。 | | 网络 | Azure 网络 | 是 | 谷歌网络服务 | 提供商根据应用的网络要求提供 100 Mbps 至 10 Gbps 的网络带宽。 | | 数据库 | Azure 数据库 | 亚马逊无线电数据系统 | 谷歌云 SQL | 对于托管数据库,我们不需要担心数据库服务器的维护,因为供应商会自动处理对这些服务器的支持。请记住,在某些情况下,我们需要为自己规划高可用性。 | | 内容交付 | 天蓝色 CDN | 亚马逊云前线 | 谷歌云 CDN | 如果我们想通过利用交付网络将静态资产推给用户,这将非常有帮助,因为它可以显著降低延迟。我们还可以将它用作私有存储来存储所有文件,如备份、会议记录等。 | | 域名系统 ( 域名系统) | DNA 蓝色 | 亚马逊 S3 路线 | 谷歌云域名系统 | 域名系统对于在互联网上运行我们的应用至关重要。这项服务让我们的生活变得更加轻松,因为它让我们的服务器可以被基础设施的其他部分访问,而不必运行我们自己的 DNS 服务器。 | | 业务邮件 | 微软 o365 | 亚马逊工作邮件 | 谷歌邮件 | 对于要求以安全和可扩展的方式访问电子邮件和日历的组织来说,这是必须的。 | | 机器学习 | Azure AI +机器学习 | 亚马逊机器学习 | 谷歌 ML 引擎 | 机器学习技术已经成为这些天的流行语。供应商提供了几种与机器学习相关的技术,因为我们只需关注我们需要做什么,而不必担心运行这些算法所需的基础设施。 | | 分布式拒绝服务 ( 分布式拒绝服务)保护 | 天蓝色分布式拒绝服务保护 | 自动气象站防护罩 | – | 对于那些无法承受服务宕机的组织来说,这是一件非常重要的事情,当大规模拒绝服务攻击发生时,会影响网站的常规访问者。 | | 监视 | 天蓝色监视器 | 亚马逊云观测 | 谷歌监控 | 如果不监控我们的应用和基础架构,我们将无法看到我们的表现。这些服务有助于我们保持业务正常运行,并对触发我们在云上运行的应用和基础架构宕机的事件做出响应。 | | 容器 | 蔚蓝集装箱服务 ( AKS ) | 亚马逊库本内特弹性集装箱服务 ( 亚马逊 EKS ) | 谷歌库比厄引擎 | 这是一种基础架构,允许您将应用作为容器运行,而不是拥有完整的计算环境来运行它们。 |

规划云基础架构

传统组织有自己的 IT/基础架构团队来管理其专用服务器和网络。在规划向云的迁移时,我们必须牢记以下事项,以提高基础架构的可操作性。

规划云基础架构涉及:

  • 专用或共享服务器
  • 高可用性
  • 业务连续性规划
  • 安全
  • 网络体系结构

专用服务器与共享服务器

云提供商让您可以选择租赁完全拥有物理硬件的服务器,或者与我们这样的其他云用户共享物理硬件。为了对此做出决定,我们需要了解这些模型的优缺点。

专用服务器

这些类型的服务器的所有权属于单个用户或组织,不与任何其他用户共享。这种设置有以下几个优点:

  • 我们完全拥有物理服务器,我们分配的任何其他服务器都将在相同的硬件上进行配置
  • 对于这种设置,我们可能会收取更多的费用
  • 有了幽灵和熔毁,我们得到了更好的保护,因为硬件不与任何人共享
  • 我们不受邻居的影响,因为我们完全拥有硬件

共享服务器

对于简单的实验来说,拥有一台完整的服务器是昂贵的。在这种情况下,我们可以采用共享设置,在给定的物理硬件中租用一些资源。共享服务器的一些优势如下:

  • 我们只对按需租用的虚拟服务器收费。
  • 尽管云供应商提供了绝对的隔离,但有了 Spectre 和 flush,我们需要小心一点。
  • 比专用服务器更容易调配。

高可用性

根据我们计划运行的应用类型,我们必须了解供应商就正常运行时间为这些应用提供的服务级别协议 ( SLA ),并且我们需要相应地计划我们的应用。

让我们看一下使用 DNS 实现应用高可用性的简单方法:

在此设计中,会发生以下情况:

  • 当用户试图使用谷歌浏览器或火狐浏览器连接到我们的网站时,它首先会尝试联系域名系统服务器
  • DNS 服务器知道我们的前端服务器,并返回所有服务器的列表
  • 浏览器将直接连接到前端服务器
  • 前端服务器连接到数据库并返回请求的资源

在这个设计中,我们需要记住以下几点:

  • 前端服务器直接暴露在互联网中,因此我们应该采取适当的安全措施,例如防火墙或 DDos 保护来保护我们的服务器
  • 这些前端服务器也应该安装最新的操作系统软件,以便防止任何攻击
  • 数据库服务器不应该对外界可见,因此应该有一个适当的防火墙来允许来自前端服务器的请求

Cloud providers provide a private IP address. In order to minimize the risk of DB servers being accidentally exposed to the internet, we should block the public internet access to these servers.

让我们来看看另一种设计,它也能保护我们的网络服务器免受互联网攻击:

在本设计中,与之前的设计相比,我们做了以下更改:

  • 浏览器联系 DNS 服务器连接到我们的网站时, DNS 服务器提供负载均衡器(LB)/代理服务器的 IP 地址
  • 浏览器连接到这个 LB
  • LB 跟踪哪些后端服务器可用,然后将请求转发给服务器:
    • 服务器与数据库 ( 数据库)对话,并完成响应的构建
    • 响应被发送回 LB
  • LB浏览器发送响应

如果我们仔细观察这个设计,我们会发现这些是优于前一个设计的优点:

  • LB 隐藏了我们的基础设施,因此外人无法轻易知道我们的基础设施中有多少台服务器
  • LB 保护我们的网络服务器免受多种攻击
  • LB 可以进行 SSL 卸载,所有的流量加密/解密都发生在 LB 级别,我们的服务器可以免除 SSL 开销

Depending on the security policy of the organization, you might need to enable SSL on the web servers as well.

业务连续性规划

业务连续性规划 ( BCP )是组织处于成长阶段时需要考虑的一件非常重要的事情。网络、服务器或数据库或任何其他云基础架构组件的任何宕机都可能导致整个业务瘫痪。

在规划 BCP 时,有几件关键的事情要记住:

  • 基础设施不可用
  • 天灾
  • 商业数据

基础设施不可用

如果云提供商提供的服务出现计划外停机,我们所有的服务都会随之中断。为了最大限度地提高我们业务的可用性,我们需要在另一个地理区域建立备份设置。对于一些组织来说,这可能是昂贵的,因为整个设置将被复制,但是为了业务连续性,这是规划云基础架构时要考虑的一个重要特性。

天灾

地震、洪水、火灾等事件很难预测。因此,我们需要制定必要的计划来保持我们的业务运行,这取决于我们的服务器在云上的位置,以及供应商在构建数据中心时遵循的技术标准。

商业数据

业务数据以多种形式存在,并以文件、数据库服务器和大数据系统的形式存储。对于 BCP,我们需要仔细分析我们可以计划在哪些其他远程位置保留我们的数据副本,并进行测试运行,看看我们的应用是否可以通过单击一个按钮从任何一个地理位置无缝运行。

当我们在这里处理多个地理位置时,我们需要了解,当数据量巨大时,将数据从一个数据中心复制到另一个数据中心需要时间。我们的应用也必须重新设计,以防我们在最初的设计中没有考虑 BCP。

BCP 设计范例

此图试图解释我们如何通过在多个数据中心设置相同的应用来实现 BCP:

该系统可以是:

  • 霍特
  • 冷热

热-热系统

在 Hot-Hot 系统中,两个数据中心同时处于活动状态,为用户的流量提供服务。这里,我们采用了几种 CDN 和地理定位技术来将用户路由到给定的数据中心。

我们在这样做时面临的挑战是,如果一个区域完全空白,另一个区域应该有足够的空间来确保另一个区域的流量被吸收

使用该系统的优点是用户体验良好,因为在该设计中,用户被路由到最近的系统

冷热系统

在此系统/设计中,任何时候都只有一个区域处于活动状态,只有在 BCP(业务连续性规划)的情况下,我们才会回到另一个区域。

我们在使用该系统时面临的挑战如下:

  • 在问题出现之前,很容易忘记另一个地区;持续同步使用两个区域以及数据和软件是非常重要的。
  • 由于只有一个区域处于活动状态,因此必须考虑好用户到另一个数据中心的正确故障转移

使用该系统的优点是所有的写操作都发生在一个区域,这使得数据库设计变得简单。

安全

当您考虑迁移到云时,安全性非常重要。以下是需要记住的事情:

  • 服务器安全性
  • 应用安全
  • 网络安全性
  • 单点登录
  • AAA 要求

服务器安全性

当我们谈论云时,我们将永远无法物理访问服务器(除非我们获得云供应商的许可)。在这种情况下,我们必须了解云提供商遵循什么级别的策略和实践来确保我们的应用将在其上运行的服务器的物理安全。

例如,政府在考虑迁移到云时可能需要一整套不同的物理安全限制。同样,有几个标准,如 PCI 和 HIPAA,在这个模型上执行更强的规则。

如果我们的业务需要遵守这些标准,我们需要选择支持所有这些标准的云变体。

应用安全

在云上,我们可以选择自己托管应用,也可以使用作为服务提供的应用软件即服务 ( SaaS )。如果我们在自己调配的服务器(专用或共享)上托管应用,我们需要在服务器级别实施正确的防火墙规则,以及正确的用户访问规则,以确保我们的软件只允许经过授权和正确身份验证的用户。

如果应用是内部的,我们应该确保我们的员工获得 2FA 或 3FA 方法来登录这些服务。

网络安全性

为了保护我们在云上的服务器,我们需要实施适当的防火墙规则、域名系统区域,甚至拥有自己的虚拟专用网络,以确保我们的所有资产不会受到损害并暴露在互联网上。

云是互联网的代名词,对我们的数据和基础设施构成持续威胁。除非我们实施适当的安全措施,否则任何人都可以从我们的系统中随意获取任何东西。

单点登录

单点登录 ( 单点登录)已经受到在云上为各个部门使用多个应用的组织的欢迎。最近,组织已经停止构建自己的应用来运行业务,而是开始采用其他服务。当此类应用的数量增加时,这些应用的用户不断面临在所有这些网站中输入用户名和密码的挑战。

为了提供无缝的浏览体验,同时遵守企业安全标准,许多提供商实现了 OAuth 和 SAML,因为它们是行业公认的。

这些单点登录/身份提供者与公司员工数据库集成,进一步吸收企业的云应用,如下图所示:

本设计试图解释组织如何利用身份提供者来利用单点登录:

  • 组织与身份提供者共享员工和组织的详细信息:
    • 密码可以共享,也可以不共享,因为如果出现漏洞,可能会危及整个组织
    • 单点登录系统可以对员工强制使用自己的密码
  • 当用户尝试打开组织中的任何应用时,它会将用户重定向到单点登录提供程序
  • 单点登录提供程序完成身份验证,并与应用共享必要的凭据
  • 应用基于来自单点登录的反馈授权用户
  • 应用打开用户特定的细节,然后用户可以与应用交互

现在,这些单点登录的最大优势是,一旦用户与系统建立了会话,他们就可以登录到其他公司批准的应用,而无需进一步登录。

与单点登录提供商互动时,保密性是最大的挑战,因此组织应该仔细评估并选择符合其安全要求的正确解决方案。

AAA 要求

谈到安全性,重要的是要理解遵循 AAA 标准的应用将解决企业面临的许多挑战。

美国汽车协会标准涉及:

  • 证明
  • 批准
  • 审计

认证确保用户的身份被正确验证。

授权根据公司政策,进一步控制是否允许给定用户访问某些资源。

审核确保所有访问和使用资源的尝试都得到跟踪,这也可以用于任何调查,并提供适当的会计和计费(如果需要)。

通过遵循这些最佳实践,我们可以确保事情在大范围内顺利进行。

在云中构建 Hadoop 集群

我们之前看到,云提供了一种灵活且简单的方法来租用资源,如服务器、存储、网络等。云让消费者可以很容易地使用现收现付模式,但是云的许多复杂性被提供商隐藏了起来。

为了更好地理解 Hadoop 是否非常适合在云上,让我们尝试进一步挖掘,看看云是如何在内部组织的。

云的核心是以下机制:

  • 大量具有各种硬件配置的服务器
  • 通过 IP 网络连接并可用的服务器
  • 托管这些设备的大型数据中心
  • 跨地理位置的数据中心,具有演进的网络和数据中心设计

如果我们密切关注,我们正在谈论以下内容:

  • 大量不同的中央处理器架构
  • 速度和性能各不相同的大量存储设备
  • 具有不同速度和互连性的网络

让我们看一下这样一个云上数据中心的简单设计:

在上图中,我们有以下设备:

  • S1****S2:机架式交换机
  • U1-U6 :机架式服务器
  • R1 :路由器
  • 存储区域网络
  • 网络附加存储

正如我们所看到的,云提供商拥有大量这样的体系结构,以使它们具有可扩展性和灵活性。

您应该已经正确地猜到,当这种服务器的数量增加时,当我们请求新的服务器时,提供商可以将服务器分配到该区域的任何地方。

这使得计算和存储在一起有点困难,但也提供了弹性。

为了解决这一同地问题,一些云提供商提供了创建虚拟网络和使用专用服务器的选项,然后在这些服务器上分配他们的所有虚拟节点。这在某种程度上更接近数据中心设计,但足够灵活,可以在不需要时返还资源。

让我们回到 Hadoop,并提醒自己,为了从 Hadoop 系统中获得最佳效果,我们应该让 CPU 功率更接近存储。这意味着中央处理器和存储器之间的物理距离应该更小,因为总线速度与处理要求相匹配。

中央处理器和存储之间的输入/输出速度越慢(例如,iSCSI、存储区域网络、网络连接存储等),我们从 Hadoop 系统获得的性能就越差,因为数据是通过网络获取的,保存在内存中,然后馈送给中央处理器进行进一步处理。

这是在云上设计 Hadoop 系统时需要记住的重要事情之一。

除了性能原因,还有其他需要考虑的因素:

  • 扩展 Hadoop
  • 管理 Hadoop
  • 保护 Hadoop

现在,让我们尝试了解如何在云环境中处理这些问题。

在前几章中,我们看到可以通过以下方法安装 Hadoop:

  • 单独的
  • 半分布式
  • 全分布式

当我们想要在云上部署 Hadoop 时,我们可以使用以下方式进行部署:

  • 自定义外壳脚本
  • 云自动化工具(Chef、Ansible 等)
  • Apache 人 Ambari
  • 云供应商提供的方法
    • 谷歌云数据平台
    • 亚马逊 EMR
    • Microsoft HDInsight
  • 第三方管理的 Hadoop
    • Cloudera
  • 与云无关的部署
    • Apache 呼尔

谷歌云数据平台

在本节中,我们将学习如何使用谷歌云数据块来设置单节点 Hadoop 集群。

这些步骤可以分为以下几个部分:

  1. 获得谷歌云帐户。
  2. 激活谷歌云数据鹏服务。
  3. 创建新的 Hadoop 集群。
  4. 登录到 Hadoop 集群。
  5. 正在删除 Hadoop 集群。

获得谷歌云账户

本节假设您已经有一个谷歌云帐户。

激活谷歌云数据鹏服务

登录谷歌云控制台后,您需要访问云数据鹏服务。激活屏幕如下所示:

创建新的 Hadoop 集群

一旦在项目中启用了数据块,我们就可以点击创建来创建一个新的 Hadoop 集群。

之后,我们会看到另一个屏幕,需要在其中配置集群参数:

我把大部分东西都保留了默认值。稍后,我们可以点击创建按钮,为我们创建一个新的集群。

登录到群集

成功创建集群后,我们将自动进入集群列表页面。从那里,我们可以启动一个 SSH 窗口来登录我们创建的单节点集群。

SSH 窗口如下所示:

如您所见,Hadoop 命令对我们来说是现成的,我们可以运行任何标准的 Hadoop 命令来与系统交互。

删除群集

要删除集群,请单击删除按钮,它将显示一个确认窗口,如下图所示。此后,群集将被删除:

看起来很简单,对吧?是的。云提供商让用户使用云变得非常简单,并且只为使用付费。

云中的数据访问

云已经成为存储个人数据和业务数据的重要目的地。根据数据的重要性和保密要求,组织已经开始使用云来存储他们的重要数据集。

下图试图总结典型企业的各种访问模式,以及它们如何利用云来存储数据:

云提供商提供不同种类的存储。让我们看看这些类型是什么:

  • 块存储器
  • 基于文件的存储
  • 加密存储
  • 离线存储

块存储器

当我们希望与计算服务器一起使用这种存储,并希望通过主机操作系统管理存储时,这种类型的存储非常有用。

为了更好地理解这一点,这种类型的存储相当于我们购买笔记本电脑/MacBook 时附带的硬盘/固态硬盘。就笔记本电脑存储而言,如果我们决定增加容量,我们需要用另一个磁盘替换现有磁盘。

说到云,如果我们想增加更多容量,我们可以购买另一个更大容量的存储,并将其连接到我们的服务器。这是云变得流行的原因之一,因为它可以非常容易地添加或缩减我们需要的存储。

记住这一点很好,因为我们的应用有许多不同类型的访问模式,云供应商还提供具有不同存储/速度要求的数据块存储,以他们自己的容量/IOPS 等衡量。

让我们举一个容量升级要求的例子,看看我们如何在云上利用这种数据块存储。

为了理解这一点,让我们看一下这个图中的例子:

想象一下由管理员创建的名为 DB1 的服务器,原始容量为 100 GB 。后来,由于客户的意外需求,一个应用开始消耗所有的 100 GB 存储,因此管理员决定将容量增加到 1 TB (1,024 GB)。

在这种情况下,工作流是这样的:

  1. 在云上创建一个新的 1 TB 磁盘
  2. 将磁盘连接到服务器并安装
  3. 备份数据库
  4. 将数据从现有磁盘复制到新磁盘
  5. 启动数据库
  6. 验证数据库
  7. 销毁旧磁盘上的数据并归还磁盘

该过程得到了简化,但在生产中,这可能需要一些时间,具体取决于管理员执行的维护类型。但是,从云的角度来看,获取新的数据块存储非常快。

文件存储器

文件是计算的基础。如果你熟悉 UNIX/Linux 环境,你已经知道,一切都是文件在 UNIX 世界里。但是不要与此混淆,因为每个操作系统都有自己处理硬件资源的方式。在这种情况下,我们不担心操作系统如何处理硬件资源,但我们谈论的是用户作为日常业务的一部分存储的重要文档。

这些文件可以是:

  • 电影/会议录音
  • 图片
  • Excel 工作表
  • Word 文档

尽管它们在我们的计算机中看起来很简单,但它们可能具有重要的业务意义,当我们考虑将它们存储在云上时,应该小心处理。

大多数云提供商都提供了一种在云上存储这些简单文件的简单方法,并且在安全性方面也提供了灵活性。

获取此表单存储的典型工作流程如下:

  1. 创建一个唯一标识的新存储桶
  2. 向该桶添加私有/公共可见性
  3. 向存储在此存储桶中的数据添加多地域复制要求

一些云提供商根据客户在创建存储桶时选择的功能数量向其收费。

Please choose a hard-to-discover name for buckets that contain confidential data, and also make them private.

加密存储

这是业务关键数据的一个非常重要的要求,因为我们不希望信息泄露到组织范围之外。云提供商为我们提供静态加密设施。一些供应商选择自动执行此操作,一些供应商还提供了灵活性,允许我们为自己拥有的数据选择加密密钥和加密/解密方法。根据组织策略,我们应该遵循最佳实践来处理云上的这种情况。

随着存储设备性能的提高,加密不会在解密/加密文件时增加大量开销。如下图所示:

继续之前的相同示例,当我们选择加密 **1 TB 的底层数据块存储时,**我们可以利用云提供的加密,在那里他们会自动为我们加密和解密数据。因此,我们不必在主机操作系统上使用特殊的软件来进行加密和解密。

请记住,加密可以是供应商提供的数据块存储和基于文件的存储中的一项功能。

冷藏

这种存储对于在云中存储很少访问的重要备份非常有用。由于我们在这里处理的是一种特殊类型的数据,我们还应该意识到,云供应商可能会对来自该存储的数据访问收取很高的费用,因为它应该被写入一次并被遗忘(直到需要为止)。这种机制的优势在于,我们只需支付更少的费用就可以存储甚至千兆字节的数据。

摘要

在这一章中,我们了解了云计算的含义,并看到了云如何彻底改变了我们在互联网上访问和管理服务器和应用的方式。然后,我们浏览了不同提供商在云上提供的不同技术的列表。

我们还学习了如何规划我们的云基础架构,并研究了在云上构建我们自己的 Hadoop 集群所涉及的不同步骤。最后,我们看到了在云上存储和访问数据的不同方式。

在下一章中,我们将了解一些部署 Hadoop 集群的策略和最佳实践。

十一、面向生产的 Hadoop 集群部署

Hadoop 本身以强大的核心和文件系统开始,旨在应对大数据挑战。后来,在此基础上开发了许多应用,创建了一个相互配合的大型应用生态系统。随着应用数量开始增加,创建和管理 Hadoop 环境的挑战也随之增加。

在本章中,我们将了解以下内容:

  • Apache 人 Ambari
  • 一个带有 Ambari 的 Hadoop 集群

Apache Ambari 架构

Apache Ambari 遵循主/从架构,其中主节点指示从节点执行某些操作,并报告每个操作的状态。主节点负责跟踪基础设施的状态。为此,主节点使用数据库服务器,该服务器可以在设置期间进行配置。

为了更好地理解安巴里是如何工作的,让我们来看看安巴里的高层架构,如下图所示:

核心是,我们有以下应用:

  • Ambari 服务器
  • 安巴里特工
  • 安巴里网络用户界面
  • 数据库ˌ资料库

安巴里服务器

Ambari 服务器(ambari-server)是一个 shell 脚本,它是主服务器上所有管理活动的入口点。这个脚本在内部使用 Python 代码ambari-server.py,,并将所有请求路由到它。

安巴里服务器具有以下入口点,当向ambari-server程序传递不同参数时,这些入口点可用:

  • 守护进程管理
  • 软件升级
  • 软件设置
  • LDAP/PAM/Kerberos 管理
  • Ambari 备份和恢复
  • 其他选项

守护进程管理

当从命令行用startstopresetrestart参数调用脚本时,守护程序管理模式被激活。

例如,如果我们想要启动 Ambari 后台服务器,我们可以运行以下命令:

Example: ambari-server start

软件升级

一旦安装了 Ambari,我们就可以使用这种模式来升级 Ambari 服务器本身。当我们用upgrade标志调用ambari-server程序时,就会触发这一点。如果我们想升级整个安巴里堆栈,我们可以传递upgradestack标志:

Example: ambari-server upgrade

软件设置

一旦安巴里从互联网上下载(或通过 YUM 和 APT 安装),我们需要做一个软件的初步设置。当我们将setup标志传递给程序时,可以触发该模式。这个模式会问我们几个需要回答的问题。除非我们完成这一步,否则 Ambari 不能用于任何类型的服务器管理:

Example: ambari-server setup

LDAP/PAM/Kerberos 管理

T he 轻量级目录访问协议 ( LDAP )用于企业中的身份管理。为了使用基于 LDAP 的身份验证,我们需要使用以下标志:setup-ldap(用于使用ambari设置ldap属性)和sync-ldap(执行来自ldap服务器的数据同步):

Example: ambari-server setup-ldap
Example: ambari-server sync-ldap

可插拔身份验证模块 ( PAM )是任何 UNIX 或 Linux 操作系统中身份验证和授权的核心。如果我们想为安巴里利用基于 PAM 的访问,那么我们需要使用setup-pam选项来运行它。如果我们想从 LDAP 转向基于 PAM 的身份验证,我们需要使用migrate-ldap-pam运行它:

Example: ambari-server setup-pam
Example: ambari-server migrate-ldap-pam

Kerberos 是另一种先进的身份验证和授权机制,在网络环境中非常有用。这简化了大型服务器上的真实性、授权和审核 ( AAA )。如果我们想对 Ambari 使用 Kerberos,我们可以使用setup-kerberos标志:

Example: ambari-server setup-kerberos

Ambari 备份和恢复

如果我们想拍摄当前安装的 Ambari 的快照(不包括数据库),我们可以进入这个模式。这支持通过backuprestore标志调用的备份和恢复方法:

Example: ambari-server backup
Example: ambari-server restore

其他选项

除了这些选项之外,安巴里服务器程序还提供了其他选项,您可以使用-h(帮助)标志来调用这些选项。

安巴里特工

安巴里代理是一个程序,它运行在我们希望由安巴里管理的所有节点上。该程序定期向主节点发送心跳信号。使用该代理,ambari-server执行服务器上的许多任务。

Ambari 网络界面

这是 Ambari 应用的强大功能之一。该 web 应用由运行在主主机上的 Ambari 服务器程序公开;我们可以在端口8080上访问这个应用,它受到身份验证的保护。

一旦我们登录到这个门户网站,我们就可以控制和查看 Hadoop 集群的所有方面。

数据库ˌ资料库

Ambari 支持多个关系数据库管理系统来跟踪整个 Hadoop 基础设施的状态。在第一次安装 Ambari 服务器的过程中,我们可以选择我们想要使用的数据库。

在撰写本文时,安巴里支持以下数据库:

  • 一种数据库系统
  • 神谕
  • MySQL 或 MariaDB
  • 嵌入式 PostgreSQL
  • 微软 SQL 服务器
  • SQL Anywhere
  • 伯克利数据库

使用 Ambari 设置 Hadoop 集群

在本节中,我们将学习如何使用 Ambari 从头开始设置一个全新的 Hadoop 集群。为了做到这一点,我们需要四个服务器——一个服务器用于运行 Ambari 服务器,另外三个节点用于运行 Hadoop 组件。

服务器配置

下表显示了我们在本练习中使用的服务器配置:

| 服务器类型 | 名称 | CPU | ram | 磁盘 | | Ambari 服务器节点 | 掌握 | one | 3.7 GB | 100 GB | | Hadoop 节点 1 | 节点 1 | Two | 13 GB | 250 GB | | Hadoop 节点 2 | 节点 2 | Two | 13 GB | 250 GB | | Hadoop 节点 3 | 节点 3 | Two | 13 GB | 250 GB |

由于这是一个示例设置,我们对这种配置很满意。对于现实场景,请根据您的需求选择配置。

准备服务器

本部分和所有其他部分都假设您在所有服务器上都有一个工作正常的互联网连接,并且安全地用防火墙来防止任何入侵。

所有服务器都运行 CentOS 7 操作系统,因为它是一个使用 RPM/YUM 进行包管理的系统。当您在以下部分看到yum时,不要感到困惑。

在我们开始使用服务器之前,我们需要运行基本的实用程序来帮助我们解决服务器的各种问题。它们是作为下一个命令的一部分安装的。如果你不确定它们是什么,不要担心。除了mysql-connector-javawget以外,所有其他公用设施都不是强制性的:

sudo yum install mysql-connector-java wget iftop iotop smartctl -y

安装 Ambari 服务器

创建 Hadoop 集群的第一步是启动和运行我们的 Ambari 服务器应用。因此,使用 SSH 登录到主节点,并按顺序执行以下步骤:

  1. 使用以下命令下载 CentOS 7 的 Ambari YUM 存储库:
[user@master ~]$ wget http://public-repo-1.hortonworks.com/ambari/centos7/2.x/updates/2.6.1.5/ambari.repo

  1. 在这一步之后,我们需要使用以下命令将ambari.repo文件移动到/etc/yum.repos.d目录:
[user@master ~]$ sudo mv ambari.repo /etc/yum.repos.d
  1. 下一步是借助这个命令安装ambari-server包:
[user@master ~]$ sudo yum install ambari-server -y
  1. 我们将使用 MySQL 服务器作为我们的 Ambari 服务器。因此,让我们也安装所需的软件包:
[user@master ~]$ sudo yum install mariadb-server -y
  1. 让我们先配置 MySQL 服务器(或 MariaDB),然后再接触 Ambari 设置过程。这是通过以下命令完成的:
[user@master ~]$ sudo service mariadb start
Redirecting to /bin/systemctl start mariadb.service
  1. 然后,用密码ambari,创建一个名为ambari的数据库和一个名为ambari的用户,这样安巴里服务器的配置就很容易在下面的步骤中设置了。这可以通过以下 SQL 查询来完成:
CREATE DATABASE ambari;
GRANT ALL PRIVILEGES ON ambari.* to ambari@localhost identified by 'ambari';
GRANT ALL PRIVILEGES ON ambari.* to ambari@'%' identified by 'ambari';
FLUSH PRIVILEGES;
  1. 将这四行存储到名为ambari.sql的文本文件中,并使用以下命令执行:
[user@master ~] mysql -uroot < ambari.sql
  1. 这将创建一个数据库,并给予用户必要的特权。

Please use a strong password for production setup, otherwise your system will be vulnerable to any attacks.

现在我们已经完成了基础工作,让我们运行安巴里服务器设置。请注意,我们需要回答以下几个突出显示的问题:

[user@master ~]$ sudo ambari-server setup
Using python /usr/bin/python
Setup ambari-server
Checking SELinux...
SELinux status is 'enabled'
SELinux mode is 'enforcing'
Temporarily disabling SELinux
WARNING: SELinux is set to 'permissive' mode and temporarily disabled.
OK to continue [y/n] (y)? <ENTER>
Customize user account for ambari-server daemon [y/n] (n)? <ENTER>
Adjusting ambari-server permissions and ownership...
Checking firewall status...
WARNING: iptables is running. Confirm the necessary Ambari ports are accessible. Refer to the Ambari documentation for more details on ports.
OK to continue [y/n] (y)? <ENTER>
Checking JDK...
[1] Oracle JDK 1.8 + Java Cryptography Extension (JCE) Policy Files 8
[2] Oracle JDK 1.7 + Java Cryptography Extension (JCE) Policy Files 7
[3] Custom JDK
==============================================================================
Enter choice (1): <ENTER>
To download the Oracle JDK and the Java Cryptography Extension (JCE) Policy Files you must accept the license terms found at http://www.oracle.com/technetwork/java/javase/terms/license/index.html and not accepting will cancel the Ambari Server setup and you must install the JDK and JCE files manually.
Do you accept the Oracle Binary Code License Agreement [y/n] (y)? <ENTER>
Downloading JDK from http://public-repo-1.hortonworks.com/ARTIFACTS/jdk-8u112-linux-x64.tar.gz to /var/lib/ambari-server/resources/jdk-8u112-linux-x64.tar.gz
jdk-8u112-linux-x64.tar.gz... 100% (174.7 MB of 174.7 MB)
Successfully downloaded JDK distribution to /var/lib/ambari-server/resources/jdk-8u112-linux-x64.tar.gz
Installing JDK to /usr/jdk64/
Successfully installed JDK to /usr/jdk64/
Downloading JCE Policy archive from http://public-repo-1.hortonworks.com/ARTIFACTS/jce_policy-8.zip to /var/lib/ambari-server/resources/jce_policy-8.zip

Successfully downloaded JCE Policy archive to /var/lib/ambari-server/resources/jce_policy-8.zip
Installing JCE policy...
Checking GPL software agreement...
GPL License for LZO: https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html
Enable Ambari Server to download and install GPL Licensed LZO packages [y/n] (n)? y <ENTER>
Completing setup...
Configuring database...
Enter advanced database configuration [y/n] (n)? y <ENTER>
Configuring database...
==============================================================================
Choose one of the following options:
[1] - PostgreSQL (Embedded)
[2] - Oracle
[3] - MySQL / MariaDB
[4] - PostgreSQL
[5] - Microsoft SQL Server (Tech Preview)
[6] - SQL Anywhere
[7] - BDB
==============================================================================
Enter choice (1): 3 <ENTER>
Hostname (localhost): 
Port (3306): 
Database name (ambari): 
Username (ambari): 
Enter Database Password (bigdata): ambari <ENTER>
Re-enter password: ambari <ENTER>
Configuring ambari database...
Configuring remote database connection properties...
WARNING: Before starting Ambari Server, you must run the following DDL against the database to create the schema: /var/lib/ambari-server/resources/Ambari-DDL-MySQL-CREATE.sql
Proceed with configuring remote database connection properties [y/n] (y)? <ENTER>
Extracting system views...
ambari-admin-2.6.1.5.3.jar
...........
Adjusting ambari-server permissions and ownership...
Ambari Server 'setup' completed successfully.
  1. 安装完成后,我们需要使用安装过程中生成的前一个文件在 Ambari 数据库中创建表。这可以通过以下命令完成:
[user@master ~] mysql -u ambari -pambari ambari < /var/lib/ambari-server/resources/Ambari-DDL-MySQL-CREATE.sql
  1. 下一步是我们启动ambari-server守护进程。这将启动 web 界面,我们将在以下步骤中使用该界面来创建 Hadoop 集群:
[user@master ~]$ sudo ambari-server start
Using python /usr/bin/python
Starting ambari-server
Ambari Server running with administrator privileges.
Organizing resource files at /var/lib/ambari-server/resources...
Ambari database consistency check started...
Server PID at: /var/run/ambari-server/ambari-server.pid
Server out at: /var/log/ambari-server/ambari-server.out
Server log at: /var/log/ambari-server/ambari-server.log
Waiting for server start...............................
Server started listening on 8080
DB configs consistency check: no errors and warnings were found.
Ambari Server 'start' completed successfully.
  1. 服务器设置完成后,配置 JDBC 驱动程序(这对所有其他节点也很有帮助):
[user@master ~] sudo ambari-server setup --jdbc-db=mysql --jdbc-driver=/usr/share/java/mysql-connector-java.jar

准备 Hadoop 集群

在创建 Hadoop 集群之前,我们还需要做几个步骤。

由于我们已经启动并运行了 Ambari 服务器,因此让我们生成一个 RSA 密钥对,用于 Ambari 服务器和 Ambari 代理节点之间的通信。

该密钥对允许 Ambari 服务器节点登录到所有 Hadoop 节点,并以自动方式执行安装。

如果您已经在采购服务器和基础架构的过程中这样做了,则此步骤是可选的:

[user@master ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): <ENTER>
Enter same passphrase again: <ENTER>
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:JWBbGdAnRHM0JFj35iSAcQk+rC0MhyHlrFawr+d2cZ0 user@master
The key's randomart image is:
+---[RSA 2048]----+
|.oo   *@@**    |
| +oo +o==*.o     |
| .=.. = .oo +    |
| .o+ o . o =     |
|.. .+ . S . .    |
|. .  o . E      |
| . .  o    |
|  o. .           |
|  ...            |
+----[SHA256]-----+

这将在/home/user/.ssh目录中生成两个文件:

  • ~/.ssh/id_rsa:这是需要保密的私钥文件
  • ~/.ssh/id_rsa.pub:这是允许任何 SSH 登录使用私钥文件的公钥文件

这个id_rsa.pub文件的内容应该放在所有 Hadoop 节点上的~/.ssh/authorized_keys中。在这种情况下,它们是节点服务器(1–3)。

This step of propagating all the public SSH keys can be done during the server provisioning itself, so a manual step is avoided every time we acquire new servers.

现在,我们将只使用安巴里网络界面完成所有工作。

创建 Hadoop 集群

在本节中,我们将使用 Ambari 网络界面构建一个 Hadoop 集群。本节假设以下情况:

  • 节点(1–3)可通过 SSH 从主服务器访问
  • 管理员可以使用主服务器的id-rsa私钥登录到节点(1–3)
  • UNIX 用户可以运行sudo并在节点(1–3)服务器上执行所有管理操作
  • 安巴里服务器安装完成
  • 浏览器可以访问安巴里网络界面,没有任何防火墙限制

Ambari 网络界面

让我们打开一个网页浏览器,使用http://<server-ip>:8080连接到安巴里服务器网页界面。我们会看到这样的登录屏幕。请输入admin作为用户名,admin作为密码继续:

登录成功后,我们将进入主页。

安巴里主页

这是主页面,用户界面上有多个选项。由于这是全新的安装,目前还没有可用的集群数据。

让我们看看主页的截图:

从这个地方,我们可以开展以下活动:

创建集群

正如您可能已经猜到的,本节用于启动一个向导,该向导将帮助我们从浏览器创建一个 Hadoop 集群。

管理用户和组

本节有助于管理可以使用和管理 Ambari web 应用的用户和组。

部署视图

该界面有助于为不同类型的用户创建视图,以及他们可以通过 Ambari 网络界面执行哪些操作。

由于我们的目标是创建一个新的 Hadoop 集群,我们将单击启动安装向导按钮并开始创建 Hadoop 集群的过程。

群集安装向导

Hadoop 集群创建分为多个步骤。我们将在下面的部分中完成所有这些步骤。首先,我们会看到一个屏幕,我们需要在其中命名我们的 Hadoop 集群。

命名您的集群

我选择了packt作为 Hadoop 集群名称。当在屏幕中输入 Hadoop 名称时,单击下一步。屏幕如下所示:

选择 Hadoop 版本

一旦我们命名了 Hadoop 集群,我们会看到一个屏幕来选择我们想要运行的 Hadoop 版本。

在撰写本文时,Ambari 支持以下 Hadoop 版本:

  • Hadoop 2.3
  • Hadoop 2.4
  • Hadoop 2.5
  • Hadoop 2.6(最高 2.6.3.0)

您可以选择安装的任何版本。我选择了默认选项 2.6.3.0 版本,可以在这个截图中看到:

单击屏幕底部的下一步继续下一步。

选择服务器

下一个逻辑步骤是选择我们将在其上安装 Hadoop-2.6.3.0 版本的服务器列表。如果您还记得原始表,我们将节点服务器命名为(1–3)。我们将在用户界面中输入这些。

由于安装将完全自动化,我们还需要提供我们在用户界面上一节中生成的 RSA 私钥。这将确保主节点可以通过 SSH 登录到服务器,而无需任何密码。

此外,我们需要提供一个已经在所有节点(1–3)服务器上创建的 UNIX 用户名,这些服务器也可以接受 RSA 密钥进行身份验证。

Add id_rsa.pub to ~/.ssh/authorized_keys on the node (1–3) servers.

请记住,这些主机名应该在域名系统 ( 域名系统)服务器中有正确的条目,否则安装将无法从这一步继续。

我给出的名字可以在下面的截图中看到:

输入数据后,点击注册并确认。

设置节点

在此步骤中,如果详细信息准确,Ambari 代理会自动安装在给定的节点上。成功确认如下所示:

如果我们想删除任何节点,这是我们可以在其中进行操作的屏幕。当我们准备好进入下一步时,请单击“下一步”。

选择服务

现在,我们需要选择要安装在我们选择的三台服务器上的应用/服务列表。

在撰写本报告时,安巴里支持以下服务:

| 应用/服务 | 应用描述 | | HDFS | Hadoop 分布式文件系统 | | Yarn+地图还原 2 | 下一代地图简化框架 | | Tez | Hadoop 查询处理框架建立在 YARN 之上 | | 储备 | 用于特定查询的数据仓库系统 | | 巴什 | 非关系分布式数据库 | | PIG | 用于分析 HDFS 数据集的脚本平台 | | Sqoop | 在 Hadoop 和 RDBMS 之间传输数据的工具 | | 驭象者 | 使用网络用户界面协调 Hadoop 作业的工作流 | | 动物园管理员 | 分布式系统协调提供服务 | | 猎鹰 | 数据处理和管理平台 | | 暴风雨 | 流处理框架 | | 水道 | 分布式系统,用于收集、聚合流式数据并将其移动到 HDFS | | 累积性 | 分布式密钥/值存储 | | 下面两个例子 | Amari 组件使用的共享服务 | | 安巴里度量 | 基于 Grafana 的公制收集和存储系统 | | 阿特拉斯 | 元数据和治理平台 | | 卡夫卡 | 分布式流媒体平台 | | 诺克斯 | 所有 Hadoop 组件的单点身份验证提供程序 | | 日志搜索 | Ambari 管理的服务日志聚合器和查看器 | | 看守人 | Hadoop 数据安全应用 | | 游骑兵 KMS | 密钥管理服务器 | | SmartSense | Hortonworks 智能感知工具,用于诊断应用 | | Spark | 大规模数据处理框架 | | 齐柏林笔记本 | 用于数据分析的网络笔记本 | | 德鲁伊特 | 面向列的数据存储 | | 象夫 | 机器学习算法 | | 滑块 | 监控 Yarn 上应用的框架 | | 超集 | 基于浏览器的关系数据库管理系统和德鲁伊数据探索平台 |

作为当前步骤的一部分,我们只选择了 HDFS 及其附属地区。屏幕显示如下:

做出选择后,单击用户界面底部的“下一步”按钮。

节点上的服务放置

在这一步中,我们将看到在我们选择安装的三个节点上自动选择服务。如果我们想定制服务在节点上的位置,我们可以这样做。位置如下所示:

当更改看起来不错时,单击下一步。

选择从节点和客户端节点

一些应用支持从属和客户端实用程序。在此屏幕中,我们需要选择要在其上安装这些应用的节点。如果您不确定,请单击“下一步”。屏幕如下所示:

定制服务

尽管 Ambari 会自动选择应用之间的大多数属性和链接,但它为我们提供了一些灵活性来选择某些功能的值,例如:

  • 数据库
  • 用户名
  • 密码

和其他有助于应用平稳运行的属性。这些在当前屏幕中以红色突出显示。

为了自定义这些,我们需要转到突出显示属性的选项卡,并根据我们的需要选择值。屏幕如下所示:

所有服务属性配置正确后,我们在 UI 中看不到任何红色内容,可以点击页面底部的“下一步”按钮。

审查服务

在这一步中,我们将看到到目前为止所做更改的摘要。我们可以选择打印更改,这样我们就不会忘记它们(别担心,所有这些都可以在以后的用户界面上找到)。现在,我们可以单击部署。此时将对节点进行实际更改。

如果我们取消此过程,将不会对服务器进行任何更改。向导的当前状态如下所示:

在节点上安装服务

在上一步中单击“部署”后,安巴里服务器将生成一个部署计划,应用将使用运行在所有节点上的安巴里代理并行部署在所有节点上。

在这一步中,我们可以看到实时部署的进度。

安装完所有组件后,它们将自动启动,我们可以在此屏幕中看到成功完成:

一切完成后,单击下一步。在任何失败的情况下,我们会看到失败的地方,并且会给我们一个重试安装的选项。如果有任何失败,我们需要挖掘错误并修复潜在的问题。

如果你已经按照本节开始时给出的说明去做了,你应该可以让一切顺利进行。

安装摘要

在这一步中,我们将看到已安装内容的摘要。屏幕如下所示:

单击“完成”按钮,这标志着 Hadoop 集群设置的结束。接下来,我们将进入集群仪表板。

集群仪表板

这是我们刚刚创建的 Hadoop 集群的主页,在这里我们可以看到已经安装的所有服务和健康传感器的列表。

我们可以在这个界面中管理 Hadoop 集群的所有方面。请随意探索该界面并使用它来了解更多信息:

这标志着使用 Ambari 创建 Hadoop 集群的结束。

Hadoop 集群

到目前为止,我们已经看到了如何使用 Ambari 创建单个 Hadoop 集群。但是,有没有对多个 Hadoop 集群的需求?

答案取决于业务需求。单个 Hadoop 集群和多个 Hadoop 集群各有利弊。

在我们讨论这两者的优缺点之前,让我们看看在什么场景下我们可以使用其中的任何一个。

面向整个企业的单一集群

这是最直接的方法,至少每个企业都从一个集群开始。随着业务多样性的增加,组织倾向于为每个部门或业务单位选择一个集群。

以下是一些优点:

  • 易操作性:由于只有一个 Hadoop 集群,管理起来非常容易,管理的时候团队规模也会是最优的。
  • 一站式商店:由于所有的公司数据都在一个地方,所以很容易想出创新的方法来使用数据并在数据之上生成分析。
  • 集成成本:企业内部的团队和部门可以非常轻松地与这个单一的系统进行集成。他们在管理应用时需要处理的配置不太复杂。
  • 服务成本:企业可以更好地了解其整个大数据使用情况,还可以以不那么严格的方式规划其系统的扩展。

采用这种方法的一些缺点如下:

  • 规模成为挑战:即使 Hadoop 可以在成百上千的服务器上运行,管理如此大的集群也成为一个挑战,尤其是在升级和其他变化期间。
  • 单点故障 : Hadoop 内部在 HDFS 文件系统中内置了复制功能。当更多节点出现故障时,很可能会出现数据丢失,并且很难从中恢复。
  • 治理是一项挑战:随着数据、应用和用户规模的增加,如果没有适当的规划和实施,跟踪数据是一项挑战。
    • 安全和机密数据管理:企业处理的数据种类繁多,从高度敏感的数据到短暂的数据都有。当各种数据被放入大数据解决方案中时,我们必须采用非常强大的身份验证和授权规则,以便数据只对正确的受众可见。

带着这些想法,让我们看看企业中拥有 Hadoop 集群的另一种可能性。

多个 Hadoop 集群

即使在一个组织中拥有单个 Hadoop 集群更容易维护,但有时拥有多个 Hadoop 集群以保持业务平稳运行并减少对单点故障系统的依赖也很重要。

这些多个 Hadoop 集群的使用有几个原因:

  • 裁员
  • 冷备份
  • 高可用性
  • 业务连续性
  • 应用环境

裁员

当我们想到冗余的 Hadoop 集群时,我们应该考虑我们可以保留多少冗余。我们已经知道, Hadoop 分布式文件系统 ( HDFS )内置了内部数据冗余。

考虑到 Hadoop 集群有许多围绕它构建的生态系统(服务,如 Yarn、卡夫卡等),我们应该仔细考虑和计划是让整个生态系统冗余,还是通过将数据保留在不同的集群中来仅使数据冗余。

由于有工具可以将数据从一个 HDFS 复制到另一个 HDFS,因此更容易使 Hadoop 的 HDFS 部分冗余。

让我们通过这张图来看看实现这一点的可能方法:

正如我们在这里看到的,主 Hadoop 集群运行其所有应用的完整堆栈,数据通过多个来源提供给它。

我们定义了两种类型的冗余集群:

完全冗余的 Hadoop 集群

该集群运行与主集群完全相同的一组应用,数据定期从主 Hadoop 集群中复制。由于这是从主群集到第二个群集的单向拷贝,因此当我们对此完全冗余的群集进行任何更改时,我们可以 100%确定主群集不会受到影响。

需要理解的一件重要的事情是,我们正在这个集群中运行应用的所有其他实例。由于每个应用都在自己的预定义位置维护其状态,因此应用状态不会从主 Hadoop 集群复制到该集群,这意味着在主 Hadoop 集群中创建的作业在该集群中不可见。这同样适用于卡夫卡的主题,动物园管理员节点,以及更多。

这种类型的集群有助于运行不同的环境,如质量保证、转移等。

数据冗余 Hadoop 集群

在这种类型的集群设置中,我们创建一个新的 Hadoop 集群,并从主集群复制数据,就像前面的例子一样;但是在这里,我们并不担心在这个集群中运行的其他应用。

这种类型的设置适用于:

  • 在不同的地理位置为 Hadoop 进行数据备份
  • 与其他企业/组织共享大数据

冷备份

随着数据的老化,冷备份对企业来说非常重要。尽管 Hadoop 旨在存储无限量的数据,但并不总是需要保持所有数据可供处理。

出于审计目的和历史原因,有时需要保存数据。在这种情况下,我们可以创建一个只有 HDFS(文件系统)组件的专用 Hadoop 集群,并定期将所有数据同步到该集群中。

该系统的设计类似于数据冗余 Hadoop 集群。

高可用性

尽管 Hadoop 在体系结构中有多个组件,但由于内部设计,并非所有组件都高度可用。

Hadoop 的核心组件是分布式、容错的文件系统 HDFS。HDS 有多个组件,其中之一是名称节点,它是文件在 HDFS 的位置的注册表。在早期版本的 HDS 中,名称节点是单点故障,在最新版本中,添加了辅助名称节点,以帮助满足 Hadoop 集群的高可用性要求。

为了使 Hadoop 生态系统的每个组件都成为一个高可用性系统,我们需要添加多个冗余节点(它们都有自己的成本),作为一个集群一起工作。

还有一点需要注意的是,Hadoop 的高可用性在单个地理区域内是可能的,因为应用的数据位置是 Hadoop 的关键因素之一。当我们有多个数据中心时,我们需要交替考虑,以实现数据中心的高可用性。

业务连续性

这是业务连续性规划 ( BCP )的一部分,如果规划不正确,自然灾害可能会终结 Hadoop 系统。

这里的策略是使用多个地理区域作为提供商来运行大数据系统。当我们谈论多个数据中心时,明显的挑战是网络和管理这两个系统的相关成本。最大的挑战之一是如何保持多个区域同步。

一个可能的解决方案是在其他地理区域构建一个完全冗余的 Hadoop 集群,并定期保持数据同步。在一个地区发生任何灾难/故障的情况下,我们的业务不会停止,因为我们可以顺利运营。

应用环境

许多企业内部采用不同的方式将软件发布到生产环境中。作为其中的一部分,他们遵循几种连续集成方法,以便更好地控制 Hadoop 环境的稳定性。用主生产环境中 X%的数据构建多个较小的 Hadoop 集群并在此运行所有应用是很好的。

应用可以在这些专用环境(质量保证、试运行等)上构建它们的集成测试,并且一旦一切正常,就可以将其软件发布到生产环境中。

我遇到的一个实践是,组织倾向于直接将代码运送到生产中,并最终因为未经测试的工作流或错误而面临应用的中断。拥有专用的 Hadoop 应用环境来彻底测试软件并实现更高的正常运行时间和更快乐的客户是一个很好的做法。

Hadoop 数据拷贝

我们在前面的章节中已经看到,拥有高度可用的数据对于企业取得成功并跟上竞争对手的步伐非常重要。

在本节中,我们将探讨实现高可用性数据设置的可能方法。

HDFS 数据拷贝

Hadoop 以 HDFS 为核心存储文件。HDFS 具有机架感知能力,并且足够智能,当应用在数据节点上运行时,可以减少网络数据传输。

在 HDFS 环境中,数据复制的首选方式之一是使用 DistCp。这方面的官方文件可在以下网址获得hadoop.apache.org/docs/r1.2.1…

我们将看到几个将数据从一个 Hadoop 集群复制到另一个 Hadoop 集群的例子。但在此之前,让我们看看数据是如何布局的:

为了将数据从生产 Hadoop 集群复制到备份 Hadoop 集群,我们可以使用distcp。让我们看看怎么做:

hadoop distcp hdfs://NameNode1:8020/projects hdfs://NameNode2:8020/projects
hadoop distcp hdfs://NameNode1:8020/users hdfs://NameNode2:8020/users
hadoop distcp hdfs://NameNode1:8020/streams hdfs://NameNode2:8020/streams
hadoop distcp hdfs://NameNode1:8020/marketing hdfs://NameNode2:8020/marketing
hadoop distcp hdfs://NameNode1:8020/sales hdfs://NameNode2:8020/sales

当我们运行distcp命令时,会创建一个 MapReduce 作业来自动找出文件列表,然后将它们复制到目的地。

完整的命令语法如下所示:

Distcp [OPTIONS] <source path …> <destination path>
  • OPTIONS:这些是命令用来控制执行行为的多个选项。
  • source path:源路径可以是 Hadoop 支持的任何有效的 URI 文件系统。DistCp 支持一次获取多个源路径。
  • destination path:这是单个路径,需要复制所有的源路径。

让我们仔细看看几个重要的选项:

| 标志/选项 | 描述 | | append | 如果目标文件已经存在,则将数据增量写入目标文件(仅执行append,不执行数据块级检查来进行增量复制)。 | | async | 以非阻塞方式执行复制。 | | atomic | 执行所有文件复制或中止,即使一个失败。 | | Tmp <path> | 用于原子提交的路径。 | | delete | 如果文件不在源树中,则从目标中删除文件。 | | Bandwidth <arg> | 限制复制过程中要使用的网络带宽。 | | f <file-path> | 文件名由需要复制的所有路径的列表组成。 | | i | 忽略文件复制过程中的任何错误。 | | Log <file-path> | 保存执行日志的位置。 | | M <number> | 用于复制的最大并发映射数。 | | overwrite | 覆盖文件,即使它们存在于目标上。 | | update | 仅复制丢失的文件和目录。 | | skipcrccheck | 如果通过,传输过程中将跳过循环冗余校验。 |

摘要

在这一章中,我们了解了 Apache Ambari,并详细研究了它的体系结构。然后,我们了解了如何使用 Ambari 准备和创建我们自己的 Hadoop 集群。为了做到这一点,我们还研究了在准备集群之前按照要求配置 Ambari 服务器。我们还了解了单个和多个 Hadoop 集群,以及如何根据业务需求使用它们。