Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark,执行器加载/查询数据-性能非常低_Apache Spark - Fatal编程技术网

Apache spark Spark,执行器加载/查询数据-性能非常低

Apache spark Spark,执行器加载/查询数据-性能非常低,apache-spark,Apache Spark,我的用例如下: 通过saveAsTable将RDD写入文件(从而写入ORC文件)。每次保存都会创建新文件(因此1000 000writings给我1000 000ORC文件)。我知道,每个RDD都会创建新的ORC文件,这是很自然的。然而,我不知道为什么从ThriftServer查询它们时会这么慢 我的问题是:如何理解这种奇怪的行为? 例如,在1000 000行上选择COUNT(*)(因此相同的文件)大约需要1分钟(!)。 但是,当我将1000 000行保存到一个文件中时,相同的查询在50ms中工

我的用例如下:

通过
saveAsTable
RDD
写入文件(从而写入ORC文件)。每次保存都会创建新文件(因此
1000 000
writings给我
1000 000
ORC文件)。我知道,每个RDD都会创建新的ORC文件,这是很自然的。然而,我不知道为什么从ThriftServer查询它们时会这么慢

我的问题是:如何理解这种奇怪的行为?
例如,
在1000 000行上选择COUNT(*)
(因此相同的文件)大约需要
1分钟(!)。
但是,当我将
1000 000
行保存到一个文件中时,相同的查询在
50ms
中工作


我想了解这种差异。毕竟,
1000 000文件这是一个小数目。

计数操作的高级执行计划如下(假设您的文件位于分布式文件系统中,例如,我将使用HDFS):

  • 从HDFS NameNode请求文件

  • 将HDFS块加载到执行器中

  • 计算每个分区(使用ORC元数据或直接-取决于实现)并将所有分区相加
  • 一些估计:1000 000个文件需要相同数量的对NameNode的请求才能解析数据块的物理位置。它在<60秒内完成(每个请求<0.06毫秒)-NameNode做得很好。其余时间Spark将数据加载到内存(若需要)或/或从ORC元数据获取统计信息。所以我会分析NameNode(或者类似的服务,如果您使用S3或其他),它是第一个成为瓶颈的候选。来自ORC:

    例如,与RCFile格式相比,ORC文件格式有很多优点 优点包括:

    a single file as the output of each task, which reduces the NameNode's load
    
    当ORC试图减少文件数量时,您的代码却恰恰相反。及

    默认条带大小为250 MB。大条纹尺寸可实现大尺寸, 高效地读取HDFS

    文件页脚包含文件中的条纹列表,即 每个条带的行数,以及每列的数据类型。它还包含 列级聚合计数、最小值、最大值和总和


    因此,像count这样的简单统计数据是预先计算的,不应该成为性能问题。您可以尝试通过简单地向HDFS NameNode添加内存和CPU电源来解决一个问题,但我认为保留适量的文件是合理的。如果数据来自某个流源,则可以创建某种压缩作业,将小文件合并为大文件并定期运行。或者,作为替代方案,您可以每2-5分钟从源代码读取一次,如果这样的延迟对您的用例合适的话。

    使用a可能比使用赏金更好。可能是因为小文件问题?如果将它们保存到HDFS或S3