如何解决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查询hive速度缓慢原因分析并以此看到spark基础架构

前一段时间数据挖掘组的同学向我返回说自己的一段pyspark代码执行非常缓慢,而代码本身非常简单,就是查询hive 一个视图中的数据,而且通过limit 10限制了数据量。 不说别的,先贴我的代码吧...

如何使用zeppelin实现大数据可视化

Zeppelin是基于spark的数据可视化方案。支持scala语言,任何在spark上运行的job都可以在此平台上运行,此外支持对表数据的可视化。对数据源的可视化可以通过interpreter进行扩...
  • lulynn
  • lulynn
  • 2016年05月25日 15:28
  • 2539

Apache Zeppelin使用入门指南:编程

使用Apache Zeppelin   编译和启动完Zeppelin相关的进程之后,我们就可以来使用Zeppelin了。我们进入到页面,我们可以在页面上直接操作Zeppelin,依次选择Note...
  • LW_GHY
  • LW_GHY
  • 2016年05月21日 00:16
  • 2209

Spark SQL数据加载和保存实战

一:前置知识详解: Spark SQL重要是操作DataFrame,DataFrame本身提供了save和load的操作, Load:可以创建DataFrame, Save:把DataF...

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

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

spark 将dataframe数据写入Hive分区表

spark-sql dataframe 数据写入Hive分区表

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读取...

Spark 重分区函数:coalesce和repartition区别与实现,可以优化Spark程序性能

源码包路径: org.apache.spark.rdd.RDD coalesce函数: 方法注释: Return a new RDDthat is r...
  • Dax1n
  • Dax1n
  • 2016年12月02日 09:15
  • 3521

深入浅出数据仓库中SQL性能优化之Hive篇

摘要:Hive查询生成多个map reduce job,一个map reduce job又有map,reduce,spill,shuffle,sort等多个阶段,所以针对hive查询的优化可以大致分为...

android面试题笔试题总结

一、Android基本常识 1、写10个简单的linux命令 mkdir 创建文件夹 rmdir 删除文件夹 rm 删除文件 mv 移动文件 cp 拷贝文件...
  • angel_w
  • angel_w
  • 2017年07月31日 21:10
  • 242
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何解决spark写hive慢的问题
举报原因:
原因补充:

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