下一代大数据教程(四)

随笔4个月前发布 伴与久
44 0 0

原文:Next-Generation Big Data

协议:CC BY-NC-SA 4.0

八、大数据仓库

几十年来,企业数据仓库一直是企业数据的中央存储库。它是每个组织的商业智能基础设施不可或缺的一部分。

数据仓库有各种形状和形式。多年来,微软和甲骨文公司销售用于 SMP(对称多处理)系统上的数据仓库的关系数据库管理软件。其他公司,如 Teradata,销售大型集成 MPP(大规模并行处理)系统。微软等云提供商提供完全托管的云数据仓库,如 Azure SQL 数据仓库。开发 Apache Hive 项目是为了提供构建在 Hadoop 之上的数据仓库基础设施。无论采用何种形式,数据仓库的目的都是一样的——提供一个可以高效存储、处理和分析结构化数据的平台。

在本章中,我将讨论大数据(更具体地说是 Cloudera Enterprise)如何颠覆数据仓库。我假设读者熟悉数据仓库,所以我不会讨论数据仓库的基础知识和理论。有关数据仓库的权威指南,请参考 Ralph Kimball 的《数据仓库工具包》。 ii

Note

我将在本章(以及整本书)中交替使用术语“大数据”和“Hadoop”。从技术上讲,大数据指的是整个技术和框架生态系统,Hadoop 是其中的一部分。在整本书中,我还将交替使用术语“数据湖”、“数据中心”和“大数据平台”。

大数据时代的企业数据仓库

正如我们所知,大数据时代已经颠覆了数据仓库。大数据的先驱发明了新的数据处理和分析方法,使传统的数据仓库显得过时。大数据平台处理和分析结构化和非结构化数据的能力以及 ELT(提取、加载和转换)、读取模式、数据整理和自助数据分析等新技术暴露了数据仓库的局限性,使传统的数据建模和 ETL 开发生命周期看起来缓慢而僵化。

从成本和技术角度来看,大数据平台通常比传统数据仓库平台更具可扩展性。一般来说,最大的数据仓库最多只能处理数百 TB 的数据,需要大量的硬件投资来扩展。大数据平台可以使用低成本的商用服务器轻松处理和分析数 Pb 的数据。对于大多数组织来说,最实际的问题可能是实现和维护商业数据仓库的财务负担。为了拥有一个全功能的企业数据仓库,公司在许可、基础设施和开发成本上花费了数百万美元。像 Impala、Drill 和 Presto 这样的开源 MPP Apache 项目以很小的成本提供了相当的性能和可伸缩性。

结构化数据仍然占主导地位

对于数据仓库来说,并不完全是厄运和黑暗,远非如此。尽管围绕大数据大肆宣传,但戴尔进行的一项调查显示,超过三分之二的公司报告结构化数据占正在处理的数据的 75%,三分之一的公司报告根本不分析非结构化数据。该调查还显示,结构化数据的增长速度快于非结构化数据。 iii

EDW 现代化

尽管 Cloudera Enterprise 等 Hadoop 平台接近复制数据仓库的一些功能,但商业数据仓库平台仍然是分析结构化数据的最佳平台。Impala 和 Kudu(以及 Hive)仍然缺乏商业数据仓库平台的许多(专有)功能和特性。您会发现一些流行的商业智能和 OLAP(在线分析处理)工具依赖于这些专有特性。Impala 和 Kudu 中没有的一些功能包括多行和多表事务、OLAP 支持、高级备份和恢复特性、二级索引、物化视图、对十进制数据类型的支持以及自动增加列等等。表 8-1 包含了 Impala 和 Kudu 与传统数据仓库平台的对比。

表 8-1

Impala and Kudu vs. a Traditional Data Warehouse

| 特征 | 黑斑羚和库杜 | 数据仓库平台 | | :– | :– | :– | | 多行多表交易 | 不 | 是 | | 自动递增列 | 不 | 是 | | 外键约束 | 不 | 是 | | 次要索引 | 不 | 是 | | 物化视图 | 不 | 是 | | 扳机 | 不 | 是 | | 存储过程 | 不 | 是 | | 数据库缓存 | 不 | 是 | | OLAP 支持 | 不 | 是 | | SQL 的过程扩展 | 不 | 是 | | 高级备份和恢复 | 不 | 是 | | 十进制和复杂数据类型 | 不 | 是 |

Hadoop 供应商通常将他们的平台作为“数据中心”或“数据湖”进行营销,这些平台可用于扩充或更新数据仓库,而不是取代它。事实上,现在大多数公司都有数据仓库和数据湖。有多种方法可以使用数据湖来实现企业数据仓库的现代化:ETL 卸载、活动归档和分析卸载以及数据整合。这些用例相对容易实现。投资回报也很容易衡量并向管理层证明。

ETL 卸载

在典型的数据仓库环境中,IO 和 CPU 密集型数据转换和加载在数据仓库上执行(图 8-1 )。随着时间的推移,随着越来越多的数据被接收并存储在数据仓库中,其 ETL 窗口将开始占用业务时间,导致业务用户无法使用重要的报告和仪表板。一个明显的解决方法是升级数据仓库。这是一个短期的解决方法。随着时间的推移,当您将更多的数据接收到数据仓库中时,您会遇到同样的性能和可伸缩性问题。

下一代大数据教程(四)

图 8-1

Traditional ETL

正确的解决方案是通过 ETL 卸载用数据湖来扩充您的数据仓库。如图 8-2 所示,大部分繁重的数据转换是在大数据平台上执行的,由于 Spark 和 MapReduce 等高度分布式数据处理框架,大数据平台可以在相对较短的时间内处理大量数据。数据湖可以充当临时区域或操作数据存储。然后,经过处理和聚合的数据被加载到数据仓库中,现在可以免费用于数据分析。

下一代大数据教程(四)

图 8-2

ETL Offloading with Big Data

分析卸载和活动归档

您还可以使用您的数据湖来卸载一些昂贵的报告和即席查询。通过卸载一些分析,您可以腾出数据仓库来处理更重要的任务。分析卸载还允许您的数据仓库处理更多数据和并发用户,同时保持较小的数据仓库占用空间,从而为您的组织节省数百万的数据仓库升级费用。

如果您已经使用大数据平台进行 ETL 卸载,那么您已经在大数据平台中存储了数据的副本。您还可以通过将旧数据移动或归档到大数据平台来帮助提高数据仓库的效率。一旦您在大数据平台中获得了所需的数据,您就可以通过 JDBC 将您的 BI 或数据可视化工具(如 Tableau 或 MS Power BI)指向 Impala(图 8-3 )。在某些情况下,BI tools 有一个语义层,它提供了一种连接、读取和缓存来自不同数据源的数据的方法。它向用户隐藏了数据源的详细信息,提供了数据的统一视图。

下一代大数据教程(四)

图 8-3

Some of the analytics are offloaded to the big data platform

数据整合

Hadoop 最好的特性之一是它存储大量数据的能力。通过结合来自商用硬件的存储并提供分布式存储引擎,如 HDFS、HBase 和 Kudu,Hadoop 使大型数据集的存储和处理不仅成为可能,而且变得切实可行。与只能存储结构化数据的数据仓库不同,数据湖可以存储和处理结构化和非结构化数据集,使其成为真正的企业数据存储库。

将数据整合到一个集中的数据湖中有几个好处。首先,它通过使连接和关联数据变得更容易来增强数据分析。第二,因为您的数据在一个中心位置,所以用户可以更容易地跨各种数据集运行 SQL 连接,例如,提供客户的 360 度视图。第三,特征工程–选择和处理属性以及为预测模型创建特征集也变得更加容易。第四,一旦数据被整合到一个中心位置,数据治理和主数据管理就变得简单明了,为您提供一个数据的黄金副本,而不是将同一数据的多个副本分散到多个数据仓库中。

整合数据带来的最切实的好处可能是许可、运营和基础架构成本的大幅降低。对于大型组织来说,积累分散在整个企业中的数百甚至数千个数据库是相当常见的。通过将这些数据库整合到一个集中的数据湖中(图 8-4 ),您可以淘汰托管这些数据库的旧服务器,并停止支付数据库软件许可证的费用。

下一代大数据教程(四)

图 8-4

Consolidating data in a data lake or data hub

重新构建企业数据仓库

这可能是你阅读这本书或这一章的原因。用 Cloudera Enterprise 替换或重新构建数据仓库在技术上是可能的。许多公司已经成功地做到了这一点,在本章的其余部分,我们将讨论如何做到这一点。

Note

提醒一句。除非你有真正令人信服的理由,否则我建议你在用 Cloudera Enterprise 重新平台化你的数据仓库之前三思。有许多事情要考虑。您需要仔细评估贵公司的数据管理和分析需求。您还需要评估 Cloudera Enterprise 的能力和弱点。你的商业智能和 OLAP 工具能和 Impala 一起工作吗?您需要迁移数千个 ETL 作业吗?把 PL/SQL 或者 T-SQL 移植到 Impala SQL 有多难?在经历将数据仓库迁移到 Cloudera Enterprise 的磨难之前,这些只是您需要问自己的一些问题。

大数据仓库 101

对于我们的示例,我们将使用来自微软 iv 的 AdventureWorksDW 免费示例数据库。如果你想学习我们的例子,你可以从微软的网站下载这个数据库。

维度建模

维度建模是对数据库表进行逻辑建模的一种方式,以便于使用和提高 SQL 查询性能。维度模型是当今市场上大多数商业智能和 OLAP 系统的逻辑基础。事实上,大多数数据仓库平台在设计和优化时都考虑了维度建模。维度建模有几个概念:

事实

维度模型有事实数据表,其中包含表示业务指标(如销售额或成本)的度量值或数值。一个数据仓库通常有几个用于不同业务流程的事实表。在 Kudu 之前,出于性能原因,事实表通常以 Parquet 格式存储。

维度表

维度表包含描述事实表中存储的度量或为其提供上下文的属性。典型的属性包括日期、地点、年龄、宗教、国籍和性别等等。

星形模式

有两种物理实现维度模型的方法:使用星型或雪花型模式。星型模式在中间包含一个事实表,周围是维度表。事实表和维度表通过表的外键和主键连接起来。图 8-5 中的 ER 图是星型模式的一个例子。

下一代大数据教程(四)

图 8-5

Star Schema

雪花模式

雪花模式非常类似于星型模式,它有一个中央事实表,但维度表被进一步规范化为子维度表。数据仓库专家 Ralph Kimball 通常推荐使用星型模式。他建议在一些度量引用许多其他度量不共享的属性的情况下使用雪花模式。 v 图 8-6 所示的 ER 图就是雪花图式的一个例子。

下一代大数据教程(四)

图 8-6

Snowflake Schema

尺寸缓慢变化

有效使用 Hive 或 Impala 进行数据仓库存储的最大障碍之一是它无法执行一件简单的事情——更新表。无法更新纵栏文件格式,例如存储在 HDFS 的拼花地板。这可能会让有 RDBMS 背景的人感到震惊。用户需要覆盖整个表或分区,以便更改存储在镶木地板表中的值。当处理缓慢变化的维度时,这种限制成为一个令人头疼的问题。在 Kudu 之前,处理缓慢变化的维度的最佳方式是将维度表存储在 HBase 中,然后在表的顶部创建一个外部 Hive 表,以便从 Impala 访问它。Impala 不支持 SQL update 语句,但是因为 HBase 支持版本控制,所以可以通过使用相同的 rowkey 执行 insert 语句来模拟更新。 vi

使用 Impala 和 Kudu 的大数据仓库

多年来,Hive 被用来在 Hadoop 中实现基本的数据仓库。它慢得令人痛苦,也很笨拙,但它比 MapReduce 更容易使用,而且它能完成工作,所以用户能容忍它。

几年后,Impala 和其他开源 MPP 引擎出现了。与 Parquet 等列式文件格式一起使用,它为企业中的 Hadoop 铺平了道路,使 BI 和 OLAP 工具能够连接到 Hadoop 集群并获得快速性能。使用 Impala 和 Parquet 进行 ETL 和维度建模仍然很麻烦,但是好处超过了成本,所以用户忍受使用它。

Impala 和 Kudu 使得在 Cloudera Enterprise 上存储、处理和分析关系数据变得更加容易。虽然它还不具备商业数据仓库平台的所有高级功能,但它的功能已经足够接近关系数据库了。

让我们通过在 Kudu 中实现一个简单的维度星型模式模型来研究一个例子。我将把 AdventureWorksDW 数据库的子集从 SQL Server 复制到 Kudu,并使用 Impala 对其运行一些 SQL 查询。我们将复制三个维度表和一个事实表。我们还将复制列的子集。该模式应该如图 8-7 所示。

下一代大数据教程(四)

图 8-7

Example schema

如图 8-8 所示,我将从 FactInternetSales 表中转移以下各列:ProductKey、OrderDateKey、CustomerKey、OrderQuantity、UnitPrice、SalesAmount、TaxAmt、TotalProductCost、Freight、OrderDate、SalesOrderNumber 和 SalesOrderLineNumber。

下一代大数据教程(四)

图 8-8

Fact Internet Sales

我将从 DimCustomer 表中复制以下各列:CustomerKey、FirstName、LastName、BirthDate、YearlyIncome、TotalChildren、EnglishEducation、EnglishOccupation、HouseOwnerFlag 和 NumberofCarsOwned,如图 8-9 所示。

下一代大数据教程(四)

图 8-9

DimCustomer

我们将从 DimProduct 表中选择四列:ProductKey、EnglishProductName、EnglishDescription 和 Color,如图 8-10 所示。

下一代大数据教程(四)

图 8-10

DimProduct

我们将从 DimDate 表中选取几列:DateKey、FullDateAlternateKey、DayNumberOfWeek、EnlighsDayNameOfWeek、DayNumberOfMonth、DayNumberOfYear、WeekNumberOfYear、EnglishMonthName、MonthNumberOfYear、CalendarQuarter、CalendarYear、FiscalQuarter 和 FiscalYear,如图 8-11 所示。

下一代大数据教程(四)

图 8-11

DimDate

