Apache Drill、S3和KMS

这是来自”从零开始”的2017年圣诞日历的第十天文章。

首先或首要

在批量处理大规模数据后,将其存储在S3存储桶中,这在日常工作中是很常见的。然而,人们也有了解处理后数据是否正确处理以及了解数据内容的需求。

我考虑使用Apache Drill来通过SQL对存储在S3中的CSV文件进行搜索和查看。

Apache Drill 是一个开源的分布式SQL查询引擎,可在大数据环境中进行低延迟的分析。

Apache Drill是一个分布式处理框架的开源软件,最初是基于Google的Dremel(于2012年作为Google BigQuery提供)的开发而来。
自2014年起,Apache Drill已成为Apache的顶级项目。
通过使用Apache Drill,可以对Hadoop发行版、关系型数据库管理系统(RDBMS)和NoSQL中的数据发出SQL查询并进行数据检索。

为什么选择 Apache Drill?

进行分布式处理的SQL查询框架有Apache Drill、Hive和Presto。但是,与Hive和Presto不同的是,Drill的特点是可以对数据集进行查询而无需进行模式定义。因此,我认为Drill适用于临时对数据集进行查询的情况,而不需要首先进行模式定义才能引用数据,就像Hive和Presto一样。此外,Apache Drill与MongoDB类似,假定是针对半结构化数据进行数据处理,并且在官方网站的教程中也包括了针对JSON文件的查询处理。

在实际中应用

教程

首先从Apache Drill的下载页面下载(本次针对版本1.11)。
使用以下命令解压下载的文件并以embedded模式启动Drill。

$ tar -xvzf apache-drill-1.11.0.tar.gz
$ cd apache-drill-1.11.0 
$ ./bin/drill-embedded

当启动后变为输入等待状态时,在此处将向Drill中内置的示例数据”employee.json”发出查询。

