• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
导航菜单
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx
您的位置:首页 > 服务器 >云计算 > Hive作为Mondrian的数据源,hivemondrian

Hive作为Mondrian的数据源,hivemondrian

作者:网友 字体:[增加 减小] 来源:互联网

本文主要包含mondrian,piet mondrian,mondrian教程,mondrian什么意思,蒙德里安 mondrian等服务器相关知识,网友希望可以进行参考

Hive作为Mondrian的数据源,hivemondrian


      项目中的报表系统使用开源的mondrian和saiku作为工具实现的,现在自己又不得不去熟悉OLAP这一块的东西,首先要面对的就是mondrian这一座大山,听他们之前的开发人员介绍说mondrian里面会有很多坑,尤其是性能问题,在之前自己的测试过程中自己也遇到了一些问题,但是当时没怎么记录过了一两个月就差不多忘记怎么解决的了。       不过当时对于mondrian的慢还是深有体会的,至于他是怎么实现的我也没有看过源代码,只是通过查看执行结果发现的,我使用的数据源是官方提供的foodmart数据库,在之前的文章中介绍了如何生成这些数据和如何将这些数据导入到hive中,然后我在自己的测试集群上搭了伪分布式的集群,使用mondrian分别将mysql和hive作为数据源进行测试,一个MDX查询mysql可以几秒钟查到的结果,在hive中整整跑了半个小时,当时观察着hive的history记录发现每一个sql都会跑一个甚至多个mapreduce任务,至于原因嘛,我觉得首先mondrian生成的sql就是比较多的,我记录mysql的查询记录发现一个MDX查询会生成大概18条SQL查询,其中不乏group by和join之类的查询,因为mondrian没有对底层数据源进行优化(我认为),所以对于mysql和hive生成的SQL理论上是一样的(没有进行比较),所以这些冗长的SQL拖慢了整个查询的速度;其次hive不是mysql那样的面向TPS的数据库,它是面向吞吐量的,所以每一个SQL查询的响应时间是很久的,通过观察发现生成的这些SQL是顺序执行的,为什么不慢呢!       虽然慢,但是先实功能再说其他的吧,之前测试hive的过程中记得自己对hive的jdbc源码进行了修改,主要是修改了一些hive在实现jdbc中没有实现但是抛出异常的接口,而mondrian会调用这些接口导致下面的流程走不下去了,整体的修改应该说还是比较简单的。另外一个问题是当时的hive是没有使用任何认证机制的,包括hadoop也是没有认证机制的,现在在公司的hadoop集群上跑需要使用kerberos认证,这一块自己还不熟悉,还只是知道怎么用,所以还需要恶补了一下关于kerberos认证的知识。
      之前的准备工作已经做好了,首先我已经测试了使用mysq作为数据源使用mondrian作为MDX查询引擎的流程、然后记录了如果生成mondrian的foodmart数据以及如何将数据到导入到hive中,另外,还有如何部署hive的hiveserver2,然后使用jdbc连接这个server。万事俱备,只欠东风了。       首先既然hiveserver是用了kerberos认证的,其实它是一个代理服务器,使用代理用户hive代理其他用户提交mapreduce任务和执行HDFS操作,所以在代码中首先需要使用kerberos认证,认证的流程如下:
              Configuration conf = new Configuration();
              conf.setBoolean( "hadoop.security.authorization" , true);
              conf.set( "hadoop.security.authentication" , "kerberos" );
              UserGroupInformation. setConfiguration(conf);
               try {
                     UserGroupInformation. loginUserFromKeytab("intern/bigdata", "C:\\Users\\Administrator\\Desktop\\intern.keytab" );
              } catch (IOException e) {
                      // TODO Auto-generated catch block
                     e.printStackTrace();
              }

    初始化了kerberos之后,接下来需要指定hive的jdbc驱动器,在使用mysql的时候貌似没有指定,但是mondrian并没有官方支持hive的版本(其实mondrian只是支持提供了jdbc接口的数据源),所以需要在代码的开始指定hive数据源
           try {
             Class. forName("org.apache.hive.jdbc.HiveDriver");
           } catch (ClassNotFoundException e) {
             e.printStackTrace();
           }

然后再将连接mysql时指定的olap4j的url,其中只需要替换了Jdbc部分换成hive的的jdbc的url,替换之后的url如下:
       Connection connection = DriverManager. getConnection("Provider=mondrian;" +
               "Jdbc=jdbc:hive2://bitest0.server.163.org:10000/foodmart;principal=hive/app-20.photo.163.org@HADOOP.HZ.NETEASE.COM;" +
               "Catalog=http://db-53.photo.163.org:16161/cube/queryxml/60548;"
               + "DynamicSchemaProcessor=mondrian.i18n.NrptLocalizingDynamicSchemaProcessor;"
               + "Locale=zh_CN",
              null);

    建立好了连接,接下来就可以执行一条mdx查询,需要注意的是这里的Catalog是一个url而不是文件了,因为这个url是我们项目中提供下载cube定义的xml文件,因此也可以看到在Catalog参数中只需要指定能够获取xml文件的地址就可以了,无论是一个url还是本地文件路径。接着执行如下的MDX查询:
       Query query = connection.parseQuery( "SELECT NON EMPTY {Hierarchize({[时间].[年份].Members})} ON COLUMNS, "
                     + " NON EMPTY {[Measures].[销售总额]} ON ROWS FROM [TestFoodMart]");
       Result result = connection. execute(query);
       PrintWriter pw = new PrintWriter(System.out);
       result.print(pw);
       pw.flush();