我需要将表从 SQL Server 复制到 Impala。为此,我为每个表手动生成一个 CSV 文件。你可以使用我们在第七章中提到的任何 ETL 工具。在这种情况下,我使用 SQL Server 的数据导出和导入工具来生成 CSV 文件。不要忘记排除列标题。然后,我将文件移动到 HDFS,并在每个文件的顶部创建一个外部表。清单 8-1 显示了步骤。

hadoop fs -mkdir /tmp/factinternetsales
hadoop fs -mkdir /tmp/dimcustomer
hadoop fs -mkdir /tmp/dimproduct
hadoop fs -mkdir /tmp/dimdate

hadoop fs -put FactInternetSales.csv /tmp/factinternetsales/
hadoop fs -put DimCustomer.csv /tmp/dimcustomer/
hadoop fs -put DimProduct.csv /tmp/dimproduct/
hadoop fs -put DimDate.csv /tmp/dimdate/

impala-shell

CREATE EXTERNAL TABLE FactInternetSales_CSV (
OrderDate STRING,
ProductKey BIGINT,
OrderDateKey BIGINT,
CustomerKey BIGINT,
OrderQuantity FLOAT,
UnitPrice FLOAT,
SalesAmount FLOAT,
TaxAmt FLOAT,
TotalProductCost FLOAT,
Freight FLOAT
)
ROW FORMAT
DELIMITED FIELDS TERMINATED BY ','
LINES TERMINATED BY '
' STORED AS TEXTFILE
LOCATION '/tmp/factinternetsales';

CREATE EXTERNAL TABLE DimCustomer_CSV (
CustomerKey BIGINT,
FirstName STRING,
LastName STRING,
BirthDate STRING,
YearlyIncome FLOAT,
TotalChildren INT,
EnglishEducation STRING,
EnglishOccupation STRING,
HouseOwnerFlag INT,
NumberCarsOwned INT
)
ROW FORMAT
DELIMITED FIELDS TERMINATED BY ','
LINES TERMINATED BY '
' STORED AS TEXTFILE
LOCATION '/tmp/dimcustomer';

CREATE EXTERNAL TABLE DimDate_CSV (
DateKey BIGINT,
FullDateAlternateKey STRING,
DayNumberOfWeek INT,
EnglishDayNameOfWeek STRING,
DayNumberOfMonth INT,
DayNumberOfYear INT,
WeekNumberOfYear INT,
EnglishMonthName STRING,
MonthNumberOfYear INT,
CalendarQuarter INT,
CalendarYear INT,
FiscalQuarter INT,
FiscalYear INT
)
ROW FORMAT
DELIMITED FIELDS TERMINATED BY ','
LINES TERMINATED BY '
' STORED AS TEXTFILE
LOCATION '/tmp/dimdate';

CREATE EXTERNAL TABLE DimProduct_CSV (
ProductKey BIGINT,
EnglishProductName STRING,
EnglishDescription STRING,
Color STRING
)
ROW FORMAT
DELIMITED FIELDS TERMINATED BY ','
LINES TERMINATED BY '
' STORED AS TEXTFILE
LOCATION '/tmp/dimproduct';

invalidate metadata;

select count(*) from FactInternetSales_csv;

60398

select count(*) from DimCustomer_csv;

18484

select count(*) from DimProduct_csv;

606

select count(*) from DimDate_csv;

3652

Listing 8-1Copy the tables from SQL Server to Impala

下一代大数据教程(四)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97

既然可以从 Impala 访问数据,我们就可以创建 Kudu 表,并用外部表中的数据填充它。步骤如清单 8-2 所示。

Note

如第二章所述,Kudu 不支持多行多表的 ACID 兼容事务。即使某些行由于违反主键或约束而被拒绝,ETL 作业也将继续成功运行。在 ETL 过程之后,必须执行额外的数据验证,以确保数据处于一致的状态。此外,考虑对您的表进行反规范化,以减少 Kudu 中数据不一致的可能性。VII

CREATE TABLE FactInternetSales
(
ID STRING NOT NULL,
OrderDate BIGINT NOT NULL,
ProductKey BIGINT,
OrderDateKey BIGINT,
CustomerKey BIGINT,
OrderQuantity FLOAT,
UnitPrice FLOAT,
SalesAmount FLOAT,
TaxAmt FLOAT,
TotalProductCost FLOAT,
Freight FLOAT,
SalesOrderNumber STRING,
SalesOrderLineNumber TINYINT,
PRIMARY KEY(ID, OrderDate)
)
PARTITION BY HASH (ID) PARTITIONS 16,
RANGE (OrderDate)
(

PARTITION unix_timestamp('2017-01-01') <= VALUES < unix_timestamp('2017-02-01'),
PARTITION unix_timestamp('2017-02-01') <= VALUES < unix_timestamp('2017-03-01'),
PARTITION unix_timestamp('2017-03-01') <= VALUES < unix_timestamp('2017-04-01'),
PARTITION unix_timestamp('2017-04-01') <= VALUES < unix_timestamp('2017-05-01'),
PARTITION unix_timestamp('2017-05-01') <= VALUES < unix_timestamp('2017-06-01'),
PARTITION unix_timestamp('2017-06-01') <= VALUES < unix_timestamp('2017-07-01'),
PARTITION unix_timestamp('2017-07-01') <= VALUES < unix_timestamp('2017-08-01'),
PARTITION unix_timestamp('2017-08-01') <= VALUES < unix_timestamp('2017-09-01'),
PARTITION unix_timestamp('2017-09-01') <= VALUES < unix_timestamp('2017-10-01'),
PARTITION unix_timestamp('2017-10-01') <= VALUES < unix_timestamp('2017-11-01'),
PARTITION unix_timestamp('2017-11-01') <= VALUES < unix_timestamp('2017-12-01'),
PARTITION unix_timestamp('2017-12-01') <= VALUES < unix_timestamp('2018-01-01')
)
STORED AS KUDU;

INSERT INTO FactInternetSales
SELECT
uuid(),
unix_timestamp('2017-01-20'),
ProductKey,
OrderDateKey,
CustomerKey,
OrderQuantity,
UnitPrice,
SalesAmount,
TaxAmt,
TotalProductCost,
Freight,
SalesOrderNumber,
SalesOrderLineNumber
FROM
FactInternetSales_CSV;

SELECT COUNT(*) FROM FactInternetSales_csv

+----------+
| count(*) |
+----------+
| 60398    |
+----------+

SELECT COUNT(*) FROM FactInternetSales;

+----------+
| count(*) |
+----------+
| 60398    |
+----------+

CREATE TABLE DimCustomer (
ID STRING,
CustomerKey BIGINT,
FirstName STRING,
LastName STRING,
BirthDate STRING,
YearlyIncome FLOAT,
TotalChildren INT,
EnglishEducation STRING,
EnglishOccupation STRING,
HouseOwnerFlag INT,
NumberCarsOwned INT,
PRIMARY KEY(ID)
)
PARTITION BY HASH (ID) PARTITIONS 16
STORED AS KUDU);

INSERT INTO DimCustomer
SELECT
uuid(),
CustomerKey,
FirstName,
LastName,
BirthDate,
YearlyIncome,
TotalChildren,
EnglishEducation,
EnglishOccupation,
HouseOwnerFlag,

NumberCarsOwned

FROM
DimCustomer_CSV;

SELECT COUNT(*) FROM DimCustomer;

+----------+
| count(*) |
+----------+
| 18484    |
+----------+

SELECT COUNT(*) FROM DimCustomer_CSV;

+----------+
| count(*) |
+----------+
| 18484    |
+----------+

CREATE TABLE DimDate (
ID STRING,
DateKey BIGINT,
FullDateAlternateKey STRING,
DayNumberOfWeek INT,
EnglishDayNameOfWeek STRING,
DayNumberOfMonth INT,
DayNumberOfYear INT,
WeekNumberOfYear INT,
EnglishMonthName STRING,
MonthNumberOfYear INT,
CalendarQuarter INT,
CalendarYear INT,
FiscalQuarter INT,
FiscalYear INT,
PRIMARY KEY(ID)

)
PARTITION BY HASH (ID) PARTITIONS 16
STORED AS KUDU;

INSERT INTO DimDate
SELECT
uuid(),
DateKey,
FullDateAlternateKey,
DayNumberOfWeek,
EnglishDayNameOfWeek,
DayNumberOfMonth,
DayNumberOfYear,
WeekNumberOfYear,
EnglishMonthName,
MonthNumberOfYear,
CalendarQuarter,
CalendarYear,
FiscalQuarter,
FiscalYear
FROM DimDate_CSV;

SELECT count(*) from DimDate;
+----------+
| count(*) |
+----------+
| 3652     |
+----------+

SELECT count(*) from Dimdate_CSV;
+----------+
| count(*) |
+----------+
| 3652     |
+----------+

CREATE TABLE DimProduct (

ID STRING,
ProductKey BIGINT,
EnglishProductName STRING,
EnglishDescription STRING,
Color STRING
)
PARTITION BY HASH (ID) PARTITIONS 16
STORED AS KUDU;

INSERT INTO DimProduct
SELECT
uuid(),
productkey,
englishproductname,
englishdescription,
color
FROM
DimProduct_CSV

select COUNT(*) from DimProduct

+----------+
| count(*) |
+----------+
| 606      |
+----------+

select COUNT(*) from DimProduct_CSV

+----------+
| count(*) |
+----------+
| 606      |

+----------+

Listing 8-2Build Kudu tables and populate it with data

下一代大数据教程(四)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214

这里有几件重要的事情要讨论。注意,我使用了 Impala 内置函数 uuid()为事实表和维度表生成一个惟一的 id。Impala 和 Kudu 不包含自动增量特性,这实际上被认为是分布式环境中的反模式。使用 Kudu、Spanner 和类似的分布式系统,对值单调递增的列进行范围分区会将所有插入一次写入一个平板,导致平板比其他平板大得多,并限制了插入的可伸缩性。这也被称为热点。当插入具有单调递增行键的行时,HBase 中也会出现热点。

虽然在单个 SMP 服务器上运行的数据库上使用 UUIDs 作为主键是一种灾难,但是在分布式 MPP 环境中,使用不是从表中包含的业务或数据派生的唯一键进行哈希分区会将工作负载分散到集群中的各个节点上。哈希分区可防止数据和工作负载不对称,并通过将插入并行发送到多个平板电脑来提高数据接收的可伸缩性。 viii

一些数据库系统,如 Microsoft SQL Server,具有本地 UUID 数据类型,为 uuid 提供了更有效的存储。Kudu 没有 UUID 数据类型,因此您必须使用字符串数据类型来存储 UUID。36 个字符的 UUID 确实会占用一些空间;然而,基准测试表明,在 Kudu 中使用 36 个字符的主键不会影响大多数查询的性能,尽管您的体验可能会有所不同。如果您关心 UUID 的使用,那么另一个选择是散列 UUID 来生成一个非连续的 BIGINT 值作为您的主键。您可以使用 Impala 的内置哈希函数 fnv_hash()(它不是加密安全的,这意味着在生成唯一 ID 时可能会发生冲突)或一个加密安全的哈希算法。只要确保您测试了 insert 语句的性能。每个 insert 语句都调用内置函数可能会导致性能瓶颈。当然,还有其他方法可以生成非顺序的唯一键。

如您所见,事实表是散列和范围分区的。通过结合这两种分区策略,我们获得了两者的优点,同时减少了各自的局限性。 ix 通过对日期列使用范围分区,您的查询可以在按日期范围扫描时利用分区修剪。此外,随着新数据添加到表中,可以添加新的分区(这将导致 16 个额外的平板电脑)。通过在 ID 列上使用散列分区(这是一种非顺序的 UUID),插入被均匀地分布在多个平板上,直到散列分区的数量(在我们的例子中是 16),从而提高了数据接收的吞吐量和性能。将此策略与当前的 AdventureWorksDW 架构进行比较,您会发现一些不同之处。首先,FactInternetSales 的主键在 SalesOrderNumber 和 SalesOrderLineNumber 上。这对于在一台服务器上运行的 SQL Server 数据库来说已经足够了。然而,这打破了我们刚刚讨论的关于分布式系统上的分区和选择主键值的几个规则。SalesOrderNumber 是单调递增的,SalesOrderLineNumber 的大部分值是 1。如果我们使用这两列作为主键,所有插入都将被定向到一个分区,从而导致数据和工作负载不对称,并降低数据接收速度。

维度表通常很小,并且大多是只读的。缓慢变化的维度通常不需要像事实表那样考虑性能,所以我们将使用唯一的 UUID 作为主键对维度表进行哈希分区。较大的维度表可能需要不同的分区策略。

虽然 Kudu 要求所有表都有主键,但它没有外键约束。因此,在 Kudu 数据仓库中,数据不一致是可能的。但是,出于性能和可管理性的原因,数据仓库通常会禁用外键约束。清单 8-3 显示了我们刚刚创建的 Kudu 表的结构。

describe FactInternetSales;

+----------------------+---------+---------+-------------+----------+
| name                 | type    | comment | primary_key | nullable |
+----------------------+---------+---------+-------------+----------+
| id                   | string  |         | true        | false    |
| orderdate            | bigint  |         | true        | false    |
| productkey           | bigint  |         | false       | true     |
| orderdatekey         | bigint  |         | false       | true     |
| customerkey          | bigint  |         | false       | true     |
| orderquantity        | float   |         | false       | true     |
| unitprice            | float   |         | false       | true     |
| salesamount          | float   |         | false       | true     |
| taxamt               | float   |         | false       | true     |
| totalproductcost     | float   |         | false       | true     |
| freight              | float   |         | false       | true     |
| salesordernumber     | string  |         | false       | true     |
| salesorderlinenumber | tinyint |         | false       | true     |
+----------------------+---------+---------+-------------+----------+

describe DimDate;

+----------------------+--------+---------+-------------+----------+
| name                 | type   | comment | primary_key | nullable |
+----------------------+--------+---------+-------------+----------+
| id                   | string |         | true        | false    |
| datekey              | bigint |         | false       | true     |

