为什么我的SparkSQL查询无法在HIVE返回数据的地方工作

时间:2016-04-21 16:41:04

标签: apache-spark hdinsight spark-hive

我有一堆存储在blob存储中的csv文件,其中包含如下记录:

2016-04-19 20:26:01.0299,+05:30,ecc84966-9bc0-4bef-9cd2-ad79c25be278,test001,178.03499442294,,Good
2016-04-19 20:26:02.0303,+05:30,ecc84966-9bc0-4bef-9cd2-ad79c25be278,test001,160.205223861246,,Good

我使用以下命令

创建了一个External Hive表
CREATE EXTERNAL TABLE my_history  (
DataTimestamp Timestamp, 
TimezoneOffset String, 
SystemGuid String, 
TagName String, 
NumericValue Double, 
StringValue String
)
PARTITIONED BY (year int, month int, day int, hour int) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n' 
STORED AS TEXTFILE LOCATION 'wasb://mycontainer@mystorage.blob.core.windows.net/';

并设法添加了许多分区,如下所示,为期一个月的数据

ALTER TABLE my_history ADD IF NOT EXISTS PARTITION (year=2016, month = 03, day= 16, hour=00)  LOCATION "Year=2016/Month=03/Day=16/Hour=00" 

表格中有 135,733,286条记录,至少是select count(*) from my_history的以下Hive查询所说的内容。

现在我有以下两个问题:

1。 Jupyter挂起

当我执行像hiveContext.sql("select count(*) from my_history").show()这样的查询时,我没有得到任何结果,甚至没有例外,因为从Hive运行相同的结果在经过很长时间说400+秒之后给了我135,733,286。

2。结果缓慢

我在Hive上尝试了一个简单的重复查询

SELECT 
                      my_history.DataTimestamp, 
                      my_history.TagName,
                      COUNT(*) as count,
                      MIN(my_history.NumericValue) as min_value,
                      MAX(my_history.NumericValue) as max_value
                   FROM 
                      default.my_history
                   WHERE 
                       my_history.TagName = 'test021'
                   GROUP BY
                      my_history.TagName,
                      my_history.DataTimestamp
                    HAVING 
                        count > 1;

返回结果需要接近450秒,我有点期望它在一小部分时间内返回结果,因为我的HDInsight群集上有近60个核心。再次从Jupyter运行它并没有发现任何结果,也没有多次运行相同的查询提高了性能,因为我已经读过Spark为下一个查询缓存rdd。

我在这里错过了什么?

由于 基兰

1 个答案:

答案 0 :(得分:0)

  1. 如果Yarn中没有资源为您的笔记本启动新的spark应用程序,Jupyter可能会挂起。在这种情况下,Jupyter将等待资源可用。其他笔记本电脑的其他火花应用程序可能会消耗资源。检查Yarn UI以查看是否有其他应用程序正在运行,以及是否有可用资源。您可以从此UI中终止其他应用程序。或者在笔记本电脑的情况下,您可以使用Jupyter“运行笔记本”UI关闭它们。

  2. 慢查询可能是由许多问题引起的。首先要检查的是确保您的spark应用程序使用Yarn中的所有可用内核。在Preview中,笔记本提供了大约25%的资源。您可以使用%% configure命令更改该分配。将核心数设置为4,将执行程序数设置为15: %% configure -f

    {“name”:“remotesparkmagics-sample”,“executorMemory”:“12G”,“executorCores”:4,“numExecutors”:15} 这应该为您的应用程序提供所有60个内核。