开发者社区> 云hbase+spark> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Spark on Phoenix 4.x Connector:如何在Spark侧设置Phoenix参数

简介: 前言 X-Pack Spark可以使用Spark on Phoenix 4.x Connector直接对接Phoenix数据库,读取Phoenix数据表数据。有时在读取Phoenix时需要设置Phoenix的一些参数,例如Phoenix为了保障数据库的稳定性,默认开了索引包含,即查询Phoebe表必须要带上索引或者主键字段作为过滤条件。
+关注继续查看

前言

X-Pack Spark可以使用Spark on Phoenix 4.x Connector直接对接Phoenix数据库,读取Phoenix数据表数据。有时在读取Phoenix时需要设置Phoenix的一些参数,例如Phoenix为了保障数据库的稳定性,默认开了索引包含,即查询Phoebe表必须要带上索引或者主键字段作为过滤条件。此时Spark作为查询Phoenix数据库的客户端需要有传递参数的能力。本文就列举了Spark侧传递Phoenix参数的方法。
注意:本文的案例以X-Pack Spark和HBase SQL(Phoenix) 4.x作为背景。

案例描述

在Spark侧设置Phoenix的参数常见的有如下:

  1. phoenix.force.index,查询Phoenix的SQL语句中的过滤字段是否必须创建索引。本文以这个参数为例,具体使用方法见详细步骤。
  2. phoenix.no.index,是否不走索引。默认值为false,即查询语句会扫描索引表,如果过滤字段在索引表中;如果设置为true,则查询语句不会扫描索引表,即使过滤字段在索引表中。

详细步骤

提前在Phoenix中创建一张表,表的创建命令如下:

#创建语句
CREATE TABLE IF NOT EXISTS us_population (
   state CHAR(2) NOT NULL,
   city VARCHAR NOT NULL,
   population BIGINT
   CONSTRAINT my_pk PRIMARY KEY (state, city));
#插入数据语句  
UPSERT INTO us_population VALUES('NY','New York',8143197);
UPSERT INTO us_population VALUES('CA','Los Angeles',3844829);
UPSERT INTO us_population VALUES('IL','Chicago',2842518);
UPSERT INTO us_population VALUES('TX','Houston',2016582);
UPSERT INTO us_population VALUES('PA','Philadelphia',1463281);
UPSERT INTO us_population VALUES('AZ','Phoenix',1461575);
UPSERT INTO us_population VALUES('TX','San Antonio',1256509);
UPSERT INTO us_population VALUES('CA','San Diego',1255540);
UPSERT INTO us_population VALUES('TX','Dallas',1213825);
UPSERT INTO us_population VALUES('CA','San Jose',912332);

Phoenix表创建完毕后在Phoenix客户端运行如下查询SQL

select * from us_population where population = 912332

运行上面的SQL会报错,大致内容如下:

org.apache.phoenix.optimize.ForceIndexException: Default enable force index, please set phoenix.force.index=false to disable. The filters must be contains one index column at least.

意思是过滤条件必须包含至少一个索引字段,可以通过设置phoenix.force.index=false来关闭这个限制。
在Spark侧通过Spark on Phoenix 4.x Connectors读取Phoenix数据表也会有这个限制。下面介绍下在Spark侧如何设置Phoenix的参数。
1、通过Spark ThriftServer 执行SQL语句。
通过SQL语句的方式首先要在Spark侧创建一个Phoenix表的映射。建表语句如下:

CREATE TABLE spark_on_phoenix01 USING org.apache.phoenix.spark
OPTIONS (
'zkUrl' '${ZK链接地址}',
'table' 'us_population'
);

创建完毕后直接在Spark运行查询语句“select * from spark_on_phoenix01 where population = 912332”也会报相同的错误,此时可以通过set phoenix.force.index=false方法设置,如下:

select * from spark_on_phoenix01 where population=912332;
Error: java.lang.RuntimeException: org.apache.phoenix.optimize.ForceIndexException: ERROR 599 (42913): Default enable force index, please set phoenix.force.index=false to disable. The filters must be contains one index column at least. tableName=US_POPULATION (state=,code=0)
0: jdbc:hive2://ap-wz92zrkxow69379w8-master2-> set phoenix.force.index=false;
+----------------------+--------+--+
|         key          | value  |
+----------------------+--------+--+
| phoenix.force.index  | false  |
+----------------------+--------+--+
1 row selected (0.021 seconds)
0: jdbc:hive2://ap-wz92zrkxow69379w8-master2-> select * from spark_on_phoenix01 where population=912332;
+--------+-----------+-------------+--+
| STATE  |   CITY    | POPULATION  |
+--------+-----------+-------------+--+
| CA     | San Jose  | 912332      |
+--------+-----------+-------------+--+

注意:上述设置方法只在当前session有效。

2、通过写代码SparkSession调用SQL,代码如下:

//创建SparkSession
val sparkSession = SparkSession
      .builder()
      .enableHiveSupport()
      .appName("spark on phoenix4x")
      .getOrCreate()
//方法1:通过在sql中执行set phoenix.force.index=false 设置Phoenix参数
sparkSession.sql("set phoenix.force.index=false")
querySql = "select * from " + sparkTableName + " where population = 912332"
var result = sparkSession.sql(querySql)
result.show()

//方法2:通过在sparkSession的配置中设置 phoenix.force.index=false 设置Phoenix参数
sparkSession.sqlContext.setConf("phoenix.force.index", "false")
querySql = "select * from " + sparkTableName + " where population = 912332"
var result = sparkSession.sql(querySql)
result.show()

3、通过SparkSession.read获取Phoenix表数据,设置参数方法如下:

//初始化sparkSession时加入设置
val sparkSession = SparkSession
    .builder()
    .config("phoenix.force.index", false)
    .enableHiveSupport()
    .appName("spark on phoenix4x")
    .getOrCreate()