| fulldatealternatekey | string |         | false       | true     |
| daynumberofweek      | int    |         | false       | true     |
| englishdaynameofweek | string |         | false       | true     |
| daynumberofmonth     | int    |         | false       | true     |
| daynumberofyear      | int    |         | false       | true     |
| weeknumberofyear     | int    |         | false       | true     |
| englishmonthname     | string |         | false       | true     |
| monthnumberofyear    | int    |         | false       | true     |
| calendarquarter      | int    |         | false       | true     |
| calendaryear         | int    |         | false       | true     |
| fiscalquarter        | int    |         | false       | true     |
| fiscalyear           | int    |         | false       | true     |
+----------------------+--------+---------+-------------+----------+

describe DimCustomer;

+-------------------+--------+---------+-------------+----------+
| name              | type   | comment | primary_key | nullable |
+-------------------+--------+---------+-------------+----------+
| id                | string |         | true        | false    |
| customerkey       | bigint |         | false       | true     |
| firstname         | string |         | false       | true     |
| lastname          | string |         | false       | true     |
| birthdate         | string |         | false       | true     |
| yearlyincome      | float  |         | false       | true     |
| totalchildren     | int    |         | false       | true     |
| englisheducation  | string |         | false       | true     |
| englishoccupation | string |         | false       | true     |
| houseownerflag    | int    |         | false       | true     |
| numbercarsowned   | int    |         | false       | true     |
+-------------------+--------+---------+-------------+----------+

describe DimProduct;

+--------------------+--------+---------+-------------+----------+
| name               | type   | comment | primary_key | nullable |
+--------------------+--------+---------+-------------+----------+
| id                 | string |         | true        | false    |
| productkey         | bigint |         | false       | true     |
| englishproductname | string |         | false       | true     |
| englishdescription | string |         | false       | true     |
| color              | string |         | false       | true     |
+--------------------+--------+---------+-------------+----------+

Listing 8-3Structure of Kudu tables

下一代大数据教程(四)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74

Note

正如本章前面提到的,Kudu 不支持 decimal 数据类型。float 和 double 数据类型仅存储非常接近的值,而不是 IEEE 754 规范中定义的精确值。 x 正因为如此,behavior float 和 double 都不适合存储财务数据。在撰写本文时,对十进制数据类型的支持仍在开发中(Apache Kudu 1.5 / CDH 5.13)。更多详情请参考 KUDU-721。一种解决方法是将财务数据存储为字符串,然后在每次需要读取数据时使用 Impala 将值转换为十进制。因为 Parquet 支持小数,所以另一个解决方法是对事实表使用 Parquet,对维度表使用 Kudu。

我们现在可以对 Kudu 的数据仓库运行 Impala 查询。

例如,这里有一个查询,获取收入超过 100,000 美元且拥有住房的所有人的前 20 名列表。

SELECT
DC.FirstName,
DC.LastName,
DC.BirthDate,
DC.HouseOwnerFlag,
DC.YearlyIncome
FROM FactInternetSales FIS
INNER JOIN DimCustomer DC ON FIS.customerkey = DC.customerkey
WHERE
DC.YearlyIncome >= 100000
AND
DC.HouseOwnerFlag = 1
ORDER BY
DC.YearlyIncome DESC
LIMIT 20;

+-----------+------------+------------+----------------+--------------+
| firstname | lastname   | birthdate  | houseownerflag | yearlyincome |
+-----------+------------+------------+----------------+--------------+
| Shannon   | Navarro    | 1971-05-03 | 1              | 170000       |
| Devin     | Anderson   | 1959-08-22 | 1              | 170000       |
| Luis      | Washington | 1946-05-07 | 1              | 170000       |
| Ian       | Watson     | 1950-12-08 | 1              | 170000       |
| Jenny     | Chander    | 1955-02-04 | 1              | 170000       |
| Nathan    | Wright     | 1965-12-20 | 1              | 170000       |
| Trisha    | Wu         | 1959-01-03 | 1              | 170000       |
| Dale      | Holt       | 1952-02-01 | 1              | 170000       |
| Craig     | Gutierrez  | 1952-04-11 | 1              | 170000       |
| Devin     | Martin     | 1960-02-01 | 1              | 170000       |
| Katrina   | Luo        | 1950-04-22 | 1              | 170000       |
| Alvin     | Nara       | 1972-11-16 | 1              | 170000       |
| Megan     | Morgan     | 1966-02-13 | 1              | 170000       |
| Armando   | Munoz      | 1961-10-31 | 1              | 170000       |
| Arturo    | Zheng      | 1975-04-06 | 1              | 170000       |
| Vincent   | Sun        | 1959-11-03 | 1              | 170000       |
| Colleen   | Anand      | 1963-09-23 | 1              | 170000       |
| Caleb     | Jenkins    | 1970-04-22 | 1              | 170000       |
| Devin     | Johnson    | 1965-12-16 | 1              | 170000       |
| Shannon   | Liu        | 1966-03-08 | 1              | 170000       |
+-----------+------------+------------+----------------+--------------+

下一代大数据教程(四)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

列出所有买了“Sport-100 头盔”并且拥有两辆以上汽车的人。

SELECT
DC.FirstName,

DC.LastName,
DC.BirthDate,
DC.NumberCarsOwned,
DP.EnglishProductName
FROM FactInternetSales FIS
INNER JOIN DimCustomer DC ON FIS.customerkey = DC.customerkey
INNER JOIN DimProduct DP ON FIS.productkey = DP.productkey
WHERE
DP.EnglishProductName = 'Sport-100 Helmet'
AND
DC.NumberCarsOwned > 2
LIMIT 20;

+-----------+-----------+------------+-----------------+------------------+
| firstname | lastname  | birthdate  | numbercarsowned | englishproductname |
+-----------+-----------+------------+-----------------+------------------+
| Colleen   | Goel      | 1954-04-06 | 4               | Sport-100 Helmet |
| Timothy   | Stewart   | 1948-12-22 | 4               | Sport-100 Helmet |
| Janelle   | Arthur    | 1971-01-14 | 3               | Sport-100 Helmet |
| Colin     | Lal       | 1976-11-30 | 4               | Sport-100 Helmet |
| Melody    | Ruiz      | 1979-08-01 | 4               | Sport-100 Helmet |
| Nicolas   | Andersen  | 1972-11-10 | 3               | Sport-100 Helmet |
| Hunter    | Lopez     | 1958-02-06 | 3               | Sport-100 Helmet |
| Jake      | Zhu       | 1978-06-24 | 3               | Sport-100 Helmet |
| Caleb     | Yang      | 1985-08-13 | 3               | Sport-100 Helmet |
| Jeffery   | Ma        | 1969-12-03 | 3               | Sport-100 Helmet |
| Miranda   | Patterson | 1952-01-07 | 4               | Sport-100 Helmet |
| Isaac     | Ward      | 1957-11-09 | 3               | Sport-100 Helmet |
| Roy       | Chandra   | 1953-02-09 | 4               | Sport-100 Helmet |
| William   | Harris    | 1979-09-30 | 3               | Sport-100 Helmet |
| Xavier    | Williams  | 1974-01-18 | 3               | Sport-100 Helmet |
| Mason     | Mitchell  | 1952-11-03 | 4               | Sport-100 Helmet |
| Claudia   | Zhou      | 1961-12-04 | 3               | Sport-100 Helmet |
| Tamara    | Lal       | 1961-06-17 | 3               | Sport-100 Helmet |
| Misty     | Tang      | 1947-08-30 | 3               | Sport-100 Helmet |
| Alisha    | Zeng      | 1977-10-31 | 3               | Sport-100 Helmet |

+-----------+-----------+------------+-----------------+------------------+

下一代大数据教程(四)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

摘要

恭喜你!您刚刚使用了 Impala 和 Kudu 进行数据仓库存储!您可以通过 JDBC/ODBC 将您最喜欢的商业智能、数据可视化和 OLAP 工具连接到 Impala,根据我们刚刚创建的表创建仪表板、报告和 OLAP 立方体。我建议您参考第九章,了解更多关于数据可视化工具的信息。您可以使用 Spark 来处理海量数据并将其接收到 Kudu 中。这将在第六章中详细讨论。还可以使用 StreamSets 和 Talend 等商业第三方 ETL 应用程序将数据加载到 Kudu 中。这在第七章中有所涉及。看起来您已经拥有了构建数据仓库所需的一切!

本章讨论了利用 Impala 和 Kudu 的几种方法。您可以更新您的数据仓库,或者完全取代它。只要确保您已经仔细评估了它的优势和劣势,以及它是否是您组织的正确解决方案。

参考

  1. Hortonworks《用 Apache Hive 进行数据仓储》,Hortonworks,2018, https://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.6.2/bk_data-access/content/ch_using-hive.html
  2. 金博尔集团;《数据仓库工具包,第 3 版》,金博尔集团,2018, http://www.kimballgroup.com/data-warehouse-business-intelligence-resources/books/data-warehouse-dw-toolkit/
  3. 戴尔;“戴尔调查:尽管信息管理格局快速变化,结构化数据仍是焦点”,戴尔,2018, http://www.dell.com/learn/us/en/uscorp1/press-releases/2015-04-15-dell-survey
  4. 微软;《用于 SQL Server 2016 CTP3 的 AdventureWorks 数据库和脚本》,微软,2018, https://www.microsoft.com/en-us/download/details.aspx?id=49502
  5. 甲骨文;《星形与雪花图式》,甲骨文,2018, http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/10g/r2/owb/owb10gr2_gs/owb/lesson3/starandsnowflake.htm
  6. Cloudera《使用 Impala 查询 HBase 表》,Cloudera,2018, https://www.cloudera.com/documentation/enterprise/latest/topics/impala_hbase.html
  7. Cloudera《使用 Impala 查询 Kudu 表》,Cloudera,2018, https://www.cloudera.com/documentation/enterprise/5-12-x/topics/impala_kudu.html
  8. 阿帕奇库杜;《Kudu:常见问题》阿帕奇 Kudu,2018, https://kudu.apache.org/faq.html
  9. 阿帕奇库杜;《哈希和范围划分示例》,Apache Kudu,2018, https://kudu.apache.org/docs/schema_design.html#hash-range-partitioning-example
  10. 微软;“使用十进制、浮点和实数数据”,微软,2018, https://technet.microsoft.com/en-us/library/ms187912(v=sql.105).aspx

九、大数据可视化和数据整理

很容易理解为什么自助式数据分析和可视化在过去几年变得流行。它使用户能够执行自己的分析,并允许他们根据自己的需求交互式地探索和操作数据,而无需依赖传统的商业智能开发人员来开发报告和仪表板,这一任务可能需要几天、几周或更长时间,从而提高了用户的工作效率。用户可以执行即席分析并运行后续查询来回答他们自己的问题。他们也不受静态报告和仪表板的限制。根据分析的类型,自助数据分析的输出可以采用多种形式。输出可以采用交互式图表和仪表板、数据透视表、OLAP 立方体、来自机器学习模型的预测或由 SQL 查询返回的查询结果的形式。

大数据可视化

已经出版了几本关于流行的数据可视化工具的书,比如 Tableau、Qlik 和 Power BI。这些工具都与 Impala 很好地集成在一起,其中一些对大数据有基本的支持。对于典型的数据可视化任务来说,它们已经足够了,而且在大多数情况下,这也是所有典型用户所需要的。然而,当组织的分析需求超出传统工具所能处理的范围时,就该考虑专门为大数据设计的工具了。请注意,当我谈到大数据时,我指的是大数据的三个 V。我指的不仅仅是数据的大小(体积),还有数据的多样性(这些工具能否分析结构化、非结构化、半结构化数据)和速度(这些工具能否进行实时或接近实时的数据可视化?).我在本章中探讨了专门为大数据设计的数据可视化工具。

SAS 可视化分析

40 多年来,SAS 一直是高级分析领域的领导者之一。SAS 软件套件有数百个组件,设计用于各种用例,从数据挖掘和计量经济学到六西格玛和临床试验分析。对于这一章,我们感兴趣的是被称为 SAS 可视化分析的自助式分析工具。

SAS Visual Analytics 是来自 SAS 的基于 web 的自助式交互式数据分析应用程序。SAS 可视化分析允许用户探索他们的数据,写报告,处理和加载数据到 SAS 环境中。它具有内存功能,专为大数据而设计。SAS 可视化分析可以在分布式和非分布式模式下部署。在分布式模式下,高性能 SAS LASR 分析服务器守护程序安装在 Hadoop 工作节点上。它可以利用您的 Hadoop 集群的全部处理能力,使其能够处理存储在 HDFS 的大量数据。

SAS 可视化分析分布式部署支持 Cloudera Enterprise、Hortonworks HDP 和 Teradata 数据仓库设备。非分布式 SAS VA 部署在一台本地安装了 SAS LASR 分析服务器的机器上运行,并通过 JDBC 连接到 Cloudera Impala。

Zoomdata

Zoomdata 是一家位于弗吉尼亚州莱斯顿的数据可视化和分析公司。 ii 它旨在利用 Apache Spark,使其成为分析超大数据集的理想选择。Spark 的内存和流特性使 Zoomdata 能够支持实时数据可视化功能。Zoomdata 支持各种数据源,例如 Oracle、SQL Server、Hive、Solr、Elasticsearch 和 PostgreSQL 等等。Zoomdata 最令人兴奋的特性之一是它对 Kudu 和 Impala 的支持,这使它非常适合大数据和实时数据可视化。让我们仔细看看 Zoomdata。

面向大数据的自助式 BI 和分析

Zoomdata 是一款专为大数据设计的现代 BI 和数据分析工具。Zoomdata 支持广泛的数据可视化和分析功能,从探索性自助数据分析、嵌入式可视化分析到仪表板。在过去几年中,探索性自助数据分析变得越来越流行。它允许用户交互式地导航和探索数据,目的是从数据中发现隐藏的模式和见解。相比之下,传统的商业智能工具严重依赖于使用静态仪表板显示预定义的指标和 KPI。

