Phoenix的安装、升级版本、以及使用,以及所遇到的问题
2017-12-11 14:35
976 查看
现因公司要使用phoenix来实时查询,现公司的业务场景是一张表62个字段,数据量在千万级别,测试环境下的集群环境是4台机器,每台机器8CPU,内存28G,一个Master,四个cluster。CDH的版本CDH5.10.0。
在自己安装的过程中遇到的问题遇到好多问题,记录下来跟各位一起分享一下,文章中也有网上各位博客的引用,用到处有可能没有做引用出,望见谅,如果有问题可以相互交流(QQ:1064052448)。
首先CDH5.10.0版本所带的Phoenix版本为Phoenix4.7,但是Phoenix4.7不支持分页,如果分页只有两种方式,一种是采用Row
Value Constructors (RVC)的方式,其中官网地址(http://phoenix.apache.org/paged.html),官网看不懂的话,可以网上各种搜,再分享一个PHoenix分页博客(http://blog.csdn.net/berylfanzi/article/details/45459257),第二种方式是升级版本到Phoenix4.8版本及以上(支持OFFSET),现因为该公司不想动页面,不能发布带Sessi
4000
on,所以升级版本,升级版本的步骤如下:
因为Phoenix官网不提供4.8版本以上编译好的jar包,所以需要自己下载,使用maven进行自己编译,至于开源的版本需要自己在网上搜索。我也再次分享一个,
先去GitHub下载与你比较接近版本源码zip包(具体版本可以看pom文件),解压后导入到本地IDE.
注:我分享的是cdh版本的,只需要改为你需要的在pom文件中修改Cdh版本即可,如果你的是APache版本的,需要下载Apache版本的项目,
1.先修改repository下的依赖,让phoenix依赖CDH的repository而不依赖apache原生的,修改如下(有的项目是不需要修改的)
5.10.0 处改为你的CDH版本的,如果是Apache版本的使用Apache的repository(https://repository.apche.com/artifactory/libs-snapshot-local)
2.修改几个重要的依赖组件如hbase,flume,hadoop等版本依赖,如下图所示,全部修改成CDH的对应版本(CDH版本的不需要动)
注意,如果是CDH版本的只需要下载我分享的地址的项目,修改CDH的版本即可,如果是非我分享的项目,一定要修改跟你集群环境相类似的版本,不然会出错,而且有时候还需要注意hbase的版本号、Cdh的版本、Hbase属于cloudera的版本还是Apache的版本,这些都是要注意的 ,cloudera的hbase和Apache的hbase版本差别还是很大的,
第二步中修改完成后,直接在phoenix源代码根目录下执行mvn clean install -DskipTests后等待编译成功
随后可以去\phoenix-for-cloudera-4.9-HBase-1.2-cdh5.9\phoenix-assembly\target目录下查看结果,如下图
编译完成后,上面结果图中phoenix-4.9.0-cdh5.10.0.tar.gz是已经打包好解压,直接上传到hbase的集群上面
点击按钮parcel,会出现你集群所安装所有主键,找到你的phoenix组件,卸载,并删除,这个自己摸索哈,最后再重启的CDH集群,
上传到你的hbase集群的每个hbase的lib下面的,一般的路径为(cdh版本:/opt/cloudera/parcels/CDH-5.10.0-1.cdh5.10.0.p0.41/lib/hbase/lib),注意:只要是有habse的集群,都是需要上传的,然后在你的cdh的配置界面配置
点击配置
选择高级
增加如下配置
重启Hbase
./sqlline.py qkt-datacenter1:2181 其中qkt-datacenter1是我zookeeper上的一台机群,这个位置可以是IP,但是一定zookeeper中其中一台的集群或者IP,而不是本机,
进行测试offset可以使用,截图如下:
您将需要将以下参数添加到每个区域服务器(regionServer)上的hbase-site.xml:
通过确保索引更新的优先级高于数据更新,上述属性可防止在全局索引(HBase 0.98.4+和Phoenix 4.3.1+)的索引维护过程中发生死锁。它还通过确保元数据rpc调用比数据rpc调用具有更高的优先级来防止死锁。
从Phoenix 4.8.0开始,不需要更改配置就可以使用本地索引。在Phoenix 4.7及更低版本中,主服务器节点和区域服务器节点上的服务器端hbase-site.xml需要进行以下配置更改:
过程中所遇到的问题:
1.为什么我关联上hbase的表以后查询出错,order by、group by ,>,<统统报错,说什么类型不匹配,或者列的不存在???
我一开始是使用sqoop直接从mysql数据库导入到hbase里面,因为从mysql直接导入到hbase时不能先在hbase里面建表(建表的时候制定其cloumn类型),再导入前面你所建的表中,只能再导入的时候建表,这样在hbase里面所生成表的列都是varchar类型的,但是这时候你如果去phoenix的shell中建立表(表中含有非string的类型,例如:int、long、time等等)并关联hbase里面相应的表,当你在shell中进行查询的时候,如果你对非string(例如:int、long、time等等)的column进行操作的时候出错,这是因为你的数据底层就是按照varchar进行存储的,虽然你在phoenix中建表的column是非string的,但是他是不被hbase识别的,因为底层hbase存储的column就是varchar,
解决方案:在phoenix中创建你所需要的表,然后通过sqoop先把数据导入到hdfs上面,在通过phoenix通过的job把数据导入到phoenix的表中即可,下面列举出所做项目,以供大家参考:
从mysql数据库中的表数据导到hdfs(这个是全部导入)
从mysql数据库中的表数据导到hdfs(这个是增量导入)
参数说明:
--- t :表名
--- i :数据存储的位置:file:/// 代表本地, 上面的是hdfs
--- z: zookeeper集群
--- d : 你存储的数据的分隔符
2.phoenix采用的是global索引,其导入会自动更新索引,只有在数据量超大,导入时,索引有可能报错,这时候就需要来手动执行更新索引,创建索引的本质是建立hbase表,其详细规则可以查看网上文献,此处不再说说明;从mysql数据库中的表数据导到hdfs(这个是全部导入) a. 创建global索引,其分区情况会跟主表分区规则相同 b.加入创建一个按照column A desc 排序的索引,但是查找的时候如果按照 order by A asc
其速度会较慢,在140w级别数据、4个节点、20个分区,其速度在2s以上
3.Phoenix删除无法删除的表 在phoenix的shell中执行 DELETE from SYSTEM.CATALOG where TABLE_NAME =‘member_contract’;
4.phoenix中跟hbase一样,是区分大小写的,如果不带双引号(”)是自动转化为大写,而且跟hbase一样也从在空间的,然后在空间里面建表,列也是有列簇的,创建表的时候如果不加列簇,默认列簇为“0“,
在自己安装的过程中遇到的问题遇到好多问题,记录下来跟各位一起分享一下,文章中也有网上各位博客的引用,用到处有可能没有做引用出,望见谅,如果有问题可以相互交流(QQ:1064052448)。
首先CDH5.10.0版本所带的Phoenix版本为Phoenix4.7,但是Phoenix4.7不支持分页,如果分页只有两种方式,一种是采用Row
Value Constructors (RVC)的方式,其中官网地址(http://phoenix.apache.org/paged.html),官网看不懂的话,可以网上各种搜,再分享一个PHoenix分页博客(http://blog.csdn.net/berylfanzi/article/details/45459257),第二种方式是升级版本到Phoenix4.8版本及以上(支持OFFSET),现因为该公司不想动页面,不能发布带Sessi
4000
on,所以升级版本,升级版本的步骤如下:
Phoenix编译
因为Phoenix官网不提供4.8版本以上编译好的jar包,所以需要自己下载,使用maven进行自己编译,至于开源的版本需要自己在网上搜索。我也再次分享一个,
源码下载
先去GitHub下载与你比较接近版本源码zip包(具体版本可以看pom文件),解压后导入到本地IDE.注:我分享的是cdh版本的,只需要改为你需要的在pom文件中修改Cdh版本即可,如果你的是APache版本的,需要下载Apache版本的项目,
源码修改
1.先修改repository下的依赖,让phoenix依赖CDH的repository而不依赖apache原生的,修改如下(有的项目是不需要修改的)<repositories> <repository> <id>cdh.repo</id> <url>https://repository.cloudera.com/artifactory/cloudera-repos</url> <name>Cloudera Repositories</name> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>cdh.snapshots.repo</id> <url>https://repository.cloudera.com/artifactory/libs-snapshot-local</url> <name>Cloudera Snapshots Repository</name> <snapshots> <enabled>true</enabled> </snapshots> <releases> <enabled>false</enabled> </releases> </repository> <repository> <id>cloudbees netty</id> <url>http://repository-netty.forge.cloudbees.com/snapshot/</url> </repository> <repository> <id>apache release</id> <url>https://repository.apache.org/content/repositories/releases/</url> </repository> </repositories> <parent> <groupId>com.cloudera.cdh</groupId> <artifactId>cdh-root</artifactId> <version>5.10.0</version> <relativePath/> </parent>
5.10.0 处改为你的CDH版本的,如果是Apache版本的使用Apache的repository(https://repository.apche.com/artifactory/libs-snapshot-local)
2.修改几个重要的依赖组件如hbase,flume,hadoop等版本依赖,如下图所示,全部修改成CDH的对应版本(CDH版本的不需要动)
<!-- Dependency versions --> <commons-cli.version>1.2</commons-cli.version> <hive.version>${cdh.hive.version}</hive.version> <hadoop-two.version>${cdh.hadoop.version}</hadoop-two.version> <pig.version>${cdh.pig.version}</pig.version> <jackson.version>${cdh.jackson.version}</jackson.version> <antlr.version>3.5.2</antlr.version> <log4j.version>1.2.17</log4j.version> <slf4j.version>${cdh.slf4j.version}</slf4j.version> <protobuf-java.version>2.5.0</protobuf-java.version> <commons-configuration.version>1.6</commons-configuration.version> <commons-io.version>2.1</commons-io.version> <commons-lang.version>2.5</commons-lang.version> <commons-logging.version>1.2</commons-logging.version> <commons-csv.version>1.0</commons-csv.version> <sqlline.version>1.1.9</sqlline.version> <guava.version>13.0.1</guava.version> <flume.version>${cdh.flume.version}</flume.version> <findbugs-annotations.version>1.3.9-1</findbugs-annotations.version> <jcip-annotations.version>1.0-1</jcip-annotations.version> <jline.version>2.11</jline.version> <snappy.version>0.3</snappy.version> <netty.version>4.0.23.Final</netty.version> <commons-codec.version>1.7</commons-codec.version> <htrace.version>3.2.0-incubating</htrace.version> <commons-collections.version>3.2.2</commons-collections.version> <!-- Do not change jodatime.version until HBASE-15199 is fixed --> <jodatime.version>1.6</jodatime.version> <joni.version>2.1.2</joni.version> <avatica.version>1.8.0</avatica.version> <jettyVersion>8.1.7.v20120910</jettyVersion> <tephra.version>0.8.0-incubating</tephra.version> <spark.version>${cdh.spark.version}</spark.version> <scala.version>2.10.4</scala.version> <scala.binary.version>2.10</scala.binary.version>
注意,如果是CDH版本的只需要下载我分享的地址的项目,修改CDH的版本即可,如果是非我分享的项目,一定要修改跟你集群环境相类似的版本,不然会出错,而且有时候还需要注意hbase的版本号、Cdh的版本、Hbase属于cloudera的版本还是Apache的版本,这些都是要注意的 ,cloudera的hbase和Apache的hbase版本差别还是很大的,
源码编译
第二步中修改完成后,直接在phoenix源代码根目录下执行mvn clean install -DskipTests后等待编译成功随后可以去\phoenix-for-cloudera-4.9-HBase-1.2-cdh5.9\phoenix-assembly\target目录下查看结果,如下图
Phoenix部署与安装
编译完成后,上面结果图中phoenix-4.9.0-cdh5.10.0.tar.gz是已经打包好解压,直接上传到hbase的集群上面卸载原版本
由于cdh自带版本,你手动删除,cdh会定时检测,会恢复你删除的,需要在cdh配置界面卸载,位置如图所示点击按钮parcel,会出现你集群所安装所有主键,找到你的phoenix组件,卸载,并删除,这个自己摸索哈,最后再重启的CDH集群,
安装
找到你的编译好的phoenix-4.9.0-cdh5.10.0.tar.gz上传到你的hbase集群,解压你的jar包,我解压的位置为/usr/local,然后在你的phoenix的lib里面找到jar包phoenix-4.9.0-cdh5.9.1-server.jar上传到你的hbase集群的每个hbase的lib下面的,一般的路径为(cdh版本:/opt/cloudera/parcels/CDH-5.10.0-1.cdh5.10.0.p0.41/lib/hbase/lib),注意:只要是有habse的集群,都是需要上传的,然后在你的cdh的配置界面配置
安装 增加hbase-site.xml配置
<property> <name>hbase.table.sanity.checks</name> <value>false</value> </property>
CDH修改方法:
在集群管理页面点击Hbase,进入Hbase管理界面点击配置
选择高级
增加如下配置
重启Hbase
登录phoenix
./sqlline.py qkt-datacenter1:2181 其中qkt-datacenter1是我zookeeper上的一台机群,这个位置可以是IP,但是一定zookeeper中其中一台的集群或者IP,而不是本机,进行测试offset可以使用,截图如下:
创建索引
首先进行配置,关于配置,版本不同,配置的也有所差异,如果想要准确,还是查看官网(http://phoenix.apache.org/secondary_indexing.html),关于博客,写的比较好的一篇也是翻译官网的,您将需要将以下参数添加到每个区域服务器上的hbase-site.xml:您将需要将以下参数添加到每个区域服务器(regionServer)上的hbase-site.xml:
<property> <name>hbase.regionserver.wal.codec</name> <value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value> </property>上面的属性使定制的WAL编辑能够被写入,确保索引更新的正确写入/重播。这个编解码器支持通常的主机WALEdit选项,最显着的是WALEdit压缩。
<property> <name>hbase.region.server.rpc.scheduler.factory.class</name> <value>org.apache.hadoop.hbase.ipc.PhoenixRpcSchedulerFactory</value> <description>Factory to create the Phoenix RPC Scheduler that uses separate queues for index and metadata updates</description> </property> <property> <name>hbase.rpc.controllerfactory.class</name> <value>org.apache.hadoop.hbase.ipc.controller.ServerRpcControllerFactory</value> <description>Factory to create the Phoenix RPC Scheduler that uses separate queues for index and metadata updates</description> </property>
通过确保索引更新的优先级高于数据更新,上述属性可防止在全局索引(HBase 0.98.4+和Phoenix 4.3.1+)的索引维护过程中发生死锁。它还通过确保元数据rpc调用比数据rpc调用具有更高的优先级来防止死锁。
从Phoenix 4.8.0开始,不需要更改配置就可以使用本地索引。在Phoenix 4.7及更低版本中,主服务器节点和区域服务器节点上的服务器端hbase-site.xml需要进行以下配置更改:
<property> <name>hbase.master.loadbalancer.class</name> <value>org.apache.phoenix.hbase.index.balancer.IndexLoadBalancer</value> </property> <property> <name>hbase.coprocessor.master.classes</name> <value>org.apache.phoenix.hbase.index.master.IndexMasterObserver</value> </property> <property> <name>hbase.coprocessor.regionserver.classes</name> <value>org.apache.hadoop.hbase.regionserver.LocalIndexMerger</value> </property>这些配置也是在CDH的页面进行配置,配置完之后需要重新刷新配置并重启hbase,刷新后,要查看相关配置是否生效。(修改完刷新页面,点击实例按钮,会出翔提示:是否重启以使配置生效),
过程中所遇到的问题:
1.为什么我关联上hbase的表以后查询出错,order by、group by ,>,<统统报错,说什么类型不匹配,或者列的不存在???
我一开始是使用sqoop直接从mysql数据库导入到hbase里面,因为从mysql直接导入到hbase时不能先在hbase里面建表(建表的时候制定其cloumn类型),再导入前面你所建的表中,只能再导入的时候建表,这样在hbase里面所生成表的列都是varchar类型的,但是这时候你如果去phoenix的shell中建立表(表中含有非string的类型,例如:int、long、time等等)并关联hbase里面相应的表,当你在shell中进行查询的时候,如果你对非string(例如:int、long、time等等)的column进行操作的时候出错,这是因为你的数据底层就是按照varchar进行存储的,虽然你在phoenix中建表的column是非string的,但是他是不被hbase识别的,因为底层hbase存储的column就是varchar,
解决方案:在phoenix中创建你所需要的表,然后通过sqoop先把数据导入到hdfs上面,在通过phoenix通过的job把数据导入到phoenix的表中即可,下面列举出所做项目,以供大家参考:
从mysql数据库中的表数据导到hdfs(这个是全部导入)
sqoop import --connect jdbc:mysql://199.29.0.4:3306/qkreport -username mysqlname -password mima --table table_name--fields-terminated-by '$' --target-dir /phoenix/
从mysql数据库中的表数据导到hdfs(这个是增量导入)
sqoop import --connect jdbc:mysql://199.29.0.4:3306/qkreport -username mysqlname -password mima --table tablename --fields-terminated-by '$' --where "id>1517965" --check-column 'Id' --incremental append --last-value 1517965 --m 1 --target-dir /phoenix/--Hdfs导入phoenix
cd /usr/local/PHOENIX4.9/ hadoop jar phoenix-4.9.-phoenix1.3.0-client.jar org.apache.phoenix.mapreduce.CsvBulkLoadTool -t 'table' -i /phoenix/part* -z qkt-datacenter1,qkt-datacenter2,qkt-datacenter3 -d '$'
参数说明:
--- t :表名
--- i :数据存储的位置:file:/// 代表本地, 上面的是hdfs
--- z: zookeeper集群
--- d : 你存储的数据的分隔符
2.phoenix采用的是global索引,其导入会自动更新索引,只有在数据量超大,导入时,索引有可能报错,这时候就需要来手动执行更新索引,创建索引的本质是建立hbase表,其详细规则可以查看网上文献,此处不再说说明;从mysql数据库中的表数据导到hdfs(这个是全部导入) a. 创建global索引,其分区情况会跟主表分区规则相同 b.加入创建一个按照column A desc 排序的索引,但是查找的时候如果按照 order by A asc
其速度会较慢,在140w级别数据、4个节点、20个分区,其速度在2s以上
3.Phoenix删除无法删除的表 在phoenix的shell中执行 DELETE from SYSTEM.CATALOG where TABLE_NAME =‘member_contract’;
4.phoenix中跟hbase一样,是区分大小写的,如果不带双引号(”)是自动转化为大写,而且跟hbase一样也从在空间的,然后在空间里面建表,列也是有列簇的,创建表的时候如果不加列簇,默认列簇为“0“,
相关文章推荐
- 2016 cocoapods的安装和使用以及版本升级遇到的问题
- 2016 cocoapods的安装和使用以及版本升级遇到的问题
- 2016 cocoapods的安装和使用以及版本升级遇到的问题 [转]
- 2016 cocoapods的安装和使用以及版本升级遇到的问题
- 2016 cocoapods的安装和使用以及版本升级遇到的问题
- 2016 cocoapods的安装和使用以及版本升级遇到的问题
- 2016 cocoapods的安装和使用以及版本升级遇到的问题
- 2016 cocoapods的安装和使用以及版本升级遇到的问题
- 详解2016 cocoapods的安装和使用以及版本升级遇到的问题
- 2016 cocoapods的安装和使用以及版本升级遇到的问题
- cocoapods的安装和使用以及版本升级遇到的问题
- 2016 cocoapods的安装和使用方法以及版本升级遇到的问题
- 2016 cocoapods的安装和使用以及版本升级遇到的问题
- 关于VisualSVN安装以及使用时所遇到的问题
- Cocoa pods的安装使用以及过程中可能会遇到问题的汇总
- windows下安装python basemap时使用Visual Studio编译geos时遇到的问题以及解决方法
- 关于VisualSVN安装以及使用时所遇到的问题
- CocoaPods版本升级遇到问题以及解决方案
- pligg9.7beta的后HTML编辑器插件的安装(tinymce_2_1_1_1)(以及使用中遇到的点滴问题解决办法)
- 关于VisualSVN安装以及使用时所遇到的问题