[关闭]
@liyuj 2017-02-05T13:17:15.000000Z 字数 8638 阅读 3467

Apache-Ignite-1.8.0-中文开发手册

8.SQL网格集成

8.1.摘要

Ignite SQL网格定义了一套API,这样就方便了与Ignite核心模块不直接支持的各种工具、语言和技术进行集成,最常见的,Ignite的JDBC和ODBC驱动就是用于这个目的。本章的内容就包含了有关研究如何利用这样的工具或者产品接入Ignite集群以及处理数据的入门向导。

8.2.Apache Zeppelin

8.2.1.摘要

Apache Zeppelin,是一个支持交互式数据分析的基于Web的笔记本,它可以用SQL,Scala以及其他的工具来生成漂亮的数据驱动的,交互式以及可协同的文档。
Zeppelin通过Ignite的SQL解释器可以从缓存中获得分布式的数据,此外,当SQL无法满足需求时Ignite解释器可以执行任何的Scala代码。比如,可以将数据注入缓存或者执行分布式计算。

8.2.2.Zeppelin安装和配置

为了通过Ignite解释器启动,需要用2个简单的步骤来安装Zeppelin:

  1. 克隆Zeppelin的Git仓库:
  1. git clone https://github.com/apache/incubator-zeppelin.git
  1. 从源代码构建:
  1. cd incubator-zeppelin
  2. mvn clean install -Dignite-version=1.7.0 -DskipTests

用指定的Ignite版本构建Zeppelin
在构建Zeppelin时可以通过ignite-version属性来指定Ignite的版本,需要使用1.7.0以及之后的版本。

添加Ignite解释器
Ignite和Ignite解释器默认已经在Zeppelin中配置了。另外也可以将如下的解释器类名加入相应的配置文件或者环境变量中(可以参照Zeppelin安装向导的配置章节)。

一旦Zeppelin安装配置好了,可以用如下的命令来启动:

  1. ./bin/zeppelin-daemon.sh start