0: jdbc:drill:zk=local> SELECT * FROM cp.`employee.json` LIMIT 5;
+--------------+------------------+-------------+------------+--------------+-------------------------+-----------+----------------+-------------+------------------------+----------+----------------+-------------------+-----------------+---------+--------------------+
| employee_id  |    full_name     | first_name  | last_name  | position_id  |     position_title      | store_id  | department_id  | birth_date  |       hire_date        |  salary  | supervisor_id  |  education_level  | marital_status  | gender  |  management_role   |
+--------------+------------------+-------------+------------+--------------+-------------------------+-----------+----------------+-------------+------------------------+----------+----------------+-------------------+-----------------+---------+--------------------+
![スクリーンショット 2017-12-18 8.47.02.png](https://qiita-image-store.s3.amazonaws.com/0/218189/9718ddb6-8731-87bc-e7b4-69d88c15331b.png)
| 1            | Sheri Nowmer     | Sheri       | Nowmer     | 1            | President               | 0         | 1              | 1961-08-26  | 1994-12-01 00:00:00.0  | 80000.0  | 0              | Graduate Degree   | S               | F       | Senior Management  |
| 2            | Derrick Whelply  | Derrick     | Whelply    | 2            | VP Country Manager      | 0         | 1              | 1915-07-03  | 1994-12-01 00:00:00.0  | 40000.0  | 1              | Graduate Degree   | M               | M       | Senior Management  |
| 4            | Michael Spence   | Michael     | Spence     | 2            | VP Country Manager      | 0         | 1              | 1969-06-20  | 1998-01-01 00:00:00.0  | 40000.0  | 1              | Graduate Degree   | S               | M       | Senior Management  |
| 5            | Maya Gutierrez   | Maya        | Gutierrez  | 2            | VP Country Manager      | 0         | 1              | 1951-05-10  | 1998-01-01 00:00:00.0  | 35000.0  | 1              | Bachelors Degree  | M               | F       | Senior Management  |
| 6            | Roberta Damstra  | Roberta     | Damstra    | 3            | VP Information Systems  | 0         | 2              | 1942-10-08  | 1994-12-01 00:00:00.0  | 25000.0  | 1              | Bachelors Degree  | M               | F       | Senior Management  |
+--------------+------------------+-------------+------------+--------------+-------------------------+-----------+----------------+-------------+------------------------+----------+----------------+-------------------+-----------------+---------+--------------------+
5 rows selected (0.603 seconds)

这样可以显示SQL的结果,并且还可以对本地的JSON文件进行SQL查询。

0: jdbc:drill:zk=local> SELECT * FROM dfs.`/Users/fuku68/employee.json`;
+--------------+---------------+-------------+------------+--------------+-----------------+-----------+----------------+-------------+------------------------+----------+----------------+------------------+-----------------+---------+--------------------+
| employee_id  |   full_name   | first_name  | last_name  | position_id  | position_title  | store_id  | department_id  | birth_date  |       hire_date        |  salary  | supervisor_id  | education_level  | marital_status  | gender  |  management_role   |
+--------------+---------------+-------------+------------+--------------+-----------------+-----------+----------------+-------------+------------------------+----------+----------------+------------------+-----------------+---------+--------------------+
| 1            | Sheri Nowmer  | Sheri       | Nowmer     | 1            | President       | 0         | 1              | 1961-08-26  | 1994-12-01 00:00:00.0  | 80000.0  | 0              | Graduate Degree  | S               | F       | Senior Management  |
+--------------+---------------+-------------+------------+--------------+-----------------+-----------+----------------+-------------+------------------------+----------+----------------+------------------+-----------------+---------+--------------------+
1 row selected (0.156 seconds)

可以在不对数据源进行架构定义的情况下执行SQL查询,如上所述。

对于 S3 数据源的查询

就像上述的例子一样,在Drill中,当指定数据源时,可以使用”cp”或”dfs”等作为FROM子句来指定。这被称为存储插件(Storage Plugin),它定义了数据源的查询位置。通过定义这个存储插件,可以对HBase、Hive、MongoDB、Kudu等数据源进行查询。因此,为了对S3的数据源进行查询,首先需要定义一个针对S3的存储插件。

如果在嵌入模式下启动Drill,同时也会启动Web服务器,那么可以通过访问http://localhost:8047,在浏览器中打开以下页面并通过浏览器操作Drill。

スクリーンショット 2017-12-18 8.23.31.png

当您从顶部菜单中选择[存储],会显示存储插件的列表。

スクリーンショット 2017-12-18 8.26.15.png

在Drill中,[Disables Storage Plugin]部分定义了用于S3的存储插件模板,所以从S3的[Update]按钮中打开存储插件的定义信息。

スクリーンショット 2017-12-18 8.31.33.png

定義信息采用JSON格式进行定义,并为了访问S3,将”connection”和”config”属性中的桶名、访问密钥和秘密密钥替换成以下信息,并从[启用]按钮保存和激活。

{

  "connection": "s3a://<バケット名>",
  "config": {
    "fs.s3a.access.key": "<アクセスキー>",
    "fs.s3a.secret.key": "<シークレットキー>"
  },

}

现在,可以使用S3的存储插件了。

スクリーンショット 2017-12-18 8.40.35.png

在实际情况中,我们将在S3上放置CSV数据并进行查询(在撰写本文时…)。

スクリーンショット 2017-12-18 8.47.02.png

对于上述的测试数据…

SELECT * FROM s3.`test_data.csv`;

当进行SQL查询时…

スクリーンショット 2017-12-18 8.54.32.png

在这个例子中,S3上的数据被展示出来了(本次是通过浏览器执行SQL来完成的)。

KMS的障碍

我在S3上的数据源上进行了查询,并且顺利地进行了下一步的查询,对业务数据感到满意。

スクリーンショット 2017-12-18 11.18.14.png

…嗯?
原来是使用KMS进行加密的…

我想知道KMS支持的Storage Plugin的配置项目,所以我进行了一些调查,发现当前版本不支持,详情请参考以下链接:
https://issues.apache.org/jira/browse/DRILL-5536

看起来Drill使用的Hadoop Jar是2.7版本,不支持,而从2.8版本开始支持…
所以对于加密的S3数据源,似乎需要自行构建。

Apache Drill的构建流程

我重新振作起来,从Drill的Github获取源代码。

$ git clone https://github.com/apache/drill.git
$ cd drill
$ vi pom.xml

当您获取源代码后,您需要在pom.xml中更改Hadoop的版本。

# 変更前
<hadoop.version>2.7.1</hadoop.version>

# 変更後
<hadoop.version>2.8.2</hadoop.version>

按照文档中所述进行构建。由于构建时间较长,请耐心等待。

$ mvn clean install -DskipTests

当构建完成后,”distribution/target”路径会生成一个tar.gz文件,解压并以嵌入模式启动后,可以对加密的数据源进行查询操作。

スクリーンショット 2017-12-18 12.44.58.png

一切無問題地顯示了結果。

结束

这次写的是关于如何通过Apache Drill查询S3上的KMS加密数据源的方法。
近年来,分布式处理的开源软件已经成为常态,作为技术人员,我们需要根据需要进行学习,并将其应用到我们的服务中。

广告
将在 10 秒后关闭
bannerAds