这样应该就可以了,但是还是出现了这样的错误:
Caused by: org.apache.thrift.transport.TTransportException: Peer indicated failure: Unsupported mechanism type PLAIN
       at org.apache.thrift.transport.TSaslTransport.receiveSaslMessage(TSaslTransport.java:190)
       at org.apache.thrift.transport.TSaslTransport.open( TSaslTransport.java:288)
       at org.apache.thrift.transport.TSaslClientTransport.open(TSaslClientTransport.java:37)
       at org.apache.hive.jdbc.HiveConnection.openTransport(HiveConnection.java:203)
       ... 20 more

    这是提示我使用的验证方式不对,因为服务端使用的是kerberos认证而客户端没有,但是我分明已经在url里面里面加上了principal这个参数了啊,尝试了一下直接连接hive但是jdbc的url不加principal这个参数,果然出现了相同的错误,这也就是说这个principal没有生效,为什么呢? 通过观察olap4j的url发现它正好是使用";"分割的,而principal和前面的hiveserver的服务器端口号之间也使用的是";"分割,查看了hiveserver2的文档发现原来在使用kerberos认证的时候必须使用这种方式的url(host:port;principal=xxx),这就有点纠结了,mondrian里面把";"当成了分隔符,就会只把前面的host:ip作为jdbc的url了,当然连接出现错误了啊。 也尝试过使用properties参数创建连接,但是尝试都失败了,因为hive的url必须将principal和host:port用";"分割,之后只有查看一下源代码如何对mondrian的url进行分割的,创建连接是在mondrian.olap.DriverManager类的静态函数getConnection完成的,该函数如下:
45     public static Connection More ...getConnection(
46         String connectString,
47         CatalogLocator locator)
48     {
49         Util.PropertyList properties = Util.parseConnectString(connectString);
50         return getConnection(properties, locator);
51     }

2729    public static PropertyList More ...parseConnectString(String s) {
2730        return new ConnectStringParser(s).parse();
2731    }

    在Util.parseConnectString函数中对url进行划分,划分之后的结果使用key:value的形式保存在一个List<Pair>中,pair的first为key,second为value,可想而知在解析的时候是根据"="作为key和value的分割符,使用";"作为一个key:value对直接的分隔符。     在ConnectStringParser类中有如下几个函数:parsePair(解析一个key:value对,分为解析key和解析value两部分)、parseName(解析一个pair的key)、parseValue(解析一个pair的value)和parseQuoted(解析特殊符号),在因为这个url是作为jdbc这个key的value,查看parseValue这个函数发现了如下的代码:
2830            if (c == '"' || c == '\'') {
2831                String value = parseQuoted(c);
2832                // skip over trailing white space
2833                while (i < n && (c = s.charAt(i)) == ' ') {
2834                    i++;
2835                }
2836                if (i >= n) {
2837                    return value;
2838                } else if (s.charAt(i) == ';') {
2839                    i++;
2840                    return value;
2841                } else {
2842                    throw new RuntimeException
  


 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Hive作为Mondrian的数据源,hivemondrian

相关文章

  • Hadoop之——分布式集群安装过程简化版,hadoop集群简化版
  • Docker(1):Virtualbox Install Centos7 &amp; Docker,dockervirtualbox
  • 通过 Web Service 调用Pentaho BI 的API,pentahobi
  • 【hadoop】 3002-mapreduce程序统计单词个数示例,hadoopmapreduce
  • hive grouping sets 和 cube 用法,hivegrouping
  • Hadoop向HDFS写入、删除、读取文件,
  • 数学定理证明机械化的中国学派(I),机械化学派
  • hadoop学习---2.cygwin及sshd安装配置,---2.cygwinsshd
  • CDH安装官方教程,cdh官方教程
  • input from 表单提交 使用 属性 disabled=&quot;disabled&quot; 后台接收不到name=&quot;username&quot;的值,disabledusername

文章分类

  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx

最近更新的内容

    • Understanding Cubert Concepts 之 BLOCK(一),cubertconcepts
    • Docker exec与Docker attach,dockerexecattach
    • [Hive]HBaseIntegration:通过Hive读写HBase,
    • 二分Kmeans的java实现,二分kmeansjava
    • Java MapReduce详解--(3),mapreduce详解
    • [Spark源码剖析] DAGScheduler划分stage,sparkdagscheduler
    • 启动Hive的时候有很多WARN和INFO信息,hivewarninfo信息
    • AWS EC2 调整云主机根卷大小,awsec2
    • OpenStack Kilo新特性解读和分析(1),openstackkilo
    • error: internal error: unable to execute QEMU command &#39;migrate&#39;: this feature or command is not cur,qemumigrate

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有