Hadoop - 实时查询Drill
1.概述
在现实业务当中,存在这样的业务场景,需要实时去查询HDFS上的相关存储数据,普通的查询(如:Hive查询),时延较高。那么,是否存在时延较小的查询组件。在业界目前较为成熟的有Cloudera的Impala,Apache的Drill,Hortonworks的Stinger。本篇博客主要为大家介绍Drill,其他两种方式大家可以自行下去补充。
2.Drill Architecture
2.1 Cilent
使用Drill,可以通过以下方式进入到Drill当中,内容如下所示:
- Drill shell:使用客户端命令去操作
- Drill Web Console:Web UI界面去操作相关内容
- ODBC/JDBC:使用驱动接口操作
- C++ API:C++的API接口
2.2 Drill Query Execution
执行流程如下图所示:

2.3 Core Modules
核心模块图,如下所示:

至于详细的文字描述,这里就不多做赘述了。大家看图若是有疑惑的地方,可以去官方网站,查看详细的文档描述。[官方文档]
3.Drill使用
介绍完Drill的架构流程,下面我们可以去使用Drill去做相关查询操作。安装Drill的过程比较简单,这里就不多做详细的赘述了。首先,去Apache的官网下载Drill的安装包,这里笔者所使用的本版是drill-1.2.0。可独立部署在物理机上,不必与Hadoop集群部署在一起。这里需要注意的是,物理机的内存至少留有4G空闲给Drill去使用。不然,在执行查询操作的时候会内容溢出,查询Drill的官方文档,官方给出的解释是,操作的内容都在内容中完成,不会写磁盘,除非你强制指明去写磁盘,但是,一般考虑到响应速度因素,都会在内容中完成。笔者曾试图降低其内存配置小于4G,然并卵。所以,在使用Drill做查询时,需要保证物理机空闲内存大于等于4G。
目前,Drill迭代版本比较快速。大家在下载Drill版本的时候,可以多多留意下版本内容变化。
在解压Drill的压缩包后,在其conf文件夹下有一个drill-override.conf文件,这里我们在里面添加Web UI的访问地址,添加的内容我们可以在drill-override-example.conf模版文件中查找对应的内容。添加内容如下所示:
drill.exec: {
cluster-id: "drillbits1",
zk.connect: "dn1:2181,dn2:2181,dn2:2181",
http: {
enabled: true,
ssl_enabled: false,
port:
}
}
这里需要注意的是,Drill需要用ZK,这里笔者就直接使用Hadoop集群的ZooKeeper集群连接信息地址。在添加完内容后,可以使用以下命令启动。
./drillbit.sh start
启动之后,Web UI界面如下所示:
目前条件有限,只有单台物理机,所以只部署了单台Drill。若是,大家条件允许,可以查看官网文档去部署Cluster。Drill插件默认是没有HDFS的,需要我们主动去创建,默认只有以下插件,如下图所示:

这里,笔者已经配置过HDFS的插件,故上图出现HDFS插件信息,其配置信息如下所示:
{
"type": "file",
"enabled": true,
"connection": "hdfs://hadoop.company.com:9000/",
"workspaces": {
"root": {
"location": "/opt/drill",
"writable": true,
"defaultInputFormat": null
}
},
"formats": {
"csv": {
"type": "text",
"extensions": [
"csv"
],
"delimiter": ","
},
"tsv": {
"type": "text",
"extensions": [
"tsv"
],
"delimiter": "\t"
},
"parquet": {
"type": "parquet"
}
}
}
PS:这里要保证HDFS的地址信息正确。另外,Drill支持的存储介质较多,大家参考官方文档去添加对应的存储介质。
在添加HDFS插件之后,我们可以通过Web UI界面的查询界面进行文件查询,也可以使用Drill Shell命令在终端去查询。查询方式如下所示:
- Web UI查询命令:

- Web UI结果如下:

另外,其查询记录详情可以在Profiles模块下查看。如下图所示:
- Drill Shell查询:
./sqlline -u jdbc:drill:zk=dn1,dn2,dn3:
- Drill Shell 查询结果:

4.总结
这里,笔者做过一个性能测试比较,数量级分别为10W,100W,1000W的不重复数据,其响应时间依次递增。结果如下图所示:

通过测试结果可以看出,若是数量级在100W时,响应时间平均在秒级别,可以尝试用Drill去中OLTP业务。若是在1000W以上级别,显然这个延时做OLTP是难以接受的,这个可以去做OLAP业务。
5.结束语
这篇博客就和大家分享到这里,如果大家在研究学习的过程当中有什么问题,可以加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!
Hadoop - 实时查询Drill的更多相关文章
- SQL Server2016 新功能实时查询统计信息
SQL Server2016 新功能实时查询统计信息 很多时候有这样的场景,开发抱怨DBA没有调优好数据库,DBA抱怨开发写的程序代码差,因此,DBA和开发都成为了死对头,无法真正排查问题. DBA只 ...
- 实时查询引擎 - Facebook Presto 介绍与应用
1. Presto 是什么 Facebook presto是什么,继Facebook创建了HIVE神器后的又一以SQL语言作为接口的分布式实时查询引擎,可以对PB级的数据进行快速的交互式查询.它支 ...
- Druid:一个用于大数据实时处理的开源分布式系统——大数据实时查询和分析的高容错、高性能开源分布式系统
转自:http://www.36dsj.com/archives/28590 Druid 是一个用于大数据实时查询和分析的高容错.高性能开源分布式系统,旨在快速处理大规模的数据,并能够实现快速查询和分 ...
- 一步一步跟我学习lucene(19)---lucene增量更新和NRT(near-real-time)Query近实时查询
这两天加班,不能兼顾博客的更新.请大家见谅. 有时候我们创建完索引之后,数据源可能有更新的内容.而我们又想像数据库那样能直接体如今查询中.这里就是我们所说的增量索引.对于这种需求我们怎么来实现呢?lu ...
- Impala简介PB级大数据实时查询分析引擎
1.Impala简介 • Cloudera公司推出,提供对HDFS.Hbase数据的高性能.低延迟的交互式SQL查询功能. • 基于Hive使用内存计算,兼顾数据仓库.具有实时.批处理.多并发等优点 ...
- java定时器和实时查询数据库
定时器: Timer timer = new Timer(); timer.schedule(new TimerTask() { ...
- 基于Solr的HBase实时查询方案
实时查询方案 HBase+Solr+HBase-Indexer 1.HBase提供海量数据存储 2.solr提供索引构建与查询 3.HBase indexer提供自己主动化索引构建(从HBase到So ...
- PHP—— 商品物流实时查询接口 (快递100API对接)
PHP后台 与前端 对接商品物流信息的接口 运用的 快递100的API接口 public function getExpress() { $user_id = input('post.user_ ...
- PB级数据实时查询,滴滴Elasticsearch多集群架构实践
PB级数据实时查询,滴滴Elasticsearch多集群架构实践 mp.weixin.qq.com 点击上方"IT牧场",选择"设为星标"技术干货每日送达 点 ...
随机推荐
- 基于 IdentityServer3 实现 OAuth 2.0 授权服务【密码模式(Resource Owner Password Credentials)】
密码模式(Resource Owner Password Credentials Grant)中,用户向客户端提供自己的用户名和密码.客户端使用这些信息,向"服务商提供商"索要授权 ...
- SQLSERVER--定期清理维护作业的历史记录
刚删除一个数据库时,在清理数据库备份历史记录时,执行超过近10分钟还未完成,随时查了下,吓死宝宝啦,逻辑读操作竟然高达8000万次以上! 通过UI进行删除数据库时,会默认勾选上“删除数据库备份和还原历 ...
- [自娱自乐] 4、超声波测距模块DIY笔记(四)——终结篇·基于C#上位机软件开发
前言 上一节我们已经基本上把超声波硬件的发射和接收模块全部做好了,接下来我们着手开发一个软硬结合的基于C#的平面定位软件! 目录 一.整体思路 二.效果提前展示 2-1.软件部分展示 2-2.硬件部分 ...
- Arduino 端口通信实例
////////////////////////////////////////////////////////// //Arduino 1.0.x-----Arduino Uno----COM9 / ...
- Hibernate.initialize(Obj)用法
导读: 在使用hibernate进行持久化时,有时需要动态的改变对象的加载,比如在编辑页面里面lazy=true,而在浏览页面lazy=false,这样可以在需要lazy的地方才进行控制.而配置文件 ...
- HTML标签简明学习一
!-- ... -- html注释 浏览器不对其中的内容解析,可以用来调试及书写释意 <!-- 动不动就被注释 --> !DOCTYPE 声明文件类型 一般大写,必须位于文档首行,浏览器根 ...
- java继承3个小题
1.实现一个名为Person的类和它的子类Employee,Employee有两个子类Faculty和Staff.具体要求如下: (1)Person类中的属性有:姓名name(String类型),地址 ...
- JNI技术基础(1)——从零开始编写JNI代码
众所周知,Java程序的最大特点就是其跨平台的特性,编写的上层应用程序可以不加任何修改甚至不用重新编译而运行于不同的平台上,然而,Java本身也存着这一个弊端,那就是性能上相对要差一些,在对性能要求比 ...
- 通过MSSQl作业定时执行批处理BAT文件
前言 有些时候,我们可能会需要定时执行一下批处理来达到一定的目的,比如Oracle数据库的定时备份,当然Oracle也可以通过Rman实现定时备份.我们大多数的时候是通过操作系统的计划任务实现定时执行 ...
- uva111动态规划之最长公共子序列
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=74662#problem/C A B C D E C - Largest Rect ...