您的位置:首页 > 其它

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编译

因为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“,


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: