【发布时间】:2017-04-25 17:42:33
【问题描述】:
我正在努力将一个非常大的数据库同步到 hive。
有 2 个问题:(1) 文本导入速度较慢,并且大型 mapreduce 步骤较慢。 (2) 序列文件要快得多,但不能通过正常方式读取。
详情如下:
(1) 如果我们将数据作为文本导入,它会更慢。文件累积在主目录的临时文件夹中,但最终会创建一个相当慢的 mapreduce 作业。
17/04/25 04:18:34 INFO mapreduce.Job: Job job_1490822567992_0996 running in uber mode : false
17/04/25 04:18:34 INFO mapreduce.Job: map 0% reduce 0%
17/04/25 11:05:59 INFO mapreduce.Job: map 29% reduce 0%
17/04/25 11:20:18 INFO mapreduce.Job: map 86% reduce 0% <-- tends to hang a very long time here
(为简洁起见,删除了很多行。)
(2) 如果我们将文件作为序列文件导入,速度会快得多,但 Hive 无法读取检索到的数据,因为它需要了解自动生成的 Java 文件。这也有一个 mapreduce 步骤,但它似乎走得更快(或者也许那是一天中的事情......)。
对于 sqoop 生成的每个表,我们都有一系列这些类: public class MyTableName 扩展 SqoopRecord 实现 DBWritable、Writable
使用这些类的步骤是什么?我们如何在蜂巢中安装它们?令人惊讶的是,Cloudera 支持工程师不知道,因为这一定是不经常绘制的领域?
sqoop import-all-tables --connect '...' --relaxed-isolation --num-mappers 7 --compress --autoreset-to-one-mapper --compression-codec=snappy --outdir javadir --as-sequencefile --hive-delims-replacement ' '
有什么建议吗?
【问题讨论】:
-
"sequencefiles ... Hive 无法读取检索到的数据,因为它需要了解创建的自动生成的 Java 文件" >> 这是什么废话? Hive 只需要一个适当的
CREATE TABLE命令来了解 SequenceFile 结构。这就是--hive-import的目的。 stackoverflow.com/questions/31515498/… -
另外,由于 Sqoop 生成一个 MapReduce 作业,使用 Snappy (或 LZ4) 压缩中间文件和 Snappy (或 LZ4,或 GZip)最终文件的压缩可能会对性能产生重大影响;参看。
mapreduce.map.output.compress*和mapreduce.output.fileoutputformat.compress*在 -
Hive 导入命令不适用于序列文件。
-
您是否考虑过使用 Spark 脚本来替代 Sqoop(毕竟,在 Spark 之前的时代,这只是 Cloudera 赞助的权宜之计)我>?作为奖励,您可以获得压缩的 Parquet 文件作为输出。
标签: java performance hadoop sqoop