Zoomdata 也支持仪表板。仪表板仍然是向只想看到结果的用户传达信息的有效方式。另一个不错的特性是能够将 Zoomdata 中创建的图表和仪表板嵌入到其他 web 应用程序中。利用标准的 HTML5、CSS、WebSockets 和 JavaScript,嵌入式分析可以在最流行的 web 浏览器和移动设备上运行,如 iPhones、iPads 和 Android 平板电脑。如果您需要额外的灵活性,并且需要控制应用程序的外观和行为,Zoomdata 提供了 JavaScript SDK。REST API 有助于 Zoomdata 环境的自动化管理和操作。

实时数据可视化

也许 Zoomdata 最受欢迎的特性是它对实时数据可视化的支持。图表和 KPI 从实时流源(如 MQTT 和 Kafka)或基于 SQL 的数据源(如 Oracle、SQL Server 或 Impala)实时更新。

体系结构

Zoomdata 的核心是一个流处理引擎,它将所有传入的数据作为数据流进行划分和处理。数据源不一定是实时的,只要数据具有时间属性,Zoomdata 就可以对其进行流式处理。Zoomdata 有一种称为数据 DVR 的技术,它不仅可以让用户流式传输数据,还可以像 DVR 一样倒带、重放和暂停实时流式数据。Zoomdata 将大部分数据处理下推到数据所在的数据源,通过最小化数据移动来利用数据局部性。 iii Zoomdata 在幕后使用 Apache Spark 作为补充的数据处理层。它将流数据缓存为 Spark 数据帧,并将其存储在结果集缓存中。Zoomdata 总是先检查并尝试从结果集缓存中检索数据,然后再转到原始源。 iv 图 9-1 展示了 Zoomdata 的高层架构。Apache Spark 支持 Zoomdata 的大部分功能,如 Zoomdata 融合和结果集缓存。

下一代大数据教程(四)

图 9-1

High-level architecture of Zoomdata

与 Apache Spark 的深度集成

Zoomdata 最令人印象深刻的特性之一是它与 Apache Spark 的深度集成。如前所述,Zoomdata 使用 Spark 来实现其流特性。Zoomdata 还使用 Spark 进行查询优化,方法是将数据缓存为 Spark 数据帧,然后使用 Spark 对缓存的数据执行计算、聚合和过滤。Spark 还支持另一个名为 SparkIt 的 Zoomdata 特性。SparkIt 提高了慢速数据源的性能,如 S3 桶和文本文件。SparkIt 将这些数据集缓存到 Spark 中,Spark 将它们转换成可查询的高性能 Spark 数据帧。 v 最后,Zoomdata 使用 Spark 实现了 Zoomdata Fusion,这是一个高性能的数据虚拟化层,将多个数据源虚拟化为一个。

缩放数据融合

Zoomdata 使用一个名为 Zoomdata Fusion 的高性能数据虚拟化层。Zoomdata 也是由 Apache Spark 提供支持的,它使多个数据源显示为一个数据源,而无需将数据集一起移动到一个公共位置。 vi Zoomdata 在优化跨平台连接时使用 Spark 来缓存数据,但将处理推给数据源以获得最大的可伸缩性。通过 Zoomdata Fusion,用户将能够方便地查询和连接不同格式的不同数据集,显著缩短洞察时间,提高生产率,并减少对 ETL 的依赖(见图 9-2 )。

下一代大数据教程(四)

图 9-2

Diagram of Zoomdata Fusion

数据锐化

Zoomdata 获得了“数据锐化”专利,这是一种用于可视化大型数据集的优化技术。数据锐化的工作原理是将一个大型查询分成一系列微型查询。然后,这些微查询被发送到数据源并并行执行。Zoomdata 会立即返回第一个微查询的结果,并将其可视化为对最终结果的估计。随着新数据的到来,Zoomdata 会更新可视化效果,逐渐显示更好、更准确的估计,直到查询完成并最终显示完整的可视化效果。当所有这些都发生时,用户仍然可以与图表交互并启动其他仪表板,而无需等待长时间运行的查询完成。在底层,Zoomdata 的流架构使所有这些成为可能,将查询分解为微查询并将结果流回给用户。 vii

支持多种数据源

尽管 Zoomdata 是为大数据而设计的,但它也支持市场上最流行的 MPP 和 SQL 数据库,包括 Oracle、SQL Server、Teradata、MySQL、PostgreSQL、Vertica 和 Amazon Aurora。 viii 在几乎所有的企业环境中,您都会发现各种风格的 SQL 数据库和 Hadoop 发行版的组合。通过 Zoomdata Fusion,Zoomdata 允许用户轻松地查询这些不同的数据源,就像它是单个数据源一样。其他支持快速可视化分析的 Zoomdata 特性,如数据锐化、数据 DVR 和微查询,也都适用于这些 SQL 和 MPP 数据库。还支持其他流行的数据源,如 MongoDB、Solr、Elasticsearch 和亚马逊 S3(见图 9-3 )。

下一代大数据教程(四)

图 9-3

Partial list of Zoomdata’s supported data sources Note

有关如何安装 Zoomdata 的最新说明,请参考 Zoomdata 的网站。您还需要安装 Zoomdata 的 Kudu 连接器来连接 Kudu,这也可以在 Zoomdata 的网站上找到。

让我们从一个例子开始。启动 Zoomdata。您将看到一个类似图 9-4 的登录页面。

下一代大数据教程(四)

图 9-4

Zoomdata login page

你需要做的第一件事是创建一个新的数据源(见图 9-5 )。

下一代大数据教程(四)

图 9-5

Zoomdata homepage

注意,Kudu Impala 数据源被添加到数据源列表中(参见图 9-6 )。

下一代大数据教程(四)

图 9-6

Available data sources

您需要输入您的凭证,包括 JDBC URL 和 Kudu Master 的位置(图 9-7 )。在我们的示例中,Kudu 主机位于 192.168.56.101:7051。将 JDBC 网址更新为 JDBC:hive 2://192 . 168 . 56 . 101:21050/;auth=noSasl。注意,即使我们连接到 Impala,我们也需要在我们的 JDBC URL 中指定“hive2”。完成后点击“下一步”(图 9-8 )。

下一代大数据教程(四)

图 9-8

Kudu Impala Connector Input Credentials

下一代大数据教程(四)

图 9-7

Kudu Impala Connector page

选择我们将在本例中使用的表格(图 9-9 )。您也可以选择字段(图 9-10 )。除非内存不足,否则打开缓存总是一个好主意。因为我们的表来自关系数据存储,所以不需要启用 SparkIt。如果您还记得的话,SparkIt 只适用于简单的数据源,比如不提供缓存功能的文本文件。单击“下一步”继续下一步。

下一代大数据教程(四)

图 9-10

Data Source Fields

下一代大数据教程(四)

图 9-9

Data Source Tables

Zoomdata 可以异步维护某些数据源的缓存结果集(图 9-11 )。

下一代大数据教程(四)

图 9-11

Data Source Refresh

您还可以安排一个任务来刷新缓存和元数据(图 9-12 )。

下一代大数据教程(四)

图 9-12

Data Source Scheduler

对于更熟悉 cron Unix 风格调度程序的高级用户,也可以使用类似的界面(图 9-13 )。

下一代大数据教程(四)

图 9-13

Data Source Cron Scheduler

为了支持实时可视化,必须启用实时模式和回放(图 9-14 )。只要数据集有时间属性,在我们的例子中就是 sensortimestamp,Zoomdata 就可以使用时间属性进行可视化。我将刷新率和延迟设置为 1 秒。我还设置了从现在-1 分钟到现在的范围。

下一代大数据教程(四)

图 9-14

Time Bar Global Default Settings

您可以配置可用的图表(图 9-15 )。

下一代大数据教程(四)

图 9-15

Global Default Settings – Charts

根据图表的类型,有不同的配置选项可用(图 9-16 )。

下一代大数据教程(四)

图 9-16

Map: World Countries – Options

单击“完成”后,数据源将被保存您可以立即根据源创建图表(图 9-17 )。在这种情况下,我们将选择“条形图:多个指标”

下一代大数据教程(四)

图 9-17

Add New Chart

将显示一个类似于图 9-18 的条形图。您可以调整不同的条形图选项。

下一代大数据教程(四)

图 9-18

Bar Chart

当图表最大化时,您会得到更多的配置选项,如过滤器、颜色和图表样式等。在图 9-19 所示的例子中,我已经将条形图的颜色从黄色和蓝色改为紫色和绿色。

下一代大数据教程(四)

图 9-19

Bar Chart – Color

要添加更多图表,点击位于应用程序右上角附近的“添加图表”(图 9-20 )。

下一代大数据教程(四)

图 9-20

Add New Chart

饼图是最常见的图表类型之一(图 9-21 )。

下一代大数据教程(四)

图 9-21

Pie Chart

Zoomdata 有多种图表类型,如图 9-22 所示。

下一代大数据教程(四)

图 9-22

Multiple Chart Types

Zoomdata 具有映射功能,如图 9-23 所示。

下一代大数据教程(四)

图 9-23

Zoomdata Map

Zoomdata 可以用标记实时更新地图,如图 9-24 所示。

下一代大数据教程(四)

图 9-24

Zoomdata Map with Markers

具有 StreamSets、Kudu 和 Zoomdata 的实时物联网

最令人兴奋的大数据用例之一是 IoT(物联网)。物联网支持从嵌入硬件的传感器收集数据,例如智能手机、电子设备、电器、制造设备和医疗保健设备等。使用案例包括实时预测医疗保健、管网泄漏检测、水质监控、紧急警报系统、智能家居、智能城市和联网汽车等。物联网数据可以通过规则引擎进行实时决策,或通过机器学习模型进行更高级的实时预测分析。

对于我们的物联网示例,我们将为一家虚构的水务公司检测网络管道泄漏并监控水质。我们将使用一个 shell 脚本来生成随机数据,以模拟来自安装在水管上的传感器的物联网数据。我们将使用 Kudu 进行数据存储,使用 StreamSets 进行实时数据接收和流处理,使用 Zoomdata 进行实时数据可视化。

在真实的物联网项目中,数据源最有可能是通过轻量级消息协议(如 MQTT)提供数据的物联网网关。还强烈建议 Kafka 作为物联网网关和数据存储之间的缓冲区,以提供高可用性和可再生性,以防需要旧数据(图 9-25 )。

下一代大数据教程(四)

图 9-25

A Typical IoT Architecture using StreamSets, Kafka, Kudu, and Zoomdata

创建 Kudu 表

Zoomdata 要求 Kudu 表在时间戳字段上进行分区。要启用实时模式,时间戳字段必须存储为纪元时间中的 BIGINT。Zoomdata 会将时间戳字段识别为“可播放”,并在数据源上启用实时模式(清单 9-1 )。

CREATE TABLE my_sensors (
rowid BIGINT NOT NULL,
sensortimestamp BIGINT NOT NULL,
deviceid INTEGER,
temperature INTEGER,
pressure INTEGER,
humidity INTEGER,
ozone INTEGER,
sensortimestamp_str STRING,
city STRING,
temperature_warning INTEGER,
temperature_critical INTEGER,
pressure_warning INTEGER,
pressure_critical INTEGER,
humidity_warning INTEGER,
humidity_critical INTEGER,
ozone_warning INTEGER,
ozone_critical INTEGER,
lead_level INTEGER,
copper_level INTEGER,
phosphates_level INTEGER,
methane_level INTEGER,
chlorine_level INTEGER,
lead_warning INTEGER,
lead_critical INTEGER,
copper_warning INTEGER,
copper_critical INTEGER,
phosphates_warning INTEGER,

phosphates_critical INTEGER,
methane_warning INTEGER,
methane_critical INTEGER,
chlorine_warning INTEGER,
chlorine_critical INTEGER,
PRIMARY KEY(rowid,sensortimestamp)
)
PARTITION BY HASH (rowid) PARTITIONS 16,
RANGE (sensortimestamp)
(
PARTITION unix_timestamp('2017-01-01') <= VALUES <
unix_timestamp('2018-01-01'),

PARTITION unix_timestamp('2018-01-01') <= VALUES <
unix_timestamp('2019-01-01'),

PARTITION unix_timestamp('2019-01-01') <= VALUES <
unix_timestamp('2020-01-01')
)
STORED AS KUDU;

Listing 9-1Table for the sensor data. Must be run in impala-shell

下一代大数据教程(四)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
测试数据源

我们将执行 shell 脚本来生成随机数据:generatetest.sh。我引入了每 50 条记录 1 秒的延迟,这样我就不会淹没我的测试服务器(清单 9-2 )。

#!/bin/bash

x=0
while true
do
   echo $RANDOM$RANDOM,$(( $RANDOM % 10 + 20 )),
   $(( ( RANDOM % 40 )  + 1 )),$(( ( RANDOM % 80 )  + 1 )),
   $(( ( RANDOM % 30 )  + 1 )),$(( ( RANDOM % 20 )  + 1 )),
   `date "+%Y-%m-%d %T"`,"Melton", 0,0,0,0,0,0,0,0,
   $(( $RANDOM % 10 + 1 )), $(( $RANDOM % 10 + 1 )),
   $(( $RANDOM % 10 + 1 )),$(( $RANDOM % 10 + 1 )),
   $(( $RANDOM % 10 + 1 )),0,0,0,0,0,0,0,0,0,0

        if [ "$x" = 50 ];
        then
                sleep 1
                x=0
        fi

((x++))
Done

Listing 9-2generatetest.sh shell script to generate test data

下一代大数据教程(四)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

该脚本将生成随机传感器数据。清单 9-3 显示了数据的样子。

