前言
Elasticsearch 是一个开源的分布式搜索和分析引擎,建立在 Apache Lucene 基础上。它提供了一个可扩展的、实时的搜索和分析平台,用于处理和分析大规模的结构化和非结构化数据。 在类实时读写与全文检索上有极大的优势。
Hive 是一个基于 Hadoop 的数据仓库工具,它提供了一种类似于 SQL 的查询语言(HiveQL)来进行数据分析和查询。Hive 的设计目标是为那些熟悉 SQL 的用户提供一种简单的方式来处理大规模的结构化和半结构化数据。
elasticsearch SQL
elasticsearch便于用户更加方便的进行数据查询,所以提供了SQL查询功能,其本质是将SQL语句解析为DSL语句进行执行并返回结果。elasticsearch SQL API仅支持group by,count,order by,having,limit等简单的函数,如果我们需要使用复杂SQL逻辑进行数据查询时,无法得到很好的支持。
外部表
Hive提供了一种外部表的功能,外部表只需要与数据存储位置上的现有数据建立关联,无需将数据移动至Hive存储库中进行存储,即可使用外部数据源。
创建外部表只需在创建表时使用 `EXTERNAL` 关键字指定表的类型。在以下样例中:我们在'LOCATION'参数指定了外部数据的存储位置。Hive 将使用该位置中的数据来填充外部表。
代码语言:sql复制CREATE EXTERNAL TABLE my_external_table (
column1 INT,
column2 STRING
)
LOCATION '/path/to/external/data';
elasticsearch外部表
借助于Hive强大且完善的类SQL能力,我们可以在Hive中通过创建elasticsearch外部表的方式来实现对elasticsearch集群数据的查询。极大程度降低了elasticsearch数据的查询门槛。
创建方式如下:
代码语言:javascript复制CREATE EXTERNAL TABLE IF NOT EXISTS ods.hive_elastic_table_test ( user_id string,
country string,
province string,
city string,
gender int
)
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler' TBLPROPERTIES(
'es.index.auto.create'='false', 'es.index.read.missing.as.empty'='true', 'es.nodes.wan.only'='true', 'es.nodes.discovery' = 'false',
'es.nodes' = 'IP',
'es.port' = '9200',
'es.read.metadata'='true',
'es.resource' = 'es_index/_doc',
'es.mapping.names' = 'user_id:user_id, country:country, province:province, gender:gender', 'es.net.http.auth.pass'= '',
'es.net.http.auth.user'= 'elastic-reader' )
;
INSERT OVERWRITE TABLE hive_elastic_table_test
SELECT a.user_id, a.country, a.province, a.city, a.gender FROM (
SELECT user_id
,country
,province
,city
,gender
FROM hs_user
) a;
在创建过程中,可能会出现以下报错:
代码语言:java复制Error: java.lang.RuntimeException: java.lang.NoClassDefFoundError: org/apache/commons/httpclient/HttpConnection Manager
at org.apache.hadoop.hive.ql.exec.mr.ExecMapper.map(ExecMapper.java:157) at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:453)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:175)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1844) at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:169)
Caused by: java.lang.NoClassDefFoundError: org/apache/commons/httpclient/HttpConnectionManager
at org.elasticsearch.hadoop.rest.commonshttp.CommonsHttpTransportFactory.create(CommonsHttpTransportFac
tory.java:40)
at org.elasticsearch.hadoop.rest.NetworkClient.selectNextNode(NetworkClient.java:99)
at org.elasticsearch.hadoop.rest.NetworkClient.<init>(NetworkClient.java:82)
at org.elasticsearch.hadoop.rest.NetworkClient.<init>(NetworkClient.java:58)
at org.elasticsearch.hadoop.rest.RestClient.<init>(RestClient.java:101)
at org.elasticsearch.hadoop.rest.RestService.createWriter(RestService.java:620)
at org.elasticsearch.hadoop.mr.EsOutputFormat$EsRecordWriter.init(EsOutputFormat.java:175)
at org.elasticsearch.hadoop.hive.EsHiveOutputFormat$EsHiveRecordWriter.write(EsHiveOutputFormat.java:59) at org.apache.hadoop.hive.ql.exec.FileSinkOperator.process(FileSinkOperator.java:762)
at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:897)
at org.apache.hadoop.hive.ql.exec.SelectOperator.process(SelectOperator.java:95)
at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:897)
at org.apache.hadoop.hive.ql.exec.TableScanOperator.process(TableScanOperator.java:130)
at org.apache.hadoop.hive.ql.exec.MapOperator$MapOpCtx.forward(MapOperator.java:148)
at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:547)
at org.apache.hadoop.hive.ql.exec.mr.ExecMapper.map(ExecMapper.java:148)
... 8 more
Caused by: java.lang.ClassNotFoundException: org.apache.commons.httpclient.HttpConnectionManager
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352) at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
... 24 more
FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
解决方法
代码语言:javascript复制cp hadoop/share/hadoop/tools/lib/commons-httpclient-3.1.jar hive/auxlib/
elasticsearch外部表的优势
1. 统一查询接口:Hive 提供了统一的SQL查询接口,使得可以使用标准的SQL语句来查询Elasticsearch的数据。不需要学习elasticsearch的查询语法,可以直接使用熟悉的 SQL 进行数据分析和查询。
2. 弹性扩展:通过Hive创建elasticsearch外部表,可以将elasticsearch 的数据与其他数据源进行联合查询。这样可以方便地在Hive中进行跨数据源的分析和聚合操作,实现更复杂的数据处理需求。
3. 数据格式转换:Hive支持对数据进行格式转换,可以将 Elasticsearch 中的数据转换为其他格式,如Parquet、ORC 等。这样可以提高数据的存储效率和查询性能。
4. 数据仓库集成:Hive 是一种常用的数据仓库工具,可以与其他数据仓库组件(如 Hadoop、Spark 等)进行集成。通过将 elasticsearch数据与其他数据源整合到 Hive 中,可以更好地管理和组织数据,并进行更复杂的数据处理和分析。
5. 安全性和权限控制:Hive 提供了灵活的安全性和权限控制机制,可以对elasticsearch外部表进行访问控制,保护数据的安全性。
注意事项:Hive中的某些高级特性(如事务、复杂数据类型等)可能无法与elasticsearch完全兼容。数据的一致性和实时性也需要根据具体的数据同步策略进行管理。
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!