sparkSession
    .read
    .format("org.apache.phoenix.spark")
    .option("table", phoenixTableName)
    .option("zkUrl", zkAddress)
    .load()
    .show()

4、通过X-Pack Spark 控制台--conf传递参数。
通过控制传递参数的方法如下:

--conf spark.hadoop.phoenix.force.index=false

如下图:
image
注意:因为Spark获取--conf传递参数的机制会过滤“spark.hadoop”开头的参数,所以通过--conf设置的参数需要在参数前面加上“spark.hadoop.”,即完成的参数为spark.hadoop.phoenix.force.index=false。

小结

Spark 对接Phoenix 4.x 方法可以参考:Spark对接Phoenix4.x快速入门
X-Pack Spark详细介绍可参考:Spark 基本介绍
Phoenix 介绍可参考:HBase SQL(Phoenix) 4.x 使用说明

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【Spark Summit East 2017】从容器化Spark负载中获取的经验
本讲义出自Tom Phelan在Spark Summit East 2017上的演讲,Tom Phelan探讨了如何实现高可用性的分布式大数据应用和数据中心主机,并分享了学到的经验教训,并对于如何在一个可靠的、可伸缩的、高性能的环境将大数据应用程序容器化给出了一些提示。
1587 0
【Spark Summit East 2017】使用Spark MLlib和Apache Solr构建实时实体类型识别系统
本讲义出自Khalifeh Aljadda在Spark Summit East 2017上的演讲,由于实体查询系统中的查询一般比较短,所以由于缺少上下文信息,所以不适合使用传统的bag-of-words模型来确定实体类型,本讲义介绍了一个新颖的实体类型识别系统,该系统使用Spark MLlib和Apache Solr构建,能够结合不同来源的线索来分析出需要查询实体。
2145 0
【Spark Summit East 2017】可扩展性机器学习的特征哈希
本讲义出自Nick Pentreath在Spark Summit East 2017上的演讲,主要介绍了特征哈希是用于处理高维特性的一个功能强大的机器学习技术,特征哈希快速、简单、并且节约内存,而且适合在线学习场景,演讲中分享了特征哈希的基本功能,以及如何使用特征哈希在机器学习中的所有功能类型,并介绍了一个在Spark ML管道中使用的更加灵活和强大的转化器。
1994 0
【Spark Summit East 2017】构建于高维文档数据集上的基于时间戳的实时分析查询处理与预测模型
本讲义出自Debasish Das在Spark Summit East 2017上的演讲,主要介绍了对于LuceneDAO进行的扩展,允许其从文档术语的观点来使用时间戳进行搜索和时间过滤,演讲中展示了对于一整套查询生成的API,核心观点是通过理解如何使得 Lucene能够意识到在Spark中时间意识是非常重要的,进而构建交互式分析查询处理和时间序列预测算法。
1874 0
【Spark Summit East 2017】基于Spark构建的Netflix推荐ML Pipeline
本讲义出自Tsai在Spark Summit East 2017上的演讲,主要介绍了Netflix如何使用Apache Spark作为分布式计算框架以及机器学习技术来构建自己的算法来为8000万以上的用户进行个性化推荐,并介绍了在面对Netflix量级的用户带来的挑战中使用的技术和遇到的陷阱。
1548 0
【Spark Summit East 2017】大数据赋能机器学习
本讲义出自Jiao Wang与Yiheng Wang在Spark Summit East 2017上的演讲,在演讲中Jiao Wang与Yiheng Wang分享了Intel以及用户使用开源的Apache Spark分布式深度学习库BigDL构建的大数据机器学习应用。
1692 0
【Spark Summit East 2017】实时业务数据分析
本讲义出自Manish Gupta在Spark Summit East 2017上的演讲,当Redis作为分布式共享内存数据存储来进行类似时间序列数据范围查询分析的时候可以帮助Spark加速45倍。使用Redis的机器学习模型redis-ml将可以允许多应用程序同时使用相同的模型,并对于这些模型的分类和执行进行加速。
1478 0
【Spark Summit East 2017】现代化你的数据仓库的全新“Sparkitecture”
本讲义出自Myles Collins在Spark Summit East 2017上的演讲,主要介绍了面对数据管道增速,聚合和可视化成为一个简化的,自助的方式的挑战,很多组织开始越来越多地转向求助于Spark, Hadoop, Kafka的结合,并且证明了分析型数据库Vertica等关键实现技术是优化企业级数据仓库体系结构的关键。
1275 0
【Spark Summit East 2017】Cornami提升Spark性能与速度
本讲义出自Paul Master在Spark Summit East 2017上的演讲,主要介绍了CORNAMI公司的TruStream技术,一个以高密度处理器核心计算内存结构的新架构。演讲中介绍了如何将Spark集成到TruStream计算结构中来对于一般的Spark任务提供更高性能的计算处理能力,并介绍了目前在多服务器集群上构建的应用上如何使用TruStream与Spark提高算法速度,增加功能并且降低成本以及延迟。
1731 0
【Spark Summit East 2017】Spark中的容错:从生产实践中获取的经验
本讲义出自Jose Soltren在Spark Summit East 2017上的演讲,主要介绍了Spark容错中的螺母和螺栓,他首先简述了Spark中的各种容错机制,然后讨论了YARN上的Spark、调度与资源分配,在演讲中还对于一些用户案例进行了探讨研究并给出了一些需要的工具,最后分享了未来Spark中容错未来的发展方向比如调度器和检查点的变化。
1810 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
云HBaseSQL及分析 ——Phoenix&Spark
立即下载
GeoMesa on Spark SQL
立即下载
spark替代HIVE实现ETL作业
立即下载