我是Cognos的新手,并尝试使用Hive JDBC Driver在Hadoop之上创建报告。我能够通过JDBC连接到Hive,并且能够生成报告,但这里的报告运行速度非常慢。我在与DB2连接时做了同样的工作,数据与Hadoop相同。与Hive上的报告相比,报告运行得非常快。我在Hadoop和DB2中使用相同的数据集,但无法弄清楚为什么Hadoop之上的报告非常慢。我以伪分布式模式安装Hadoop并通过JDBC连接。
我安装了以下版本的软件,
两者都安装在不同的系统中,Cognos放在Windows 7之上,Hadoop放在Red-Hat之上。
任何人都可以告诉我在设置Cognos或Hadoop时可能出错的地方。有没有办法在Hadoop之上加快Cognos中的报表运行时间。
答案 0 :(得分:1)
当您说您在伪分布式模式下安装Hadoop时,您是说您只在一台服务器上运行它吗?如果是这样,它永远不会像DB2那样快。 Hadoop和Hive旨在在群集和规模上运行。获得在集群中运行的3或4台服务器,您会发现可以开始在大型数据集上看到一些令人印象深刻的查询速度。
检查您是否允许Cognos查询服务访问超过默认内存量的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中使用直通SQL查询,并将其全部写在Hive的SQL中。我刚刚为一组仪表板做了这个,它需要一个包含500万行的事实表的前5个堆栈。对于5行,Cognos提取了所有500万行,然后在Cognos中对它们进行排名。这样做很多次,突然间Cognos会挣扎。通过直通查询,我可以使用Impala Rank()函数,只获得5行,比DB2在正确(但很小)的集群上运行时更快,更快。
Hive的另一个考虑因素是你是在Map Reduce上使用Hive还是在TEZ上使用Hive。从同事发现的情况来看,TEZ上的Hive在Mapos运行的查询类型上要比在Map Reduce上的Hive快得多。