暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Hive中操作Phoenix,对比Hive查询Hbase

暴走大数据 2020-07-20
1113

点击上方蓝色字体,选择“设为星标”

回复”资源“获取更多惊喜

来源:http://suo.im/6kDoDq
作者:王义凯_Rick

大数据技术与架构
点击右侧关注,大数据开发领域最强公众号!

暴走大数据
点击右侧关注,暴走大数据!

今天我们尝试在hive中查phoenix。也就是hbase-->Phoenix-->hive这样的链路。

环境

    CDH-6.3.1
    Hive-2.1.1
    Phoenix-5.0.0
    Hbase-2.1.0

    hive集成phoenix仅支持hive使用mapreducetez引擎,不支持spark引擎;
    如果启用了kerberos,需要使用同时有hivehbase权限的用户;

    依赖

    需要在hive中添加phoenix的jar包依赖,下面的命令是在hive命令行里session级别生效的,如果想全局生效可参考上面的hive操作ES的文章里的内容。phoenix-version-hive.jar包可以在$PHOENIX_HOME/lib下找到。

      add jar /home/tools/wyk/phoenix-5.0.0-cdh6.2.0-hive.jar;

      验证

      在hive中建phoenix内表

      在hive中创建Phoenix内部表,hive会管理结构和数据,会自动在phoenix建表,删除hive表的时候对应的Phoenix表也删除。

        -- 在hive中创建Phoenix内部表,hive会管理结构和数据,会自动在phoenix建表,删除hive表的时候对应的Phoenix表也删除:
        create table default.phoenix_hive_create_internal (
        s1 string,
        i1 int,
        f1 float,
        d1 double
        )
        STORED BY 'org.apache.phoenix.hive.PhoenixStorageHandler'
        TBLPROPERTIES (
        "phoenix.table.name" = "phoenix_hive_create_internal",
        "phoenix.zookeeper.quorum" = "uathd01,uathd02,uathd03",
        "phoenix.zookeeper.znode.parent" = "/hbase",
        "phoenix.zookeeper.client.port" = "2181",
        "phoenix.rowkeys" = "s1, i1",
        "phoenix.column.mapping" = "s1:s1, i1:i1, f1:f1, d1:d1",
        "phoenix.table.options" = "SALT_BUCKETS=10, DATA_BLOCK_ENCODING='DIFF'"
        );

        在hive中建完Phoenix内表之后可以看到在phoenix中和hbase中都自动创建了一张表PHOENIX_HIVE_CREATE_INTERNAL

        从hive往phoenix插入数据

        不支持spark引擎

          --修改执行引擎
          set hive.execution.engine=mr;

          --在hive中插入一条记录
          insert into default.phoenix_hive_create_internal values('wyk',1,2.3412,3.14);

          查看hbase和phoenix端是否同步了该数据:

            --hbase
            scan "PHOENIX_HIVE_CREATE_INTERNAL"
            --phoenix
            select * from "PHOENIX_HIVE_CREATE_INTERNAL";

            从Phoenix插入数据,在hive端查看

              --phoenix端 插入一条数据
              upsert into "PHOENIX_HIVE_CREATE_INTERNAL" values('csdn',2,8.66,7.555);

              select * from "PHOENIX_HIVE_CREATE_INTERNAL";
                --hive端验证能否看到phoenix端插入的记录
                select * from default.phoenix_hive_create_internal ;

                在Hive中对Phoenix的数据进行更新

                官方文档上说不支持在hive中对phoenix表进行update和delete操作,但是我们可以执行insert命令,只要主键与phoenix表的相同就会自动更新。

                例:

                  --准备一条记录用做更新
                  insert into default.phoenix_hive_create_internal values('csdn',3,0.222,0.1114);

                  --再次插入一条记录,主键与phoenix的相同,这里的是s1和i1组合键,更新f1字段
                  insert into default.phoenix_hive_create_internal values('csdn',3,0.888,0.1114);

                  如果在hive中对phoenix表执行update或delete 命令会报下面的错误:

                    --不支持update delete
                    update default.phoenix_hive_create_internal set f1=0.888 where i1=3;
                    delete from default.phoenix_hive_create_internal  where i1=3;
                    FAILED: SemanticException [Error 10294]: Attempt to do update or delete using transaction manager that does not support these operations.

                    "Hive on Phoenix" VS "Hive on Hbase"

                    hive读phoenix和hive读hbase的性能对比:


                    首先在hive中建一个hbase外表,然后建一个phoenix外表,将hive表的数据同时写入hbase表和phoenix表,然后对比在hive中查询hbase和phoenix的性能。


                    hive建hbase外表和phoenix外表以及数据准备的步骤先略过了,在之前的文章和本篇上面已经有过示例代码,我们直接看表:

                      Hive shell
                      --hive表
                      select count(1) from tbl_doc_record;
                      result: 565343
                      --hbase外表
                      select count(1) from default.hbase_tbl_doc_record;
                      result: 565343

                      --phoenix外表
                      select count(1) from default.phoenix_tbl_doc_record;
                      result: 565343

                      对比phoenix客户端查出来的结果一致都是565343条记录: 

                      尝试了几个SQL,使用hive查询phoenix和hbase的性能几乎一致,直接在phoenix里查询性能远超在impala中查询hive表。很奇怪为什么使用hive查询phoenix就慢了呢,下面根据Phoenix上的方式修改配置。


                      提升Hive查询Phoenix的性能:


                      按官方的说法,设置下面两个参数后,在Hive shell中对phoenix表的查询速度跟在phoenix client中查询一样,但尝试之后发现在hive中查询phoenix表的速度跟查hbase表差不多,就是很慢,但是在phoenix client查刚才从hive建的表就很快,尝试修改了好几个参数都没能成功,希望有小伙伴尝试成功了能跟我同步一下,谢谢。

                        Hive Shell:
                        set hive.exec.parallel=true;
                        set hive.fetch.task.conversion=more ;

                        当前版本的限制

                        • 暂不支持在Hive中对Phoenix表进行更新update和删除delete。但是可以通过insert的时候主键相同会实现更新操作,和hive操作ES类似。

                        • 字段映射不到rowkey列。

                        • mapreduce和tez引擎仅支持一个reducer。

                        欢迎点赞+收藏
                        欢迎转发至朋友圈


                        文章转载自暴走大数据,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                        评论