891013984,23,8,4,24,11,2017-07-09 17:31:33,Melton,
0,0,0,0,0,0,0,0,2,8,3,1,4,0,0,0,0,0,0,0,0,0,0
1191723491,29,20,68,14,10,2017-07-09 17:31:33,Melton,
0,0,0,0,0,0,0,0,7,1,6,4,3,0,0,0,0,0,0,0,0,0,0
919749,24,25,67,12,10,2017-07-09 17:31:33,Melton,
0,0,0,0,0,0,0,0,4,6,10,9,4,0,0,0,0,0,0,0,0,0,0
2615810801,22,21,59,24,11,2017-07-09 17:31:33,Melton,
0,0,0,0,0,0,0,0,5,7,10,7,2,0,0,0,0,0,0,0,0,0,0
2409532223,25,6,45,21,3,2017-07-09 17:31:33,Melton,
0,0,0,0,0,0,0,0,4,1,9,4,4,0,0,0,0,0,0,0,0,0,0
2229524773,29,20,68,12,3,2017-07-09 17:31:33,Melton,
0,0,0,0,0,0,0,0,6,7,2,4,9,0,0,0,0,0,0,0,0,0,0
295358267,22,15,16,7,1,2017-07-09 17:31:33,Melton,
0,0,0,0,0,0,0,0,1,4,6,10,8,0,0,0,0,0,0,0,0,0,0
836218647,28,25,59,3,19,2017-07-09 17:31:33,Melton,
0,0,0,0,0,0,0,0,7,2,6,3,4,0,0,0,0,0,0,0,0,0,0
2379015092,24,23,23,10,14,2017-07-09 17:31:33,Melton,

0,0,0,0,0,0,0,0,2,1,10,8,7,0,0,0,0,0,0,0,0,0,0
189463852,20,2,10,30,16,2017-07-09 17:31:33,Melton,
0,0,0,0,0,0,0,0,8,4,7,8,7,0,0,0,0,0,0,0,0,0,0
1250719778,26,15,68,30,4,2017-07-09 17:31:33,Melton,
0,0,0,0,0,0,0,0,7,6,9,8,10,0,0,0,0,0,0,0,0,0,0
1380822028,27,32,40,11,7,2017-07-09 17:31:33,Melton,
0,0,0,0,0,0,0,0,2,6,7,6,5,0,0,0,0,0,0,0,0,0,0
2698312711,21,14,5,29,19,2017-07-09 17:31:33,Melton,
0,0,0,0,0,0,0,0,2,2,8,1,3,0,0,0,0,0,0,0,0,0,0
1300319275,23,33,52,24,4,2017-07-09 17:31:33,Melton,
0,0,0,0,0,0,0,0,2,7,1,1,3,0,0,0,0,0,0,0,0,0,0
2491313552,27,25,69,24,10,2017-07-09 17:31:33,Melton,
0,0,0,0,0,0,0,0,8,2,4,3,8,0,0,0,0,0,0,0,0,0,0
149243062,21,24,2,15,8,2017-07-09 17:31:33,Melton,
0,0,0,0,0,0,0,0,7,3,3,5,7,0,0,0,0,0,0,0,0,0,0
Listing 9-3Sample test sensor data

下一代大数据教程(四)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
设计管道

我们现在可以设计 StreamSets 管道了。有关流集的更深入讨论,请参考第九章。我们需要做的第一件事是定义一个原点,或者数据源。StreamSets 支持不同类型的源,例如 MQTT、JDBC、S3、卡夫卡和 Flume 等等。对于这个例子,我们将使用“文件尾”原点。将数据源设置为 sensordata.csv。稍后我们将运行一个脚本来填充该文件(图 9-26 )。

下一代大数据教程(四)

图 9-26

StreamSets file tail origin

文件尾数据源需要其元数据的第二个目标。让我们添加一个本地文件系统目的地来存储元数据(图 9-27 )。

下一代大数据教程(四)

图 9-27

StreamSets local file system

我们需要一个字段拆分器处理器将 CSV 数据拆分成单独的列(图 9-28 )。我们将在新的拆分字段配置框中指定我们的 SDC 字段(清单 9-4 )。

下一代大数据教程(四)

图 9-28

StreamSets field splitter

[
 "/rowid",
 "/deviceid",
 "/temperature",
 "/pressure",
 "/humidity",
 "/ozone",
 "/sensortimestamp_str",
 "/city",
 "/temperature_warning",
 "/temperature_critical",
 "/pressure_warning",
 "/pressure_critical",
 "/humidity_warning",
 "/humidity_critical",
 "/ozone_warning",
 "/ozone_critical",
 "/lead_level",
 "/copper_level",
 "/phosphates_level",
 "/methane_level",
 "/chlorine_level",
 "/lead_warning",
 "/lead_critical",
 "/copper_warning",
 "/copper_critical",
 "/phosphates_warning",
 "/phosphates_critical",
 "/methane_warning",
 "/methane_critical",
 "/chlorine_warning",
 "/chlorine_critical"
]
Listing 9-4New SDC Fields

下一代大数据教程(四)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

我们还需要一个字段类型转换器来转换字段拆分器处理器生成的字段的数据类型(图 9-29 )。

下一代大数据教程(四)

图 9-29

StreamSets field converter

在配置字段类型转换器处理器时,我们必须指定需要转换的字段以及要将数据转换成的数据类型。默认情况下,SDC 将所有字段设置为字符串。您需要将字段转换成正确的数据类型(图 9-30 )。

下一代大数据教程(四)

图 9-30

StreamSets field converter

Kudu 希望时间戳采用 Unix 时间格式。我们将使用 JavaScript 评估器(图 9-31 )并编写代码将时间戳从字符串转换为 Unix 时间格式,如 BIGINT ix (清单 9-5 )。请注意,Kudu 的最新版本已经解决了这个限制。但是,Zoomdata 仍然希望日期采用 Unix 时间格式。查阅第七章,了解更多关于流集赋值器的信息。

下一代大数据教程(四)

图 9-31

StreamSets Javascript Evaluator

Date.prototype.getUnixTime = function() { return this.getTime()/1000|0 };
if(!Date.now) Date.now = function() { return new Date(); }
Date.time = function() { return Date.now().getUnixTime(); }

