基于Calcite Elasticsearch实现的SQL ON ES方案设想

29 篇文章 0 订阅
8 篇文章 0 订阅
基于Calcite Elasticsearch实现的SQL  ON ES方案设想

    一、方案的由来
        Elasticsearch是搜索的王者,其强大的DSL不让SQL,但缺少SQL的关键特性,如Join。ES的策略是紧紧拥抱Hadoop/Hive,Spark,有个ES-hadoop方案。Hadoop本身就很笨重,这和轻快的ES是背道而驰的。ES的主要方向目前还在搜索上,SQL也不是它的主要关注点。所以,可预见的一段时间内,SQL on ES只能通过开发或集成第三方软件来完成,如通过Presto或Drill的插件来实现。我们已经测试了Presto Elasticsearch Connector。我们认为,基于插件的方案难以充分发挥ES的性能优势。因此,我们提出了基于Calcite Elasticsearch实现的SQL  ON ES方案设想。
    二、方案论述 
        1、Apache Calcite
        Apache Calcite是面向Hadoop新的查询引擎,它提供了标准的SQL语言、多种查询优化和连接各种数据源的能力,除此之外,Calcite还提供了OLAP和流处理的查询引擎。正是有了这些诸多特性,Calcite项目在Hadoop中越来越引入注目,并被众多项目集成。

        Calcite之前的名称叫做optiq,optiq起初在Hive项目中,为Hive提供基于成本模型的优化,即CBO(Cost Based Optimizatio)。2014年5月optiq独立出来,成为Apache社区的孵化项目,2014年9月正式更名为Calcite。Calcite项目的创建者是Julian Hyde,他在数据平台上有非常多的工作经历,曾经是Oracle、 Broadbase公司SQL引擎的主要开发者、SQLStream公司的创始人和主架构师、Pentaho BI套件中OLAP部分的架构师和主要开发者。现在他在Hortonworks公司负责Calcite项目,其工作经历对Calcite项目有很大的帮助。除了Hortonworks,该项目的代码提交者还有MapR、Salesforce等公司,并且还在不断壮大。

        Calcite的目标是“one size fits all(一种方案适应所有需求场景),希望能为不同计算平台和数据源提供统一的查询引擎,以类似传统数据库的访问方式(SQL和高级查询优化)来访问Hadoop上的数据。

Apache Calcite具有以下几个技术特性

  • 支持标准SQL语言
  • 独立于编程语言和数据源,可以支持不同的前端和后端;
  • 支持关系代数、可定制的逻辑规划规则和基于成本模型优化的查询引擎;
  • 持物化视图(materialized view)的管理(创建、丢弃、持久化和自动识别);
  • 基于物化视图的Lattice和Tile机制,以应用于OLAP分析;
  • 支持对流数据的查询。

Adapters

        A schema adapter allows Calcite to read particular kind of data, presenting the data as tables within a schema.

    Cassandra adapter (calcite-cassandra)
    CSV adapter (example/csv)
    JDBC adapter (part of calcite-core)
    MongoDB adapter (calcite-mongodb)
    Spark adapter (calcite-spark)
    Splunk adapter (calcite-splunk)
    Eclipse Memory Analyzer (MAT) adapter (mat-calcite-plugin)

calcite-elasticsearch

        https://github.com/LeeBeomYong/calcite-elasticsearch


        2、elasticsearch-sql

        https://github.com/NLPchina/elasticsearch-sql

        3、SQL on Elasticsearch

        参考Calcite-elasticsearch、elasticsearch-sql,利用Elasticsearch插件机制,实现SQL on Elasticsearch方案。这样,在ES上实现了SQL,有以下几点优势:

         简化了系统架构;

         减少了数据在ES和Presto之间的传输时间;

         充分利用了ES的高性能、Calcite强大的SQL和内存列数据能力;

          提供了带有Join能力的ES JDBC Driver

    三、方案验证
        1、验证步骤:
         ES插件开发验证;
         Calcite-elasticsearch Adapter验证;
         SQL on Elasticsearch验证;
         with Join ES JDBC Driver验证

   四、里程碑事件      
         Apache Calcite  1.8.0 / 2016-06-13 Permalink

         这个版本加入了ElasticsearchDruid 适配器,支持ES 2.3.3版本。这进一步增加了SQL on ES方案的可行性。



         方案很美好,是否可行需要验证,验证结果,敬请等待。
使用基于Gradle的CalciteSQL测试库,您需要按照以下步骤进行操作: 1. 在您的Gradle项目中添加以下依赖项: ``` dependencies { testCompile group: 'org.apache.calcite', name: 'calcite-core', version: '1.22.0' testCompile group: 'org.apache.calcite', name: 'calcite-test', version: '1.22.0' } ``` 2. 在项目中创建一个名为“resources”的文件夹,并在其中创建一个名为“sql”的子文件夹。 3. 在“sql”文件夹中创建一个名为“schema.json”的文件,其中包含您要测试的SQL模式的定义。 4. 在“sql”文件夹中创建多个以“.sql”为扩展名的SQL测试文件。 5. 在测试类中编写测试代码,如下所示: ``` import org.apache.calcite.jdbc.CalciteConnection; import org.apache.calcite.schema.SchemaPlus; import org.apache.calcite.sql.parser.SqlParseException; import org.apache.calcite.sql.parser.SqlParser; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlSelect; import org.apache.calcite.tools.Frameworks; import org.apache.calcite.tools.FrameworkConfig; import org.apache.calcite.tools.Frameworks.ConfigBuilder; import org.apache.calcite.tools.ValidationException; import org.junit.BeforeClass; import org.junit.Test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.Properties; public class SqlTest { private static Connection connection; @BeforeClass public static void setUp() throws Exception { Properties info = new Properties(); info.setProperty("lex", "JAVA"); connection = DriverManager.getConnection("jdbc:calcite:", info); } @Test public void testSql() throws SqlParseException, ValidationException { String sql = "SELECT * FROM myTable"; SqlNode sqlNode = parse(sql); SqlSelect sqlSelect = (SqlSelect) sqlNode; SchemaPlus rootSchema = getRootSchema(); ConfigBuilder configBuilder = Frameworks.newConfigBuilder(); configBuilder.defaultSchema(rootSchema); FrameworkConfig frameworkConfig = configBuilder.build(); CalciteConnection calciteConnection = connection.unwrap(CalciteConnection.class); Statement statement = calciteConnection.createStatement(); ResultSet resultSet = statement.executeQuery(sql); // 测试结果验证 // ... } private static SqlNode parse(String sql) throws SqlParseException { SqlParser.Config config = SqlParser.configBuilder().setLex(Lex.JAVA).build(); SqlParser sqlParser = SqlParser.create(sql, config); return sqlParser.parseQuery(); } private static SchemaPlus getRootSchema() { SchemaPlus rootSchema = Frameworks.createRootSchema(true); // 添加模式定义 // ... return rootSchema; } } ``` 上述代码中,“testSql”方法是一个测试方法,它解析一个SQL查询并将其执行。您可以根据需要编写自己的测试逻辑。 6. 运行测试。您可以使用Gradle命令“gradle test”运行测试。 希望这能帮助您使用基于Gradle的CalciteSQL测试库进行测试。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值