Cognos在Hive数据源上报告非常慢



我是Cognos新手,正在尝试使用Hive JDBC Driver在Hadoop之上创建报告。我能够通过JDBC连接到Hive,并且能够生成报告,但是这里的报告运行非常慢。我在连接DB2时做了同样的工作,数据与在Hadoop中相同。与Hive上的报告相比,报告运行得非常快。我在Hadoop和DB2中使用相同的数据集,但不明白为什么在Hadoop之上的报告非常慢。我以伪分布式方式安装Hadoop,并通过JDBC连接。

我安装了以下我使用的软件版本,

  • IBM Cognos 10.2.1 with fix pack 11,
  • Apache Hadoop 2.7.2,Apache Hive 0.12.

两者安装在不同的系统中,Cognos安装在Windows 7之上,Hadoop安装在Red-Hat之上。

谁能告诉我在设置Cognos或Hadoop时哪里可能出错?有没有办法在Hadoop之上的Cognos中加快报告的运行时间?

当你说你在伪分布式模式下安装Hadoop时,你是说你只在单个服务器上运行它吗?如果是这样,它永远不会像DB2一样快。Hadoop和Hive被设计为在集群上运行和扩展。在集群中运行3或4台服务器,您应该会发现您可以开始看到对大型数据集的一些令人印象深刻的查询速度。

检查是否允许Cognos Query Service访问超过其Java堆(http://www-01.ibm.com/support/docview.wss?uid=swg21587457)默认内存量的内存。我目前运行的初始大小为8Gb,最大值为12Gb,但仍然偶尔会超出这个值。

下一个问题,你会遇到的是,Cognos不知道Hive SQL的细节(或Impala,这是我正在使用)。这意味着任何非基本查询都将被转换为select from和group by。缺少的重要部分将是where子句,这意味着Cognos将尝试从Hive表中吸收所有数据,然后在Cognos中执行过滤,而不是将其传递给所属的Hive。Cognos知道如何编写DB2 SQL和所有细节,以便能够传递工作负载。

更复杂的查询,或者任何平台特定的函数等通常不会传递给Hive(日期函数,分析函数等),所以尝试构建你的数据和查询,以便它们在过滤器中被需要。

使用Hive查询日志监视Cognos正在运行的查询。还可以尝试添加字段到查询中,然后将该字段拖到过滤器中,而不是直接从模型拖到过滤器中。我发现这有助于让Cognos在where子句中包含过滤器。

另一个选择是在Report Studio中使用pass - through SQL查询,然后在Hive的SQL中编写它。我刚刚为一组仪表板完成了这一操作,该仪表板需要从具有500万行的事实表中获取前5行的堆栈。对于5行,Cognos提取所有500万行,然后在Cognos中对它们进行排序。多次执行此操作,Cognos就会突然出现问题。使用透传查询,我可以使用Impala Rank()函数,只得到5行,这要快得多,而且比DB2在一个适当的(但很小的)集群上运行要快得多。

Hive的另一个考虑因素是你是在Map Reduce上使用Hive还是在TEZ上使用Hive。一位同事发现,在处理Cognos运行的查询类型时,TEZ上的Hive要比Map Reduce上的Hive快得多。

最新更新