如何解决spark写hive慢的问题

原创 2016年05月31日 10:13:23

在使用spark写hive过程中,发现最耗时的部分是将产生的结果写入hive,举个例子,对3g*1G表的join来讲,将结果使用以下方式直接写入hive表需要超过半小时的时间:

dataframe.registerTempTable("result")

sql(s"""INSERT OVERWRITE Table $outputTable PARTITION (dt ='$outputDate') select * from result""")

而整个结果数据的产生只需要4分钟左右的时间,比如以下方式:将结果以textfile存入hdfs:

result.rdd.saveAsTextFile(output_tmp_dir)

由此可见,对hive的写入操作耗用了大量的时间。

 

对此现象的优化可以是,将文件存为符合hive table文件的格式,然后使用hive load将产生的结果文件直接move到指定目录下。代码如下:

result.rdd.map { r => r.mkString("\001") }.repartition(partitions).saveAsTextFile(output_tmp_dir)

sql(s"""load data inpath '$output_tmp_dir' overwrite into table $output partition (dt='$dt')""")

详解:

  1. result.rdd.map { r => r.mkString("\001") }.repartition(partitions).saveAsTextFile(output_tmp_dir):
    hive column默认分隔符在scala/java中的表示为“/001”,r.mkString("/001")既是将column以分隔符/001进行分割,hive在导入时会自动识别。
    repartition(partitions)是为了防止hdfs中产生大量小文件。partitions的设定与最终结果大小有关,一般是result_size/hdfs_block_size。
  2. sql(s"""load data inpath '$output_tmp_dir' overwrite into table $output partition (dt='$dt')""")
    此处使用hive load data命令,将hdfs文件load到hive表中。后台操作为直接将目录下的文件移到hive table所在目录,所以只是hdfs move数据的过程,执行非常快。 
  3. 需要注意的是,此处要求hive建表时,已textfile格式建表。orc的方式不支持。对orc的表,可以建立临时表使用textfile临时存储,然后用以下命令进行导入:
    sql(s"""load data inpath '$output_tmp_dir' overwrite into table $tmp_table partition (dt='$dt')""")
    sql(s"""INSERT OVERWRITE Table $outputTable PARTITION (dt ='$outputDate') select * from $tmp_table where dt='$dt'""") 
    在资源配置为--num-executors 20 --executor-cores 4,结果数据为1.8g的情况下,需要额外耗时50s。好处是结果数据使用列式、压缩方式存储,压缩比12.7左右。

使用优化后的方式,原有test case的耗时从半小时降到4分钟,效率提升明显。

Spark RDD(DataFrame) 写入到HIVE的代码实现

在实际工作中,经常会遇到这样的场景,想将计算得到的结果存储起来,而在Spark中,正常计算结果就是RDD。 而将RDD要实现注入到HIVE表中,是需要进行转化的。 关键的步骤,是将...
  • sparkexpert
  • sparkexpert
  • 2016年03月23日 17:04
  • 9246

Spark读写Hive

环境:CDH5.8,Spark:1.6.0;Hadoop:2.6.0,Intellij IDEA14 ,jdk1.8,sdk:2.10.6 ,maven:3.3.3;工程下载地址:1. Spark读取...
  • fansy1990
  • fansy1990
  • 2016年11月29日 22:42
  • 5178

spark 将dataframe数据写入Hive分区表

spark-sql dataframe 数据写入Hive分区表
  • zgc_sitech
  • zgc_sitech
  • 2016年12月29日 15:15
  • 4319

spark 1.3.0 将dataframe数据写入Hive分区表

从spark1.2 到spark1.3,spark SQL中的SchemaRDD变为了DataFrame,DataFrame相对于SchemaRDD有了较大改变,同时提供了更多好用且方便的API。 D...
  • mach_learn
  • mach_learn
  • 2015年04月03日 11:41
  • 5734

Spark读写Hive添加PMML支持

软件版本:CDH:5.8.0;Hadoop:2.6.0 ; Spark:1.6.0; Hive:1.1.0;JDK:1.7 ; SDK:2.10.6(Scala)目标:在Spark加载PMML文件处理...
  • fansy1990
  • fansy1990
  • 2016年12月03日 15:49
  • 2009

利用Spark将DataFrame、Hive数据写入Oracle

本篇博文的主要内容: 1、分析Spark读写Oracle方法 2、DataFrame数据写入Oracle 3、Hive数据写入Oracle       DataFrame是在Spark...
  • u011007180
  • u011007180
  • 2016年08月20日 17:59
  • 3562

通过Spark结合使用Hive和ORC存储格式

在这篇博客中,我们将一起分析通过Spark访问Hive的数据,主要分享以下几点内容:1.      如何通过Spark Shell交互式访问Spark2.      如何读取HDFS文件和创建一个RD...
  • jiangshouzhuang
  • jiangshouzhuang
  • 2016年09月19日 16:25
  • 5095

Spark RDD(DataFrame) 写入到HIVE的代码实现

在实际工作中,经常会遇到这样的场景,想将计算得到的结果存储起来,而在Spark中,正常计算结果就是RDD。 而将RDD要实现注入到Hive表中,是需要进行转化的。 关键的步骤,是将...
  • u010159842
  • u010159842
  • 2017年04月15日 19:13
  • 1620

利用Spark将DataFrame、Hive数据写入Oracle

本篇博文的主要内容: 1、分析Spark读写Oracle方法 2、DataFrame数据写入Oracle 3、Hive数据写入Oracle DataFrame是在Spark1.3.0中推出的新的a...
  • NASAXK
  • NASAXK
  • 2016年03月23日 15:18
  • 5133

一次实践:spark查询hive速度缓慢原因分析并以此看到spark基础架构

前一段时间数据挖掘组的同学向我返回说自己的一段pyspark代码执行非常缓慢,而代码本身非常简单,就是查询hive 一个视图中的数据,而且通过limit 10限制了数据量。 不说别的,先贴我的代码吧...
  • zhanyuanlin
  • zhanyuanlin
  • 2017年02月28日 12:01
  • 3613
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何解决spark写hive慢的问题
举报原因:
原因补充:

(最多只允许输入30个字)