for(var i = 0; i < records.length; i++) {
  try {

    var someDate = new Date(records[i].value['sensortimestamp_str']);
    var theUnixTime = someDate.getUnixTime();

    records[i].value['sensortimestamp'] = theUnixTime;

    output.write(records[i]);

  } catch (e) {
    error.write(records[i], e);
  }

Listing 9-5Javascript Evaluator code

下一代大数据教程(四)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

最后,我们使用 Kudu 目的地作为数据的最终目的地。确保将 SDC 字段映射到正确的 Kudu 列名(图 9-32 )。

下一代大数据教程(四)

图 9-32

StreamSets Kudu destination

就在 StreamSets 那头。

配置 Zoomdata

让我们为 Zoomdata 配置一个数据源。我们将使用 Kudu Impala 连接器(图 9-33 )。

下一代大数据教程(四)

图 9-33

Zoomdata data source

输入连接信息,如 Kudu 主机的 IP 地址和端口号、JDBC URL 等。确保验证您的连接(图 9-34 )。

下一代大数据教程(四)

图 9-34

Zoomdata data connection input credentials

选择您刚才创建的表。如果您愿意,您可以排除字段(图 9-35 和图 9-36 )。

下一代大数据教程(四)

图 9-36

Zoomdata data connection fields

下一代大数据教程(四)

图 9-35

Zoomdata data connection tables

如果愿意,您可以安排数据缓存。如果您有一个大型数据集,缓存可以帮助提高性能和可伸缩性(图 9-37 )。

下一代大数据教程(四)

图 9-37

Zoomdata data connection refresh

配置时间栏。确保启用实时模式和回放(图 9-38 )。

下一代大数据教程(四)

图 9-38

Zoomdata time bar

您还可以设置图表的默认配置选项(图 9-39 )。

下一代大数据教程(四)

图 9-39

Zoomdata time bar

保存数据源。你现在可以开始设计用户界面了(图 9-40 )。

下一代大数据教程(四)

图 9-40

Zoomdata add new chart

我选择棒线:多重指标作为我的第一个图表。您还看不到任何数据,因为我们还没有启动 StreamSets 管道(图 9-41 )。

下一代大数据教程(四)

图 9-41

An empty chart

让我们开始生成一些数据。在安装 StreamSets 的服务器上,打开一个终端窗口并运行脚本。将输出重定向到文件尾目标:。/generate test . CSV > > sensor data . CSV

启动 StreamSets 管道。接下来,您将通过关于您的管道的不同统计数据(如记录吞吐量、批处理吞吐量、每个步骤的输入和输出记录计数)看到流集中的数据。它还会显示您的管道中是否有任何错误(图 9-42 )。

下一代大数据教程(四)

图 9-42

StreamSets canvas

当您设计 Zoomdata 仪表板时,图表会立即填充(图 9-43 )。

下一代大数据教程(四)

图 9-43

Live Zoomdata dashboard

恭喜你!您刚刚使用 StreamSets、Kudu 和 ZoomData 实现了一个实时物联网管道。

数据整理

在大多数情况下,数据不会以适合数据分析的格式出现。可能需要一些数据转换来转换字段的数据类型;可能需要数据清理来处理缺失或不正确的值;或者数据需要与 CRM、天气数据或 web 日志等其他数据源相结合。一项调查表明,数据科学家所做的 80%是数据准备和清理,剩下的 20%用于实际的数据分析。 x 在传统的数据仓库和商业智能环境中,数据通过提取、转换和加载(ETL)过程适合于分析。在非高峰时段,数据被清理、转换并从在线事务处理(OLTP)源复制到企业数据仓库。各种报告、关键绩效指标(KPI)和数据可视化都用新数据进行了更新,并呈现在企业仪表盘中,随时可供用户使用。OLAP 立方体和数据透视表提供了一定程度的交互性。在某些情况下,超级用户被授予对报告数据库或数据仓库复制副本的 SQL 访问权限,他们可以在其中运行即席 SQL 查询。但是总的来说,传统的数据仓库和商业智能是相当静态的。

大数据的出现使得旧式 ETL 不再适用。数周或数月的前期数据建模和 ETL 设计来适应新的数据集被认为是僵化和过时的。随着越来越多的工作负载被转移到大数据平台,曾经被视为组织的中央数据存储库的企业数据仓库现在与企业“数据中枢”或“数据湖”共享这一称号。在适当的情况下,ETL 已经被 ELT 所取代。提取、加载和转换(ELT)允许用户在很少或没有转换的情况下将数据转储到大数据平台。然后由数据分析师根据他或她的需求使数据适合于分析。ELT 在,ETL 不在。EDW 是僵化和结构化的。大数据快速而敏捷。

与此同时,用户变得更加精明,要求也更高。大量的数据是可用的,等待 ETL 开发人员团队几周或几个月来设计和实现数据摄取管道以使这些数据可供消费不再是一种选择。出现了一系列新的活动,统称为数据整理。

数据整理不仅仅是为分析准备数据。数据整理是数据分析过程本身的一部分。通过执行数据整理、迭代发现、结构化、清理、丰富和验证,用户可以更好地理解他们的数据,并能够提出更好的问题。当用户反复讨论他们的数据时,隐藏的模式就会暴露出来,揭示出分析数据的新方法。数据整理是大数据和 ELT 的完美补充。斯坦福大学和伯克利大学的数据整理先驱们,后来又创办了 Trifacta,提出了数据整理的六个核心活动(表 9-1 )。Xi

表 9-1

Six Core Data Wrangling Activities

| 活动 | 描述 | | :– | :– | | 发现 | 这是数据分析和评估阶段。 | | 结构化 | 确定数据结构的一组活动。创建模式、旋转行、添加或删除列等。 | | 清洁 | 一组活动,包括修复无效或缺失的值、标准化特定字段的格式(如日期、电话和州)、删除额外字符等。 | | 浓缩 | 一组活动,涉及将数据与其他数据源连接或混合,以改善数据分析的结果。 | | 验证 | 一组活动,用于检查所执行的充实和数据清理是否真正实现了其目标。 | | 出版 | 一旦你对数据整理的结果感到满意,就该公布结果了。结果可以是 Tableau 等数据可视化工具的输入数据,也可以是营销活动计划的输入数据。 |

请注意,数据整理活动本质上是迭代的。您通常会以不同的顺序多次执行这些步骤,以获得想要的结果。

如果您曾经使用 Microsoft Excel 使数值看起来像某种格式,或者使用正则表达式删除某些字符,那么您已经执行了一种简单形式的数据整理。Microsoft Excel 实际上是一个很好的数据辩论工具,尽管它并不是严格为这类任务设计的。然而,当在大型数据集上使用时,或者当数据存储在大数据平台或关系数据库中时,Microsoft Excel 存在不足。一种新型的交互式数据辩论工具被开发出来,以填补市场空白。这些数据整理工具将交互式数据处理提升到了一个新的水平,提供了使通常需要编码专业知识的任务变得容易执行的功能。这些工具中的大多数都可以自动转换,并根据所提供的数据集提供相关的建议。它们与 Cloudera Enterprise 等大数据平台深度集成,可以通过 Impala、Hive、Spark HDFS 或 HBase 进行连接。我将展示如何使用一些最流行的数据整理工具的例子。

三连中

Trifacta 是数据整理的先驱之一。由斯坦福大学博士肖恩·坎德尔,加州大学伯克利分校教授乔·赫勒斯坦,华盛顿大学和前斯坦福大学教授杰弗里·赫尔开发。他们开始了一个名为斯坦福/伯克利牧马人的联合研究项目,最终成为 Trifacta。 xii Trifacta 销售他们产品的两个版本,Trifacta 牧马人和 Trifacta 牧马人企业。Trifacta Wrangler 是一个免费的桌面应用程序,旨在供个人使用小型数据集。Trifacta Wrangler Enterprise 专为集中管理安全和数据治理的团队而设计。 xiii 如前所述,Trifacta 可以连接到 Impala 以提供高性能的查询能力。 xiv 关于如何安装 Trifacta 牧马人,请咨询 tri acta 的网站。

我给你看看 Trifacta 牧马人的一些特点。Trifacta 组织基于“流”的数据整理活动。Trifacta 牧马人会在你第一次启动应用的时候要求你创建一个新的流量。

接下来你需要做的是上传一个数据集。Trifacta 可以连接到不同类型的数据源,但是现在我们将上传一个包含客户信息的示例 CSV 文件。上传 CSV 文件后,您现在可以浏览数据。点击“详细信息”按钮旁边的按钮,并选择“新流程中的争论”(图 9-44 )。

下一代大数据教程(四)

图 9-44

Wrangle in new Flow

您将看到类似图 9-45 的 transformer 页面。Trifacta 立即检测并显示各个列中的数据是如何分布的。

下一代大数据教程(四)

图 9-45

Trifacta’s transformer page

您可以滚动到显示数据分布的图表的左侧或右侧,以快速查看该列的内容。这将帮助您确定需要处理或转换的数据(图 9-46 )。

下一代大数据教程(四)

图 9-46

Histogram showing data distribution

在列名称下,您会看到特定列的数据质量指示器。不匹配的数据类型将显示为红色,空行将显示为灰色。如果存储在该栏中的数据全部有效,指示器应为绿色(图 9-47 )。

下一代大数据教程(四)

图 9-47

Data quality bar

通过单击特定的列,您将看到关于如何转换存储在该列上的数据的各种建议。这项功能由机器学习提供支持。Trifacta 从您过去的数据整理活动中学习,以提出下一步建议(图 9-48 )。

下一代大数据教程(四)

图 9-48

Trifacta’s suggestions

不同的栏目得到不同的建议(图 9-49 )。

下一代大数据教程(四)

图 9-49

Trifacta has different suggestions for different types of data

单击列名旁边的按钮,获取特定列的数据转换选项列表。您可以重命名列名、更改数据类型、过滤、清理或对列执行聚合等等(图 9-50 )。

下一代大数据教程(四)

图 9-50

Additional transformation options

几乎每种类型的数据转换都可用(图 9-51 )。

下一代大数据教程(四)

图 9-51

Additional transformation options

双击该列将显示另一个窗口,其中包含关于该列中存储的信息的各种统计信息和有用信息。信息包括最大值、最频繁值和字符串长度统计等(图 9-52 )。

下一代大数据教程(四)

图 9-52

The final output from the Job Results window

Trifacta 足够聪明,能够知道该列是否包含位置信息,比如邮政编码。它将尝试使用地图显示信息(图 9-53 )。

下一代大数据教程(四)

图 9-53

The final output from the Job Results window

让我们尝试一种建议的数据转换。让我们将姓氏从全部大写转换为正确的姓氏(只有第一个字母是大写的)。选择最后一个建议并点击“修改”按钮以应用更改(图 9-54 )。

下一代大数据教程(四)

图 9-54

Apply the transformation

姓氏已经转换,如图 9-55 所示。

下一代大数据教程(四)

图 9-55

The transformation has been applied

点击页面右上角附近的“生成结果”按钮(图 9-56 )。

下一代大数据教程(四)

图 9-56

Generate Results

您可以用不同的格式保存结果。为我们的数据集选择 CSV。如果需要,您可以选择压缩结果。确保选中“分析结果”选项,以生成结果的分析结果(图 9-57 )。

下一代大数据教程(四)

图 9-57

Result Summary

将出现“结果摘要”窗口。它将包括各种统计数据和关于您的数据的信息。检查一下,确保结果如你所愿。Trifacta 没有内置的数据可视化。它依赖于其他工具,如 Tableau、Qlik、Power BI,甚至 Microsoft Excel 来提供可视化。

Alteryx(变形虫)

Alteryx 是另一家受欢迎的软件开发公司,开发数据整理和分析软件。该公司成立于 2010 年,总部位于加利福尼亚州欧文市。它支持多种数据源,如 Oracle、SQL Server、Hive 和 Impala xv ,以实现快速的即席查询功能。

第一次启动 Alteryx 时会出现一个入门窗口(图 9-58 )。您可以浏览教程、打开最近的工作流程或创建新的工作流程。现在,让我们创建一个新的工作流。

下一代大数据教程(四)

图 9-58

Getting started window

Alteryx 以易用著称。用户与 Alteryx 的大多数交互都涉及到从工具面板中拖放和配置工具(图 9-59 )。

下一代大数据教程(四)

图 9-59

Alteryx main window

工具选项板为用户提供了按工具类别组织的工具。您将这些工具拖到画布中,并连接它们来设计您的工作流。这些工具允许用户执行不同的操作,用户通常会执行这些操作来处理和分析数据。常见的操作包括选择、过滤、排序、连接、联合、汇总和浏览等等。这些是用户通常通过开发 SQL 查询来执行的任务。Alteryx 提供了一个更加简单和高效的方法(图 9-60 )。

下一代大数据教程(四)

图 9-60

Tool Palette – Favorites

Alteryx 还为更复杂的操作提供了无数的工具,例如相关性、换位、人口统计分析、行为分析和空间匹配等等。浏览其他选项卡,熟悉可用的工具(图 9-61 )。

下一代大数据教程(四)

图 9-61

Tool Palette – Preparation

每个工作流都从使用输入数据工具指定数据源开始。将输入数据工具拖放到工作流窗口。您可以指定一个文件或连接到外部数据源,如 Impala、Oracle、SQL Server 或任何提供 ODBC 接口的数据源(图 9-62 )。

下一代大数据教程(四)

图 9-62

Input Data Tool

在本例中,我们将从一个文件中获取数据(图 9-63 )。

下一代大数据教程(四)

图 9-63

Select file

Alteryx 附带了几个示例文件。让我们使用 Customers.csv 文件(图 9-64 )。

下一代大数据教程(四)

图 9-64

Select Customers.csv

现在您已经配置了一个数据源,让我们拖放选择工具。选择工具允许您选择特定的列。默认情况下,所有的列都是选中的,所以在这个例子中,让我们取消选中一些列。确保连接输入数据并选择工具,如图 9-65 所示。

下一代大数据教程(四)

图 9-65

Select tool

在我们选择了几列之后,我们可以使用排序工具对结果进行排序。连接选择工具和排序工具。排序工具允许您指定希望如何对结果进行排序。在本例中,我们将按城市和客户群升序排序。您可以通过配置选项(图 9-66 )来实现。

下一代大数据教程(四)

图 9-66

Sort Tool

我们可以继续添加更多的工具,让工作流变得尽可能复杂,但是我们将在这个例子中停止。几乎每个 Alteryx 工作流都以浏览或保存工作流的结果而结束。

让我们浏览结果以确保数据看起来是正确的。在工作流程窗口上拖动一个浏览工具,并确保它与分类工具连接(图 9-67 )。

下一代大数据教程(四)

图 9-67

Browse data tool

通过单击位于窗口右上角帮助菜单项附近的绿色运行按钮来运行工作流。几秒钟后,工作流的结果将显示在输出窗口中。检查结果,查看是否选择了正确的列,以及排序顺序是否与您之前指定的一致。

像 Trifacta 一样,Alteryx 也可以分析您的数据,并显示有用的统计数据和相关信息,如列中数据的分布、数据质量信息、列的数据类型、空值或空白值的数量、平均长度、最大长度等。在图 9-68 中,显示了 CustomerID 字段的统计数据。

下一代大数据教程(四)

图 9-68

Browse data

点击客户细分字段以显示关于该列的统计数据(图 9-69 )。

下一代大数据教程(四)

图 9-69

Data quality – Customer Segment field

图 9-70 显示了城市字段的统计数据。

下一代大数据教程(四)

图 9-70

Data quality – City field

如前所述,我们还可以将结果保存到文件或外部数据源,如 Kudu、Oracle、SQL Server 或 HDFS。从工作流窗口中删除浏览工具,并将其替换为输出数据工具(图 9-71 )。

下一代大数据教程(四)

图 9-71

Output Data tool

让我们将结果保存到一个文件中(图 9-71 )。屏幕左侧的配置窗口将允许您设置如何保存文件的选项,包括文件格式。如图所示,您可以选择以不同的格式保存文件,例如 CSV、Excel、JSON、Tableau data extract 和 Qlikview data eXchange 等。

下一代大数据教程(四)

图 9-72

Select file format

让我们将数据保存为 CSV 格式(图 9-72 )。保存结果后,让我们用记事本检查文件以确保数据被正确保存(图 9-73 )。

下一代大数据教程(四)

图 9-73

Validate saved data

恭喜你!现在,您已经对 Alteryx 有了一些基本的了解和实践经验。

大数据

Datameer 是另一个流行的数据整理工具,内置了数据可视化和机器学习功能。它有一个类似电子表格的界面,包括 200 多个分析功能。 xvi Datameer 总部位于美国加州三藩市,成立于 2009 年。与 Trifacta 和 Alteryx 不同,Datameer 没有用于 Impala 的连接器,尽管它有用于 Spark、HDFS、Hive 和 HBase 的连接器。XVII

让我们探索一下 Datameer。你需要做的第一件事是上传一个数据文件(图 9-74 )。

下一代大数据教程(四)

图 9-74

Upload data file

指定文件和文件类型并点击下一步(图 9-75 )。

下一代大数据教程(四)

图 9-75

Specify file type

您可以配置数据字段。Datameer 允许你改变数据类型、字段名称等等(图 9-76 )。

下一代大数据教程(四)

图 9-76

Configure the data fields

数据以电子表格的形式呈现(图 9-77 )。

下一代大数据教程(四)

图 9-77

Spreadsheet-like user interface

就像 Trifacta 和 Alteryx 一样,Datameer 对您的数据进行分析,并提供有关您的数据字段的统计数据和信息(图 9-78 )。

下一代大数据教程(四)

图 9-78

Datameer Flipside for visual data profiling

Datameer 使用一种称为智能分析的功能,为常见的机器学习任务提供内置支持,如聚类、决策树分类和建议(图 9-79 )。

下一代大数据教程(四)

图 9-79

Smart Analytics

执行聚类可以显示关于我们数据的一些有趣的模式(图 9-80 )。

下一代大数据教程(四)

图 9-80

Clustering

数据将被分组到簇中。分组将作为另一列添加到您的数据集中。每个集群将由一个集群 id 标识(图 9-81 )。

下一代大数据教程(四)

图 9-81

Column ID showing the different clusters

也可以使用决策树进行分类(图 9-82 )。

下一代大数据教程(四)

图 9-82

Decision trees

数据将通过如图 9-83 所示的附加预测字段进行分类。

下一代大数据教程(四)

图 9-83

Prediction column

如前所述,Datameer 包括内置的数据可视化(图 9-84 )。

下一代大数据教程(四)

图 9-84

Datameer data visualization

摘要

确保您的大数据可视化工具能够处理大数据的三个 V(量、多样性和速度)。如果您正在为您的组织选择工具,请考虑该工具是否能够处理 TB/Pb 大小的数据集。您的数据源是纯关系型的,还是也分析半结构化和非结构化的数据集?您是否要求实时或接近实时地接收和处理数据?尝试利用您现有的 BI 和数据可视化工具,并确定它们是否能够满足您的需求。您可能正在连接到 Hadoop 集群,但是您的数据集可能没有那么大。如今,这是一种常见的情况,组织使用大数据平台作为一种经济高效的方式来整合昂贵的报告服务器和数据集市。

在过去的几年里,数据整理工具变得很流行。用户变得越来越精明,要求也越来越高。谁比最了解数据的人更适合准备数据?如果您的组织中有坚持自己准备和转换数据的高级用户,那么可能值得看看我在本章中介绍的一些数据整理工具。

参考

  1. 克里斯汀·维特伦,詹姆斯·霍尔曼;“将 SAS 可视化分析添加到现有 SAS 商业智能部署的考虑因素”,SAS,2018, http://support.sas.com/resources/papers/proceedings14/SAS146-2014.pdf
  2. 缩放数据;“关于缩放数据”,2018 年,“??””
  3. Zoomdata《实时&流分析》,Zoomdata,2018, https://www.zoomdata.com/product/real-time-streaming-analytics/
  4. Zoomdata《实时&流分析》,Zoomdata,2018, https://www.zoomdata.com/product/stream-processing-analytics/
  5. https://www.zoomdata.com/product/apache-spark-data-stream-processing/
  6. Zoomdata《实时&流分析》,Zoomdata,2018, https://www.zoomdata.com/product/stream-processing-analytics/
  7. Zoomdata《Zoomdata 中的数据锐化》,Zoomdata,2018, https://www.zoomdata.com/docs/2.5/data-sharpening-in-zoomdata.html
  8. Zoomdata《实时&流分析》,Zoomdata,2018, https://www.zoomdata.com/product/stream-processing-analytics/
  9. Coderwall《如何在 JavaScript 中从任意日期获取正确的 Unix 时间戳》,Coderwall,2018, https://coderwall.com/p/rbfl6g/how-to-get-the-correct-unix-timestamp-from-any-date-in-javascript
  10. 吉尔出版社;“清洗大数据:最耗时、最不愉快的数据科学任务,调查称”,福布斯,2018, https://www.forbes.com/sites/gilpress/2016/03/23/data-preparation-most-time-consuming-least-enjoyable-data-science-task-survey-says/#3bfc5cdc6f63
  11. Tye Rattenbury《六大核心数据角力活动》,Datanami,2015, https://www.datanami.com/2015/09/14/six-core-data-wrangling-activities/
  12. 斯坦福;”牧马人是一个用于数据清理和转换的交互式工具.”斯坦福,2013, http://vis.stanford.edu/wrangler/
  13. Trifacta《组织的数据角力》,Trifacta,2018, https://www.trifacta.com/products/wrangler-enterprise/
  14. Trifacta《黑斑羚 Hadoop 连接:从 Cloudera 黑斑羚和 Apache Hadoop 及更远》,2018, https://www.trifacta.com/impala-hadoop/
  15. Alteryx” Alteryx 支持以多种方式访问 Cloudera . “,Alteryx,2018, https://www.alteryx.com/partners/cloudera
  16. Datameer《Cloudera 与 Datameer》,Datameer,2018, https://www.cloudera.com/partners/solutions/datameer.html
  17. Datameer《连接器》,Datameer,2018, https://www.datameer.com/product/connectors/

十、分布式内存大数据计算

Alluxio,原名 Tachyon,是加州大学伯克利分校 AMPLab 的一个开源项目。Alluxio 是一个以内存为中心的分布式存储系统,最初是由李皓原在 2012 年作为一个研究项目开发的,当时他是 AMPLab 的一名博士生和 Apache Spark 创始人。 i 项目是 Berkeley Data Analytics Stack(BDAS)的存储层。2015 年,Alluxio,Inc .由李创立,旨在将 Alluxio 商业化,获得了 Andre esen Horowitz 750 万美元的现金注入。如今,Alluxio 拥有来自英特尔、IBM、雅虎和 Red Hat 等全球 50 个组织的 200 多名贡献者。几家知名公司目前正在生产中使用 Alluxio,如百度、阿里巴巴、Rackspace 和巴克莱。 ii

Spark 的合著者、DataBricks 的联合创始人兼执行主席、加州大学伯克利分校 AMPLab 的联合董事、李皓原大学的博士联合顾问扬·斯托伊察(ion Williams)表示:“作为一个从 Apache Spark 和 Hadoop MapReduce 等集群计算框架中抽象出现有存储系统差异的层,Alluxio 可以实现大数据存储的快速发展,类似于互联网协议(IP)实现互联网发展的方式。” iii

此外,加州大学伯克利分校计算机科学教授兼 AMPLab 主任 Michael Franklin 表示,“AMPLab 在新的大数据堆栈中创建了一些最重要的开源技术,包括 Apache Spark。Alluxio 是 AMPLab 的下一个具有重大影响的项目。我们看到它在存储层的发展中发挥着巨大的颠覆性作用,以处理不断扩大的大数据使用案例。” iv

体系结构

Alluxio 是一个以内存为中心的分布式存储系统,旨在成为大数据事实上的存储统一层。它提供了一个虚拟化层,统一了对不同存储引擎(如本地文件系统、HDFS、S3 和 NFS)和计算框架(如 Spark、MapReduce、Hive 和 Presto)的访问。图 10-1 给你一个 Alluxio 架构的概述。

下一代大数据教程(四)

图 10-1

Alluxio Architecture Overview

Alluxio 是协调数据共享和指导数据访问的中间层,同时为计算框架和大数据应用提供高性能低延迟的内存速度。Alluxio 与 Spark 和 Hadoop 无缝集成,只需要少量的配置更改。通过利用 Alluxio 的统一命名空间功能,应用程序只需连接到 Alluxio 即可访问存储在任何受支持的存储引擎中的数据。Alluxio 有自己的原生 API 以及 Hadoop 兼容的文件系统接口。便利类使用户能够执行最初为 Hadoop 编写的代码,而无需任何代码更改。REST API 提供了对其他语言的访问。我们将在本章的后面探讨 API。

Alluxio 的统一名称空间特性不支持 Kudu 等关系数据存储、Oracle 或 SQL Server 等关系数据库或 MongoDB 等文档数据库。当然,支持对 Alluxio 和提到的存储引擎的读写。开发人员可以使用 Spark 等计算框架从 Kudu 表创建数据帧,并以 Parquet 或 CSV 格式将其存储在 Alluxio 文件系统中,反之亦然(图 10-2 )。

下一代大数据教程(四)

图 10-2

Alluxio Technical Architecture

为什么要用 Alluxio?

典型的 Hadoop 发行版包括 20 多个开源组件。向您的技术堆栈中添加另一个组件可能是您最想不到的事情。尽管如此,Alluxio 提供了大量的好处,这将使你想知道为什么 Alluxio 不是核心 Apache Spark 的一部分。

显著提高大数据处理性能和可扩展性

这些年来,内存越来越便宜,而它的性能却越来越快。与此同时,硬盘驱动器的性能只是略有改善。毫无疑问,在内存中处理数据比在磁盘上处理数据快一个数量级。在几乎所有的编程范例中,我们都被建议在内存中缓存数据以提高性能。Apache Spark 优于 MapReduce 的一个主要优势是它能够缓存数据。Alluxio 将这一点提升到了一个新的水平,不仅作为缓存层提供大数据应用,还提供了一个成熟的分布式高性能以内存为中心的存储系统。

百度正在运营世界上最大的 Alluxio 集群之一,1000 个工作节点处理超过 2PB 的数据。借助 Alluxio,百度在查询和处理时间方面的性能平均提高了 10 倍,最高可达 30 倍,显著提高了百度做出重要业务决策的能力。 v 巴克莱发表文章描述了他们与 Alluxio 的经历。巴克莱数据科学家 Gianmario Spacagna 和高级分析主管 Harry Powell 能够使用 Alluxio 将他们的 Spark 工作从数小时调整到数秒。中国最大的旅游搜索引擎之一 Qunar.com 使用 Alluxio 后,性能提升了 15 到 300 倍。 vii

多个框架和应用程序可以以内存速度共享数据

典型的 Hadoop 集群有多个会话运行不同的计算框架,如 Spark 和 MapReduce。对于 Spark,每个应用程序都有自己的执行器进程,执行器中的每个任务都运行在自己的 JVM 上,将 Spark 应用程序相互隔离。这意味着 Spark(和 MapReduce)应用程序无法共享数据,除了写入 HDFS 或 S3 等存储系统。如图 10-3 所示,Spark 作业和 MapReduce 作业使用存储在 HDFS 或 S3 的相同数据。在图 10-4 中,多个 Spark 作业使用相同的数据,每个作业在自己的堆空间中存储自己版本的数据。 viii 不仅数据会重复,通过 HDFS 或 S3 共享数据也会很慢,尤其是当你共享大量数据的时候。

下一代大数据教程(四)

图 10-4

Different jobs sharing data via HDFS or S3

下一代大数据教程(四)

图 10-3

Different frameworks sharing data via HDFS or S3

通过使用 Alluxio 作为堆外存储(图 10-5 ),多个框架和作业可以以内存速度共享数据,减少数据重复,提高吞吐量,减少延迟。

下一代大数据教程(四)

图 10-5

Different jobs and frameworks sharing data at memory speed

在应用程序终止或出现故障时提供高可用性和持久性

在 Spark 中,执行器进程和执行器内存驻留在同一个 JVM 中,所有缓存的数据都存储在 JVM 堆空间中(图 10-6 )。

下一代大数据教程(四)

图 10-7

Spark job crashes or completes

下一代大数据教程(四)

图 10-6

Spark job with its own heap memory

当作业完成或者由于某种原因 JVM 由于运行时异常而崩溃时,堆空间中缓存的所有数据都将丢失,如图 10-7 和 10-8 所示。

下一代大数据教程(四)

图 10-8

Spark job crashes or completes. Heap space is lost

解决方案是使用 Alluxio 作为堆外存储(图 10-9 )。

下一代大数据教程(四)

图 10-9

Spark using Alluxio as off-heap storage

在这种情况下,即使 Spark JVM 崩溃,数据在 Alluxio 中仍然可用(图 10-10 和 10-11 )。

下一代大数据教程(四)

图 10-11

Spark job crashes or completes. Heap space is lost. Off-heap memory is still available.

下一代大数据教程(四)

图 10-10

Spark job crashes or completes

优化整体内存使用并最大限度地减少垃圾收集

通过使用 Alluxio,内存使用效率大大提高,因为数据在作业和框架之间共享,并且因为数据存储在堆外,所以垃圾收集也被最小化,从而进一步提高了作业和应用程序的性能(图 10-12 )。

下一代大数据教程(四)

图 10-12

Multiple Spark and MapReduce jobs can access the same data stored in Alluxio

降低硬件要求

Alluxio 的大数据处理速度明显快于 HDFS。IBM 的测试显示,在写入 io 方面,Alluxio 比 HDFS 快 110 倍。 ix 有了这样的性能,对额外硬件的需求就会减少,从而节省基础设施和许可成本。

Alluxio 组件

与 Hadoop 和其他 Hadoop 组件类似,Alluxio 有一个主/从架构。

主要主人

第一主节点管理集群的全局元数据。

第二主设备

辅助主节点管理日志并定期执行检查点操作。

工人

工作人员存储数据,并为来自应用程序的读或写数据请求提供服务。工作人员还管理本地资源,如内存和磁盘空间。

客户

Alluxio 客户端提供了一个文件系统 API,供用户与 Alluxio 通信。

装置

有几种方法可以安装 Alluxio。Alluxio 运行在 YARN、Mesos、Docker 和 EC2 上。 x 为了让您快速入门,我将在一台服务器上安装 Alluxio。

从 Alluxio 网站下载 Alluxio 的最新版本。

wget http://alluxio.org/downloads/files/1.6.1/alluxio-1.4.0-bin.tar.gz
tar xvfz alluxio-1.4.0-bin.tar.gz
cd alluxio-1.4.0

  • 1
  • 2
  • 3
  • 4

让我们格式化 worker 存储目录和 Alluxio 日志,以准备 worker 和 master。

./bin/alluxio format
Waiting for tasks to finish...
All tasks finished, please analyze the log at /opt/alluxio-1.4.0/bin/../logs/task.log.
Formatting Alluxio Master @ server01

  • 1
  • 2
  • 3
  • 4
  • 5

开始 Alluxio 吧。

./bin/alluxio-start.sh local
Waiting for tasks to finish...
All tasks finished, please analyze the log at /opt/alluxio-1.4.0/bin/../logs/task.log.
Waiting for tasks to finish...
All tasks finished, please analyze the log at /opt/alluxio-1.4.0/bin/../logs/task.log.
Killed 0 processes on server01
Killed 0 processes on server01
Starting master @ server01. Logging to /opt/alluxio-1.4.0/logs
Formatting RamFS: /mnt/ramdisk (4000mb)
Starting worker @ server01. Logging to /opt/alluxio-1.4.0/logs
Starting proxy @ server01. Logging to /opt/alluxio-1.4.0/logs

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

我创建了一个 100 MB 的文件,并将其复制到内存中。如果你有更多的内存,你可以创建一个更大的文件。列出目录的内容。

./bin/alluxio fs ls /
[root@server01 alluxio-1.4.0]# ./bin/alluxio fs copyFromLocal /root/test01.csv /

Copied /root/test01.csv to /
./bin/alluxio fs ls /
-rw-r--r--     root           root           103.39MB  05-22-2017 22:21:14:925  In Memory      /test01.csv

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

让我们将文件从内存保存到本地文件系统。

./bin/alluxio fs persist /test01.csv
persisted file /test01.csv with size 108416290

  • 1
  • 2
  • 3

阿帕奇 Spark 和 Alluxio

您在 Alluxio 中访问数据的方式类似于从 Spark 中访问存储在 HDFS 和 S3 的数据。

val dataRDD = sc.textFile("alluxio://localhost:19998/test01.csv")

val parsedRDD = dataRDD.map{_.split(",")}

case class CustomerData(userid: Long, city: String, state: String, age: Short)

val dataDF = parsedRDD.map{ a => CustomerData (a(0).toLong, a(1), a(2), a(3).toShort) }.toDF

dataDF.show()

+------+---------------+-----+---+
|userid|           city|state|age|
+------+---------------+-----+---+
|   300|       Torrance|   CA| 23|
|   302|Manhattan Beach|   CA| 21|
+------+---------------+-----+---+

下一代大数据教程(四)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

您还可以从 MapReduce、Hive、Flink 和 Presto 访问 Alluxio。查看 Alluxio 的在线文档了解更多详细信息。

管理 Alluxio

Alluxio 提供了一个 web 界面来方便系统管理和监控。您可以获得有关空间容量、使用情况、正常运行时间、启动时间和文件列表等高级和详细信息。Alluxio 为您提供了一个主界面和工作界面。Alluxio 还为典型的文件系统操作提供了命令行界面。

掌握

你可以通过访问http://<Master IP Address >:19999(图 10-13 )进入 Alluxio 的主主页。

下一代大数据教程(四)

图 10-13

Master home page

工人

您可以通过访问http://<Worker IP Address>:30000(图 10-14 )来访问每个 Alluxio worker 的 web 界面。

下一代大数据教程(四)

图 10-14

Worker home page

Apache Ignite

Ignite 是另一个类似于 Alluxio 的内存平台。GridGain Systems 最初在 2014 年向 Apache Software Foundation 捐赠了 Apache Ignite。2015 年被提升为顶层项目。 xi 它功能极其丰富,可以用作内存中数据网格、内存中数据库、内存中分布式文件系统、流分析引擎以及 Hadoop 和 Spark 的加速器等等。XII

Apache geode(Apache geode)

Geode 是一个分布式内存数据库,专为具有低延迟响应时间和高并发性要求的事务性应用程序而设计。Pivotal 在 2015 年向 Apache 孵化器提交了 Geode。它于 2016 年 11 月从 Apache 孵化器毕业,成为顶级 Apache 项目。Gemfire 是 Geode 的商业版本,是华尔街交易平台中使用的一种流行的低延迟交易系统。XIII

摘要

Spark 是一个快速的内存数据处理框架。Alluxio 提供了一个堆外存储,可用于提高跨作业和框架的数据共享效率,最大限度地减少垃圾收集,并优化整体内存使用,从而显著提高速度。不仅作业运行速度大大加快,而且由于硬件需求减少,您还可以降低成本。Alluxio 不是唯一可用的内存数据库;Apache Ignite 和 Geode 是可行的选择,其他商业替代产品如 Oracle Coherence 和 Times Ten 也是可行的选择。

本章介绍了分布式内存计算,尤其是 Alluxio。Alluxio 是 Spark 的默认堆外存储解决方案。你可以通过访问 Alluxio 在 Alluxio.org 或 Alluxio.com 的网站来了解更多。

参考

  1. 克里斯·马特曼;“Apache Spark for the Incubator”,Apache Spark,2013, http://mail-archives.apache.org/mod_mbox/incubator-general/201306.mbox/%3CCDD80F64.D5F9D%25chris.a.mattmann@jpl.nasa.gov%3E
  2. 李皓原;“Alluxio,原名超光速粒子,随着 1.0 版本进入新时代,”Alluxio,2016, https://www.alluxio.com/blog/alluxio-formerly-tachyon-is-entering-a-new-era-with-10-release
  3. 李皓原;“Alluxio,原名超光速粒子,随着 1.0 版本进入新时代,”Alluxio,2016, https://www.alluxio.com/blog/alluxio-formerly-tachyon-is-entering-a-new-era-with-10-release
  4. MarketWired“Alluxio 以内存速度虚拟化用于 Pb 级计算的分布式存储,”Alluxio,2016, http://www.marketwired.com/press-release/alluxio-virtualizes-distributed-storage-petabyte-scale-computing-in-memory-speeds-2099053.htm
  5. MarketWired“Alluxio 以内存速度虚拟化用于 Pb 级计算的分布式存储,”Alluxio,2016, http://www.marketwired.com/press-release/alluxio-virtualizes-distributed-storage-petabyte-scale-computing-in-memory-speeds-2099053.htm
  6. 亨利·鲍威尔、詹马里奥·斯帕卡尼亚;“用超光速粒子让不可能成为可能:将 Spark 工作从数小时加速到数秒,”DZone,2016, https://dzone.com/articles/Accelerate-In-Memory-Processing-with-Spark-from-Hours-to-Seconds-With-Tachyon
  7. 李皓原;“Alluxio 在 Strata+Hadoop World Beijing 2016 上的主题演讲”,Alluxio,2016, https://www.slideshare.net/Alluxio/alluxio-keynote-at-stratahadoop-world-beijing-2016-65172341
  8. 费明·s。《通过用例快速入门》,英特尔,2016, https://software.intel.com/en-us/blogs/2016/02/04/getting-started-with-tachyon-by-use-cases
  9. 吉尔·韦尔尼克;《用于超快速大数据处理的超光速粒子》,IBM,2015, https://www.ibm.com/blogs/research/2015/08/tachyon-for-ultra-fast-big-data-processing/
  10. Alluxio《快速入门指南》,Alluxio,2018, https://www.alluxio.org/docs/1.6/en/Getting-Started.html
  11. 尼基塔·伊万诺夫;“用 Apache Ignite 点燃大数据处理”,InfoWorld,2016, https://www.infoworld.com/article/3135070/data-center/fire-up-big-data-processing-with-apache-ignite.html
  12. GridGain“GridGain 内存计算平台的基础”,GridGain,2018, https://www.gridgain.com/technology/apache-ignite
  13. 阿帕奇软件基金会;“Apache Software Foundation 宣布 Apache Geode 为顶级项目,”GlobeNewsWire,2018, https://globenewswire.com/news-release/2016/11/21/891611/0/en/The-Apache-Software-Foundation-Announces-Apache-Geode-as-a-Top-Level-Project.html

十一、大数据治理和管理

数据治理是用于正式管理组织数据的一组策略和流程。数据治理是一个广泛的话题,包括几个功能,比如数据质量、元数据管理、主数据管理和数据安全性等等。数据治理的主要目标是确保组织的数据安全可靠。

数据治理可能是组织信息管理策略中最重要的部分之一。数据治理问题,如缺乏数据质量或数据安全性受损,可能会导致数据驱动型项目失败或造成巨大的收入损失。对于银行和政府机构等组织来说,数据治理是必须的。有几个数据治理和管理框架可供选择,比如 DAMA 框架。DAMA 框架在一个指南中编纂了一个知识领域和过程的集合,该指南被称为“知识的数据管理主体的 DAMA 指南或 DAMA-DMBoK 指南” ii

本章的目的不是提供数据治理的详尽内容。已经有整本书都是关于数据治理的。相反,我的目的是从大数据的角度向您介绍数据治理。我使用 Cloudera Navigator 来展示大数据平台上的常见数据治理任务。要了解更多关于数据治理的信息,我推荐 John Ladley 的《数据治理:如何设计、部署和维持有效的数据治理计划》(Morgan Kaufmann,2012)。要了解更多关于 Cloudera Navigator 的信息,请访问 Cloudera 的网站。

大数据的数据治理

因为数据被整合到大数据平台(也称为“数据湖”或“数据中心”)中,所以数据治理变得更加重要。在单个平台上存储数百万个文件和表格会成为数据管理的噩梦。想象一下,从不同的数据源获取相同数据的多个版本,或者不得不费力地通过数百万个文件和表来寻找特定的信息。在数据仓库环境中,数据治理至关重要,但在涉及大数据时,这一重要性被放大了。一旦您开始处理以不同类型和格式存储的数百 TB 或数 Pb 的数据,您就会对数据治理有真正的了解。成功的大数据战略依赖于执行良好的数据治理计划。

Cloudera 导航器

Cloudera 包括一个名为 Cloudera Navigator 的数据治理工具,用于帮助管理和组织存储在数据湖中的数据。在一些组织中,根据组织的规模,通常会有一个指定的人或小组负责数据治理。他们被称为数据管家。一些团队将数据管理员的角色与管理员、架构师或数据质量工程师的角色结合起来。无论您的团队是如何构建的,都应该有一个正式的数据治理框架在您的组织中实现和遵循。

数据管家和管理员可以使用 Cloudera Navigator 来主动管理和监控存储在数据湖中的数据。Cloudera Navigator 允许您执行元数据管理、数据分类、数据审计和访问控制等任务,探索数据谱系,执行影响分析,实现策略,以及自动化数据生命周期。

您可以从 Cloudera Manager 访问 Cloudera Navigator。导航到集群,然后点击 Cloudera Navigator,如图 11-1 所示。您也可以通过将浏览器指向在端口 7187 上安装了 Cloudera 元数据服务器的主机名来直接访问 Cloudera Navigator。

下一代大数据教程(四)

图 11-1

How to access Cloudera Navigator from Cloudera Manager

登录后,您会看到一个搜索框,您可以在其中输入实体名称、元数据标签或任何可以帮助您找到想要搜索的实体的关键字。如图 11-2 所示,窗口左侧的过滤器可以帮助您执行更精确的分面搜索。

下一代大数据教程(四)

图 11-2

Cloudera Navigator User Interface

元数据管理

元数据管理涉及管理描述组织数据的数据。 iii 例如,元数据可以是文件的创建日期、表格大小或文件权限等等。Cloudera Navigator 允许用户搜索、定义和更新属性,并标记文件、表和目录等实体。元数据有三种类型 iv :技术元数据,包括文件或表格名称;创建日期和时间;大小权限和所有者等等。不允许用户修改技术元数据。自定义元数据是键值对,可以在创建实体之前和之后添加到实体中。托管元数据包括只能在创建实体后添加或更新的标记、描述和键值对。元数据是大多数数据治理任务的基础,如数据分类、搜索和策略实现。我向存储在 HDFS (annie,berkeley 和 marketing)的客户文件添加了一个描述和三个元数据标记,如图 11-3 所示。

下一代大数据教程(四)

图 11-3

Adding metadata tags and description to entities

搜索“marketing”会返回我之前标记的客户文件,如图 11-4 所示。

下一代大数据教程(四)

图 11-4

Searching using a specific metadata tag

数据分类

元数据标签和描述可能非常强大。标签可用于对数据进行分类。例如,可以将文件和表标记为“marketing ”,以标识属于市场营销部门的实体,也可以将实体标记为“finance ”,以让每个人都知道特定的实体属于财务部等等。您可以使用标签和键值对的组合,以任何方式对数据进行分类。您可以使用标签快速搜索分类在一起的实体,如图 11-5 所示。

下一代大数据教程(四)

图 11-5

Classifying data using metadata

数据沿袭和影响分析

Cloudera Navigator 允许用户查看数据血统。数据沿袭显示了一个实体与其他实体的关系。它显示了针对特定实体执行的所有数据转换(图 11-6 )。它显示了特定实体是如何创建的、原始数据源以及谁执行了数据转换。检查实体的数据沿袭是确定其可信度的有效方法。它在应用程序开发中也很有用,帮助架构师确定模式更改对其他实体的影响。

下一代大数据教程(四)

图 11-6

Data lineage showing the actual SQL statement used to create the table

审计和访问控制

Cloudera Navigator 提供审计功能,允许数据管理员监控 HBase、HDFS、Hive、HUE、Impala、Navigator 元数据服务器、Sentry 和 Solr 等服务上的审计事件。vcloud era Navigator 监测用户成功和不成功登录时的事件;创建或删除列、表、文件、文件夹或集合。并授予或撤消对象权限,以提及一些可用的审计事件。审核安全事件可以确保数据不会被没有必要权限的人更改。这在多用户访问数据湖的多租户环境中尤其有用。在大数据环境中跟踪访问尝试和不正确的对象权限可能会很困难。Cloudera Navigator 记录了用户 ID、对象名称、IP 地址以及执行的确切命令或查询。 vi 图 11-7 显示了一个审计事件,包括时间戳、用户名、IP 地址、资源以及执行的确切命令。

下一代大数据教程(四)

图 11-7

Searching using a specific metadata tag

策略实现和数据生命周期自动化

Cloudera Navigator 允许数据管理员定义策略,这些策略可用于自动化某些操作,如执行命令、添加自定义元数据标记以及向 JMS 消息队列发送消息。 vii 例如,您可以创建策略,在指定的时间段后自动归档数据,或者根据实体的元数据将数据移动到安全的位置。

Cloudera Navigator REST API

Cloudera Navigator 拥有 REST API,开发人员可以使用它来提供额外的功能或自动化任务(图 11-8 )。该 API 使用 HTTP 基本认证,并使用您用于登录 Cloudera Navigator 的相同用户名和密码。

下一代大数据教程(四)

图 11-8

Cloudera Navigator REST API

Cloudera Navigator 加密

Cloudera Navigator 包括 Cloudera Navigator Encrypt、Cloudera Navigator 密钥托管服务器和 Cloudera Navigator 密钥 HSM,以提供企业加密和密钥管理解决方案。Navigator Encrypt 的讨论超出了本章的范围。有关 Cloudera Navigator Encrypt 的更多信息,请咨询 Cloudera 的网站。

其他数据治理工具

这绝不是一个详尽的列表,但它应该让您对当今市场上可用的数据治理工具有所了解。

Apache Atlas 系统

Apache Atlas 是一个数据治理和元数据帧,主要由 Hortonworks 使用。它提供了与 Cloudera Navigator 类似的特性和功能,如数据分类、审计、数据沿袭和策略引擎。 viii 它还提供了一个 REST API,并与第三方商业数据治理工具集成。

信息元数据管理器和企业数据目录

Informatica 元数据管理器是 Informatica 的元数据管理工具,与 Cloudera Navigator 集成。元数据管理器提供端到端的企业数据沿袭。Cloudera Navigator 只管理存储在数据湖中的数据,数据湖之外的任何东西都是 Cloudera Navigator 无法触及的。Metadata Manager 提供了从数据仓库到数据湖的数据流和转换的完整视图,以及跨整个 ETL 管道的商业智能工具,使数据管理员能够更好地了解数据转换链和已应用于数据的业务规则。 ix Informatica 企业数据目录是 Informatica 的下一代数据治理工具,将很快取代元数据管理器。企业数据目录使用机器学习来分类和组织存储在数据湖中的数据。Informatica 还拥有主数据管理和数据质量解决方案。

科里布拉

Collibra 是另一个与 Cloudera Navigator 集成的企业数据治理工具。Collibra 数据治理包括业务术语表、数据字典、参考数据管理、数据管理自动化、摄取控制、分析模型治理和 Hadoop 作业监督。

水线数据

Waterline Data 是另一种数据治理工具,它使用机器学习来自动推荐元数据标签,并将其与业务术语表术语进行匹配。水线数据声称,它可以减少 80%以上的数据人工标记。机器学习算法基于数据管理员对标签的接受或拒绝而自动改进。 x

开始逻辑

Smartlogic 与我讨论的其他数据治理工具略有不同。Smartlogic 提供了一个内容智能平台,它结合了规则引擎和自然语言处理,通过应用元数据标签来自动对数据进行分类。 xi 它集成了 Solr、Sharepoint 和 Marklogic,并与 Oracle、微软、Lucidworks 和 SAP 建立了合作伙伴关系。

摘要

Cloudera Navigator 是一个企业数据治理工具,使组织能够正确管理和组织他们的数据。目标是通过确保您的数据安全可靠,防止数据湖变成“数据沼泽”。Cloudera Navigator 非常有用,应该成为你的工具集的一部分;然而,它不是一个全面的数据治理和管理工具。例如,它不处理主数据管理和数据质量管理。如前所述,如果您需要这样的功能,您可能需要将 Cloudera Navigator 与第三方数据治理工具(如 Informatica 主数据管理或数据质量)集成。其他工具如 Informatica Enterprise Information Catalog、Waterline Data 和 Smartlogic 使用机器学习来构建分类法和本体,以自动组织数据,提供更高级的数据治理功能。

参考

  1. A.R .猜测;《数据治理与数据管理的区别》,Dataversity,2018, http://www.dataversity.net/the-difference-between-data-governance-data-management/
  2. 帕特里夏·库波利、苏珊·厄尔利、黛博拉·亨德森;《DAMA-DMBOK2 框架》,DAMA,2014, https://dama.org/sites/default/files/download/DAMA-DMBOK2-Framework-V2-20140317-FINAL.pdf
  3. 玛格丽特·劳斯;《元数据管理》,TechTarget,2018, http://whatis.techtarget.com/definition/metadata-management
  4. Cloudera《Cloudera Navigator 元数据架构》,Cloudera,2018, https://www.cloudera.com/documentation/enterprise/5-11-x/topics/cn_iu_metadata_arch.html
  5. Cloudera《Cloudera 领航员审计》,Cloudera,2018, https://www.cloudera.com/documentation/enterprise/5-6-x/topics/cn_iu_audits.html#cn_topic_7
  6. Cloudera“Hadoop 中的数据治理—第二部分”,Cloudera,2018, https://vision.cloudera.com/data-governance-in-hadoop-part-2/
  7. Cloudera《元数据政策》,Cloudera,2018, https://www.cloudera.com/documentation/enterprise/5-7-x/topics/navigator_policies.html#xd_583c10bfdbd326ba-7dae4aa6-147c30d0933--7c4a
  8. 阿帕奇地图集;《Hadoop 的数据治理和元数据帧》,Apache Atlas,2018, http://atlas.apache.org/
  9. 斯科特·亨德里克斯;“与 Cloudera Navigator 的 Informatica 集成现已提供端到端数据血统,”Cloudera,2018, https://vision.cloudera.com/end-to-end-data-lineage-now-available-with-informatica-integration-with-cloudera-navigator/
  10. 水线数据;《像管理资产一样管理你的数据》,水线数据,2018, https://www.waterlinedata.com/product-overview/
  11. 彭博;《Smartlogic 信号机有限公司公司概况》,彭博,2018, https://www.bloomberg.com/research/stocks/private/snapshot.asp?privcapId=37460152
© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...