然后可以在浏览器中打开启动页(默认的启动页地址是 http://localhost:8080).
Apache Zeppelin start page
也可以参照Zeppelin安装文档.

8.2.3.配置Ignite解释器

点击Interpreter菜单项,这个页面包含了所有的已配置的解释器组的设置信息。向下滚动到Ignite章节然后点击Edit按钮可以修改属性的值,点击Save按钮可以保存配置的变更,不要忘了配置变更后重启解释器。
Apache Ignite interpreters settings
配置Ignite SQL 解释器
Ignite SQL解释器只需要ignite.jdbc.url属性,他的值是JDBC连接地址,在后面的示例中会用到words缓存,因此像下面这样编辑ignite.jdbc.url属性:

  1. jdbc:ignite://localhost:11211/words

配置Ignite解释器
在大多数简单的场景中,Ignite解释器需要下述属性:

对于更复杂的场景,可以通过指向Ignite配置文件的ignite.config.url属性来自定义Ignite配置,注意如果定义了ignite.config.url属性,那么上述的属性都会被忽略。

8.2.4.使用Ignite解释器

启动Ignite集群
在使用Zeppelin之前需要启动Ignite集群,下载Ignite发行版然后解压压缩包:

  1. unzip apache-ignite-fabric-{version}-bin.zip -d <dest_dir>

示例是以一个单独的Maven工程的形式提供的,因此要启动运行只需要简单地导入<dest_dir>/apache-ignite-fabric-{version}-bin/pom.xml文件到喜欢的IDE中即可。
启动如下的示例:

现在已经准备好通过Zeppelin来访问Ignite集群了。
在Zeppelin中创建新的笔记
通过Notebook菜单项创建(或者打开已有的)笔记。
Creating new note
创建新的笔记之后需要再次点击Notebook菜单项来打开创建的笔记,点击笔记的名字可以对他重新命名,输入新的标题然后按下回车键。
New note
笔记创建之后就可以输入SQL语句或者Scala代码,通过点击Execute按钮来执行(蓝色三角形图标)。
New note with user defined name
使用Ignite SQL解释器
要执行SQL查询要使用%ignite.ignitesql前缀以及SQL语句,比如查询words缓存中最初的是个单词,可以使用如下的查询:

  1. %ignite.ignitesql select _val, count(_val) as cnt from String group by _val order by cnt desc limit 10

Using Ignite SQL interpreter
执行示例之后可以以表格或者图形的形式查看结果,可以通过点击相应的图标来切换视图。
SQL query result as table
SQL query result as graph
SQL query result as pie chart
使用Ignite解释器
要执行Scala代码片段需要使用%ignite前缀以及代码片段,比如可以在所有的单词中查询平均值,最小值以及最大值。

  1. %ignite
  2. import org.apache.ignite._
  3. import org.apache.ignite.cache.affinity._
  4. import org.apache.ignite.cache.query._
  5. import org.apache.ignite.configuration._
  6. import scala.collection.JavaConversions._
  7. val cache: IgniteCache[AffinityUuid, String] = ignite.cache("words")
  8. val qry = new SqlFieldsQuery("select avg(cnt), min(cnt), max(cnt) from (select count(_val) as cnt from String group by _val)", true)
  9. val res = cache.query(qry).getAll()
  10. collectionAsScalaIterable(res).foreach(println _)

Using Ignite interpreter
执行这个示例之后就可以看到Scala REPL的输出:
Scala REPL output

注意Ignite集群的Ignite版本以及Zeppelin的版本必须匹配。

8.3.Tableau

8.3.1.摘要

Tableau是一个聚焦于商务智能领域的交互式数据可视化工具。它使用ODBC API接入各种数据库和数据平台,然后分析里面的数据。
Ignite有自己的ODBC实现,这样就使从Tableau端接入Ignite成为可能,并且可以分析存储于分布式Ignite集群中的数据。

8.3.2.安装和配置

要从Tableau接入Ignite,需要进行如下操作:

上述步骤完成后,就可以接入集群然后分析数据了。

8.3.3.接入集群

  1. 启动Tableau应用,然后在Connect -> To a Server -> More...窗口中找到Other Databases (ODBC)配置;
  2. 点击Edit connection链接;
  3. 配置之前设定的DSN属性值,下面的示例中为:LocalApacheIgniteDSN,做完之后,点击Connect按钮;
  4. Tableau会试图验证这个连接,如果验证通过,Sign In按钮以及其他的与连接有关的字段就会变为可用状态,点击Sign In就会完成连接过程;

8.3.4.数据查询和分析

一旦成功建立了Ignite和Tableau之间的连接,就可以通过Tableau支持的各种方式对数据进行查询和分析,通过官方文档可以了解更多的细节。

8.4.PHP PDO

8.4.1.摘要

PHP提供了一个轻量级、一致的接口来访问数据库,叫做PHP数据对象-PDO,这个扩展依赖于若干特定数据库的PDO驱动,其中之一是PDO_ODBC,它可以接入任何实现了自己的ODBC驱动的数据库。
通过使用Ignite的ODBC驱动,从PHP应用中就可以接入Ignite集群,然后访问和修改数据,本文就会介绍如何达到该目的。

8.4.2.配置ODBC驱动

Ignite遵守ODBC协议,并且实现了自己的ODBC驱动,这个驱动会用于PHP的PDO框架接入Ignite集群。
查看本系列文档的ODBC部分,可以知道如何在目标系统上安装和配置这个驱动,安装完毕后,就可以进入下一个章节。

只能使用Ignite的1.8.0及以后的版本中的ODBC驱动,之前的版本不支持PHP的PDO框架。

8.4.3.安装和配置PHP PDO

要安装PHP,PDO以及PDO_ODBC驱动,可以看PHP的相关资源。

8.4.4.启动Ignite集群

PHP PDO准备就绪之后,就可以通过一个常规的配置启动Ignite集群,然后在PHP应用中接入集群并且查询和修改集群的数据。
首先,集群端已经起用了ODBC处理器,如何做呢,在每个集群节点的IgniteConfiguration中加入odbcConfiguration就可以了。
下一步,列出IgniteConfiguration中与特定数据模型有关的所有缓存的配置,因为之后要在PHP PDO端执行SQL查询,所有每个缓存的配置都需要包含一个QueryEntity的定义,可以查看有关SQL查询的文档,来了解有关QueryEntity和SQL查询的更多信息。
可以使用下面的配置模板启动一个Ignite集群:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:util="http://www.springframework.org/schema/util"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/util
  9. http://www.springframework.org/schema/util/spring-util.xsd">
  10. <bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
  11. <!-- Enabling ODBC. -->
  12. <property name="odbcConfiguration">
  13. <bean class="org.apache.ignite.configuration.OdbcConfiguration"></bean>
  14. </property>
  15. <!-- Configuring cache. -->
  16. <property name="cacheConfiguration">
  17. <list>
  18. <bean class="org.apache.ignite.configuration.CacheConfiguration">
  19. <property name="name" value="Person"/>
  20. <property name="cacheMode" value="PARTITIONED"/>
  21. <property name="atomicityMode" value="TRANSACTIONAL"/>
  22. <property name="writeSynchronizationMode" value="FULL_SYNC"/>
  23. <property name="queryEntities">
  24. <list>
  25. <bean class="org.apache.ignite.cache.QueryEntity">
  26. <property name="keyType" value="java.lang.Long"/>
  27. <property name="valueType" value="Person"/>
  28. <property name="fields">
  29. <map>
  30. <entry key="firstName" value="java.lang.String"/>
  31. <entry key="lastName" value="java.lang.String"/>
  32. <entry key="resume" value="java.lang.String"/>
  33. <entry key="salary" value="java.lang.Integer"/>
  34. </map>
  35. </property>
  36. <property name="indexes">
  37. <list>
  38. <bean class="org.apache.ignite.cache.QueryIndex">
  39. <constructor-arg value="salary"/>
  40. </bean>
  41. </list>
  42. </property>
  43. </bean>
  44. </list>
  45. </property>
  46. </bean>
  47. </list>
  48. </property>
  49. </bean>
  50. </beans>

8.4.5.从PHP端接入Ignite集群

要从PHP PDO端接入Ignite,需要正确地配置DSN,在下面的示例中,假定DSN名为LocalApacheIgniteDSN

注意,PHP PDO端必须配置使用DSN。

最后,都配置好之后,就可以在Ignite和PHP PDO应用之间相互连接了,可以像下面这样执行一些查询:
Insert

  1. <?php
  2. try {
  3. // Connecting to Ignite using pre-configured DSN.
  4. $dbh = new PDO('odbc:LocalApacheIgniteDSN');
  5. // Changing PDO error mode.
  6. $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  7. // Preparing query.
  8. $dbs = $dbh->prepare('INSERT INTO Person (_key, firstName, lastName, resume, salary)
  9. VALUES (?, ?, ?, ?, ?)');
  10. // Declaring parameters.
  11. $key = 777;
  12. $firstName = "James";
  13. $lastName = "Bond";
  14. $resume = "Secret Service agent";
  15. $salary = 65000;
  16. // Binding parameters.
  17. $dbs->bindParam(1, $key);
  18. $dbs->bindParam(2, $firstName);
  19. $dbs->bindParam(3, $lastName);
  20. $dbs->bindParam(4, $resume);
  21. $dbs->bindParam(5, $salary);
  22. // Executing the query.
  23. $dbs->execute();
  24. } catch (PDOException $e) {
  25. print "Error!: " . $e->getMessage() . "\n";
  26. die();
  27. }
  28. ?>

Update:

  1. <?php
  2. try {
  3. // Connecting to Ignite using pre-configured DSN.
  4. $dbh = new PDO('odbc:LocalApacheIgniteDSN');
  5. // Changing PDO error mode.
  6. $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  7. // Executing the query. The salary field is an indexed field.
  8. $dbh->query('UPDATE Person SET salary = 42000 WHERE salary > 50000');
  9. } catch (PDOException $e) {
  10. print "Error!: " . $e->getMessage() . "\n";
  11. die();
  12. }
  13. ?>

Select:

  1. <?php
  2. try {
  3. // Connecting to Ignite using pre-configured DSN.
  4. $dbh = new PDO('odbc:LocalApacheIgniteDSN');
  5. // Changing PDO error mode.
  6. $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  7. // Executing the query and getting a result set. The salary field is an indexed field.
  8. $res = $dbh->query('SELECT firstName, lastName, resume, salary from Person
  9. WHERE salary > 12000');
  10. if ($res == FALSE)
  11. print_r("Exception");
  12. // Printing results.
  13. foreach($res as $row) {
  14. print_r($row);
  15. }
  16. } catch (PDOException $e) {
  17. print "Error!: " . $e->getMessage() . "\n";
  18. die();
  19. }
  20. ?>

Delete:

  1. <?php
  2. try {
  3. // Connecting to Ignite using pre-configured DSN.
  4. $dbh = new PDO('odbc:LocalApacheIgniteDSN');
  5. // Changing PDO error mode.
  6. $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  7. // Performing query. Both firstName and lastName are non indexed fields.
  8. $dbh->query('DELETE FROM Person WHERE firstName = \'James\' and lastName = \'Bond\'');
  9. } catch (PDOException $e) {
  10. print "Error!: " . $e->getMessage() . "\n";
  11. die();
  12. }
  13. ?>
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注