【问题标题】:Hive -- split data across filesHive——跨文件拆分数据
【发布时间】:2013-05-08 20:28:16
【问题描述】:

有没有办法指示 Hive 将数据拆分为多个输出文件?或者可能限制输出文件的大小。

我打算使用Redshift,它建议将数据拆分成多个文件以允许并行加载http://docs.aws.amazon.com/redshift/latest/dg/t_splitting-data-files.html

我们在 hive 中预处理所有数据,我想知道是否有一种方法可以创建 10 个 1GB 的文件,这可能会使复制到 redshift 的速度更快。

我正在查看 https://cwiki.apache.org/Hive/adminmanual-configuration.htmlhttps://cwiki.apache.org/confluence/display/Hive/Configuration+Properties 但我什么也找不到

【问题讨论】:

    标签: amazon-web-services hive elastic-map-reduce amazon-redshift


    【解决方案1】:

    有几种方法可以拆分 Hive 输出。第一种也是最简单的方法是设置减速器的数量。由于每个都减少了对自己输出文件的写入,因此您指定的 reducer 的数量将对应于写入的输出文件的数量。请注意,某些 Hive 查询不会产生您指定的减速器数量(例如,SELECT COUNT(*) FROM some_table 总是产生一个减速器)。要指定 reducer 的数量,请在查询之前运行:

    set mapred.reduce.tasks=10
    

    您可以拆分为多个输出文件的另一种方法是让 Hive 将查询结果插入到分区表中。这将导致每个分区至少有一个文件。为此,您必须有一些合理的列进行分区。例如,您不想在唯一的 id 列上进行分区,或者每个记录都有一个文件。这种方法将保证每个分区至少输出文件,最多numPartitions * numReducers。这是一个例子(不要太担心hive.exec.dynamic.partition.mode,需要设置它才能让这个查询起作用)。

    hive.exec.dynamic.partition.mode=nonstrict
    
    CREATE TABLE table_to_export_to_redshift (
      id INT,
      value INT
    )
    PARTITIONED BY (country STRING)
    
    INSERT OVERWRITE TABLE table_to_export_to_redshift
    PARTITION (country)
    SELECT id, value, country
    FROM some_table
    

    要获得更细粒度的控制,您可以编写自己的 reduce 脚本以传递给 hive 并将该 reduce 脚本写入多个文件。一旦你编写了自己的 reducer,你几乎可以做任何你想做的事情。

    最后,您可以放弃尝试操纵 Hive 输出所需数量的文件,并在 Hive 完成后自己将它们分开。默认情况下,Hive 将未压缩的表以纯文本形式存储在其仓库目录中(例如,/apps/hive/warehouse/table_to_export_to_redshift)。您可以使用 Hadoop shell 命令、MapReduce 作业、Pig,或者将它们拉入 Linux 并按照您的喜好将它们分开。

    我对 Redshift 没有任何经验,因此无论出于何种原因,我的一些建议可能不适合 Redshift 使用。

    几点注意事项:将文件拆分为更多、更小的文件通常对 Hadoop 不利。您可能会获得 Redshift 的速度提升,但如果文件被 Hadoop 生态系统的其他部分(MapReduce、Hive、Pig 等)使用,如果文件太小,您可能会看到性能损失(尽管 1GB 就可以了) .还要确保额外的处理/开发时间值得您为并行 Redshift 数据加载所节省的时间。

    【讨论】:

    • 您的示例没有进行任何分区。 CREATE TABLEINSERT OVERWRITE 命令都需要指定要使用的分区。
    • @libjack 感谢您的关注。上面固定。
    • mapred.reduce.tasks 是关键,但缺点是您无法直接控制文件的大小。要将数据分发给reducer,您可以将DISTRIBUTE BY field 子句添加到INSERT OVERWRITE DIRECTORY 查询,并将具有相同字段值的所有映射器结果发送到同一个reducer。您可能会使用它来利用您的数据。例如,我在收集超过 1 周的数据时使用了它;如果我设置mapred.reduce.tasks=7DISTRIBUTE BY date,我可以生成7个大小比较相似的文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    相关资源
    最近更新 更多