何时的文件可以进行“可分割”处理?

7

在使用Spark时,我有时会在HIVE表中遇到一个巨大的文件,有时又会尝试处理许多较小的文件。

我明白调整Spark作业的工作方式取决于文件是否是可分割的。在cloudera的这个页面中,它说我们应该意识到文件是否是可分割的:

… 例如,如果您的数据以几个大型不可分割的文件形式到达...

  1. 如何知道我的文件是否是可分割的?

  2. 如果文件是可分割的,如何知道要使用多少个分区?

  3. 如果我想要编写适用于任何HIVE表的代码,即上述两种情况之一,是更好地偏向于更多的分区吗?

1个回答

10

考虑到Spark接受Hadoop输入文件,看一下下面的图片。

只有bzip2格式的文件是可分割的,而其他格式如zlib、gzip、LZO、LZ4和Snappy格式都是不可分割的。

关于您的查询分区,分区不取决于您要使用的文件格式。它取决于文件中的内容 - 分区列的值,例如日期等。

enter image description here

编辑1: 请参阅此SE问答以及Spark读取压缩文件的此工作代码

JavaPairRDD<String, String> fileNameContentsRDD = javaSparkContext.wholeTextFiles(args[0]);
        JavaRDD<String> lineCounts = fileNameContentsRDD.map(new Function<Tuple2<String, String>, String>() {
            @Override
            public String call(Tuple2<String, String> fileNameContent) throws Exception {
                String content = fileNameContent._2();
                int numLines = content.split("[\r\n]+").length;
                return fileNameContent._1() + ":  " + numLines;
            }
        });
        List<String> output = lineCounts.collect();

编辑2:

LZO文件可以进行分割。

只要分割发生在块边界上,LZO文件就可以被分割。

有关更多详细信息,请参阅此文章


那么,如果默认的Hadoop文件不可分割,那么sc.textFile(<name-of-file>)如何在HDFS文件上仍然创建行的RDD?还是不会?我如何确定我的文件格式? - makansij
1
不可分割并不意味着文件无法被处理。它意味着数据本地性已经丢失。如果一个1 GB压缩的不可分割文件被存储在8个不同节点的8个块中,那么只会创建一个mapper来处理完整的不可分割文件。 - Ravindra babu
1
可分割的文件允许处理在多个工作节点上分布。对于不可分割的文件,我已经更新了答案。 - Ravindra babu
我对Java不是很熟悉,所以我正在慢慢理解你发布链接的SE问题。但是,在这个链接中,它建议对不可分割文件的RDD进行重新分区。所以,您必须是在说只有初始RDD受到“不可分性”的影响。之后,RDD可以被重新分区。正确吗? - makansij
1
LZO文件不可分割是错误的。它们是可以分割的,您只需要对它们进行索引。请参阅hadoop-lzo项目。 - markhor
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接