上篇了解 hive 的一种查询优化方案,可以通过分区表尽量避免查询扫描全表,提高查询时效。这篇我们讨论使用另外一种优化手段 -把查询检索交给专业的组件去执行。
我们使用的整个 Hadoop 大数据生态架构如下图。Hadoop 生态是基于 HDFS ( Hadoop Distributed File System, 分布式文件系统) 文件系统之上,采用 Zookeeper 组件协调分布式服务(包括集群管理、节点注册发现等),采用 Yarn 进行资源管理和调度。再上层才是 hive、Pig 等高层查询分析组件。而相对于 Hadoop1.0 时期,2.0 整体架构变动不大,只是引入了 Tez,一款有向无环图 DAG(Directed Acyclic Graph) 的计算框架,引入了 Spark 流数据处理框架,底层架构基本一致。
Hadoop 1.0 生态架构
Hadoop 2.0 生态架构
MapReduce 与 Tez 分布式作业计算对比
我们再来看下 Yarn 是如何进行分布式计算资源管理
Yarn 资源管理器架构
Yarn 资源管理框架架构如上图,资源管理器最主要的两个组件:调度器(Scheduler)和应用管理器(ApplicationManager)。
调度器(Scheduler)负责根据相近的容量,队列等约束将资源分配给各种正在运行的应用程序。调度器是纯调度程序,因为它不执行应用程序状态的监视或跟踪。此外,由于应用程序故障或硬件故障,它无法保证重新启动失败的任务。调度器根据应用程序的资源需求执行其调度功能;它是基于资源 Container 的抽象概念,它包含内存、CPU、磁盘、网络等元素资源。
调度器具有可插入策略,该策略负责在各种队列、应用程序等之间对集群资源进行分区。当前的调度程序(如 CapacityScheduler 和 FairScheduler )是插件的一些示例。
应用管理器(ApplicationsManager)负责接受作业提交,协商第一个容器以执行特定于应用程序的 ApplicationMaster,并提供在失败时重新启动 ApplicationMaster 容器的服务。每个应用程序 ApplicationMaster 负责从调度程序协商适当的资源容器,跟踪其状态并监视进度。
综上,一条 Hive sql 除了要经过常规的客户端分析,sql 优化,还需要向 Yarn 资源管理框架提交任务,分配资源,创建 Contains ,执行 MapReduce 作业。这里较大一部分耗时是在创建任务、分配资源及提交作业上,所以 hive 一般在大数据处理中只用于离线数据分析、展示,那我们想做到数据实时检索查询该如何优化呢?这时候就想起一句话“专业的人干专业的事“,专业的数据检索分析引擎 - Elasticsearch (下称 "ES" )
ES 是一款分布式、RESTful 风格的搜索和数据分析引擎(官方网站:https://www.elastic.co/ )。 ES 作为高性能的数据分析引擎,其数据响应速度都是在毫秒级,同时其部署架构也是天然支持分布式集群,根据多副本 ( replicas ) 多分片 ( shards ) 的设计原理,其数据也是保证高可用。结合官方数据分析工具 Kibana 可快速分析展示数据结果,其数据呈现效果极其丰富。
了解这么多关于 Elasticsearch 的特性,也知道其能够加速数据检索。但现在的问题是,我们的大量数据是保存在 Hdfs 或者 Hive 中,那怎么把数据同步到 Elasticsearch 中呢,这就需要使用 ES 的官方 Hadoop 组件 Elasticsearch-Hadoop 连接器,下面就展示如何使用连接器将大数据导入到 ES 中。
- 引入我们需要的依赖 jar 包;
add jar elasticsearch-hadoop-xx.jar;
- 创建 ES 外部表,表结构的存储格式选择 “EsStorageHandler”,表配置里填写对应的 ES 索引名称(es.resource)、ES 集群节点信息(es.node、es.port)、ES 文档 id(es.mapping.id),如果你的 ES 集群节点有权限认证,还需要填写集群的账号。
create external table es_hadoop_connection(
user_id string,
user_name string,
hobby string,
address string,
create_time string
) STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES(
'es.mapping.id'='user_id',
'es.resource'='es_user_info/es_user_info',
'es.node'='127.0.0.1',
'es.port'='9200',
'es.index.auto.create'='true',
'es.net.http.auth.user'='admin',
'es.net.http.auth.pass'='admin'
);
- 通过查询语句导入数据,从 hive 中已有的数据表中查询导出数据,如果你的数据文件在 HDFS 文件系统上,可以创建 hive 外部表,而数据表 location 直接指定 HDFS 上的文件位置。在 ES 集群中就能查询到导入的数据。
INSERT OVERWRITE TABLE es_hadoop_connection
select
user_id,user_name,hobby,address,create_time
from user_info;
通过以上简单的几个步骤就可以将我们原本在 HDFS 或者 hive 中的数据导入到 Elasticsearch 中,后续就是如何在 ES 中查询分析我们的数据了,这将在以后的文章中详细讲解。