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 |
+--------------+------------------+-------------+------------+--------------+-------------------------+-----------+----------------+-------------+------------------------+----------+----------------+-------------------+-----------------+---------+--------------------+

| 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。

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

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

定義信息采用JSON格式进行定义,并为了访问S3,将”connection”和”config”属性中的桶名、访问密钥和秘密密钥替换成以下信息,并从[启用]按钮保存和激活。
{
"connection": "s3a://<バケット名>",
"config": {
"fs.s3a.access.key": "<アクセスキー>",
"fs.s3a.secret.key": "<シークレットキー>"
},
}
现在,可以使用S3的存储插件了。

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

对于上述的测试数据…
SELECT * FROM s3.`test_data.csv`;
当进行SQL查询时…

在这个例子中,S3上的数据被展示出来了(本次是通过浏览器执行SQL来完成的)。
KMS的障碍
我在S3上的数据源上进行了查询,并且顺利地进行了下一步的查询,对业务数据感到满意。

…嗯?
原来是使用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文件,解压并以嵌入模式启动后,可以对加密的数据源进行查询操作。

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