现因公司要使用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),现因为该公司不想动页面,不能发布带Session,所以升级版本,升级版本的步骤如下:
因为Phoenix官网不提供4.8版本以上编译好的jar包,所以需要自己下载,使用maven进行自己编译,至于开源的版本需要自己在网上搜索。我也再次分享一个,
注:我分享的是cdh版本的,只需要改为你需要的在pom文件中修改Cdh版本即可,如果你的是APache版本的,需要下载Apache版本的项目,
cdh.repo
https://repository.cloudera.com/artifactory/cloudera-repos
Cloudera Repositories
false
cdh.snapshots.repo
https://repository.cloudera.com/artifactory/libs-snapshot-local
Cloudera Snapshots Repository
true
false
cloudbees netty
http://repository-netty.forge.cloudbees.com/snapshot/
apache release
https://repository.apache.org/content/repositories/releases/
com.cloudera.cdh
cdh-root
5.10.0
5.10.0 处改为你的CDH版本的,如果是Apache版本的使用Apache的repository(https://repository.apche.com/artifactory/libs-snapshot-local)
1.2
${cdh.hive.version}
${cdh.hadoop.version}
${cdh.pig.version}
${cdh.jackson.version}
3.5.2
1.2.17
${cdh.slf4j.version}
2.5.0
1.6
2.1
2.5
1.2
1.0
1.1.9
13.0.1
${cdh.flume.version}
1.3.9-1
1.0-1
2.11
0.3
4.0.23.Final
1.7
3.2.0-incubating
3.2.2
1.6
2.1.2
1.8.0
8.1.7.v20120910
0.8.0-incubating
${cdh.spark.version}
2.10.4
2.10
注意,如果是CDH版本的只需要下载我分享的地址的项目,修改CDH的版本即可,如果是非我分享的项目,一定要修改跟你集群环境相类似的版本,不然会出错,而且有时候还需要注意hbase的版本号、Cdh的版本、Hbase属于cloudera的版本还是Apache的版本,这些都是要注意的 ,cloudera的hbase和Apache的hbase版本差别还是很大的,
由于cdh自带版本,你手动删除,cdh会定时检测,会恢复你删除的,需要在cdh配置界面卸载,位置如图所示
点击按钮parcel,会出现你集群所安装所有主键,找到你的phoenix组件,卸载,并删除,这个自己摸索哈,最后再重启的CDH集群,
hbase.table.sanity.checks
false
点击配置
选择高级
增加如下配置
首先进行配置,关于配置,版本不同,配置的也有所差异,如果想要准确,还是查看官网(http://phoenix.apache.org/secondary_indexing.html),关于博客,写的比较好的一篇也是翻译官网的,您将需要将以下参数添加到每个区域服务器上的hbase-site.xml:
您将需要将以下参数添加到每个区域服务器(regionServer)上的hbase-site.xml:
hbase.regionserver.wal.codec
org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec
上面的属性使定制的WAL编辑能够被写入,确保索引更新的正确写入/重播。这个编解码器支持通常的主机WALEdit选项,最显着的是WALEdit压缩。
hbase.region.server.rpc.scheduler.factory.class
org.apache.hadoop.hbase.ipc.PhoenixRpcSchedulerFactory
Factory to create the Phoenix RPC Scheduler that uses separate queues for index and metadata updates
hbase.rpc.controllerfactory.class
org.apache.hadoop.hbase.ipc.controller.ServerRpcControllerFactory
Factory to create the Phoenix RPC Scheduler that uses separate queues for index and metadata updates
hbase.master.loadbalancer.class
org.apache.phoenix.hbase.index.balancer.IndexLoadBalancer
hbase.coprocessor.master.classes
org.apache.phoenix.hbase.index.master.IndexMasterObserver
hbase.coprocessor.regionserver.classes
org.apache.hadoop.hbase.regionserver.LocalIndexMerger
这些配置也是在CDH的页面进行配置,配置完之后需要重新刷新配置并重启hbase,刷新后,要查看相关配置是否生效。(修改完刷新页面,点击实例按钮,会出翔提示:是否重启以使配置生效),
sqoop import --connect jdbc:mysql://199.29.0.4:3306/qkreport -username mysqlname -password mima --table table_name--fields-terminated-by '$' --target-dir /phoenix/
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“,