Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.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
为什么Java中的Spark textFile读取.gz文件要比Scala中使用Spark shell慢得多_Java_Scala_Apache Spark - Fatal编程技术网

为什么Java中的Spark textFile读取.gz文件要比Scala中使用Spark shell慢得多

为什么Java中的Spark textFile读取.gz文件要比Scala中使用Spark shell慢得多,java,scala,apache-spark,Java,Scala,Apache Spark,我使用Spark shell(Spark 1.6.2)运行了一个非常简单的查询来计算一堆.gz文件上的行数,如下所示: sc.textFile("s3a://bucket-name/prod/data-source/2017-05-05/*/").count 2017-06-06 21:33:21信息SparkContext:58-从文本文件创建广播2,时间:28 2017-06-06 21:33:24信息文件输入格式:249-处理的总输入路径:1700 2017-06-06 21:33:24

我使用Spark shell(Spark 1.6.2)运行了一个非常简单的查询来计算一堆.gz文件上的行数,如下所示:

sc.textFile("s3a://bucket-name/prod/data-source/2017-05-05/*/").count
2017-06-06 21:33:21信息SparkContext:58-从文本文件创建广播2,时间:28 2017-06-06 21:33:24信息文件输入格式:249-处理的总输入路径:1700 2017-06-06 21:33:24信息SparkContext:58-开始工作:计数时间:28 2017-06-06 21:33:24信息SparkContext:58-从DAGScheduler的广播创建广播3。scala:1006 res1:Long=433733191

返回#需要不到10秒的时间

但是,当我在测试应用程序中使用Java编写相同的逻辑时,大约需要3分钟的时间:

new SparkContextFactory(appName).textFile("s3a://bucket-name/prod/data-source/2017-05-05/*/").count()
以下是输出打印输出的片段:

2017-06-06 22:40:20信息执行者:58-在0.0阶段运行任务195.0(TID 195) 2017-06-06 22:40:20信息HadoopRDD:58-输入拆分:s3a://bucket name/prod/data source/2017-05-05/20170505_1493980530/part-r-00095.gz:0+3732508 2017-06-06 22:40:20信息编码池:181-获得全新的解压器[.gz] 2017-06-06 22:40:21信息执行人:58-完成了0.0阶段的任务194.0(TID 194)。2336字节结果发送到驱动程序 2017-06-06 22:40:21信息执行者:58-在0.0阶段运行任务196.0(TID 196) 2017-06-06 22:40:21信息HadoopRDD:58-输入拆分:s3a://bucket name/prod/data source/2017-05-05/20170505_1493980530/part-r-00096.gz:0+3727204 2017-06-06 22:40:21信息编码池:181-获得全新的解压器[.gz] 2017-06-06 22:40:22信息执行人:58-完成了第0.0阶段的任务195.0(TID 195)。2336字节结果发送到驱动程序 2017-06-06 22:40:22信息执行者:58-在0.0阶段运行任务197.0(TID 197) 2017-06-06 22:40:22信息HadoopRDD:58-输入拆分:s3a://bucket name/prod/data source/2017-05-05/20170505_1493980530/part-r-00097.gz:0+3734183 2017-06-06 22:40:22信息编码池:181-获得全新的解压器[.gz] 2017-06-06 22:40:22信息执行人:58-完成了0.0阶段的任务196.0(TID 196)。2336字节结果发送到驱动程序

s3a://bucket name/prod/data source/2017-05-05/下有多个子文件夹,每个子文件夹有数百个.gz文件,每个文件大约4MB

让我困惑的是,为什么在这两种方式下会有如此多的时间差异?
如果有人能和你分享一些灯光,你会很感激吗?

当你在shell中跑步时,启动它后的第一件事是什么?Spark会进行一些缓存,因此如果不是全新的上下文,文件可能已经被加载。@puhlen在Spark Shell中,它不会被缓存,除非您手动加载并指定它被缓存。所以缓存在这里不起作用,因为我从未缓存过它。这也是我在启动spark shell后运行的第一条语句。事实并非如此,spark在洗牌阶段也会进行一些自动缓存。因此,很有可能,特别是在shell中工作时,在您没有意识到的情况下缓存东西。“我认为,如果你开始一个新的外壳,这是不可能发生的,所以这可能不是它。”普伦谢谢,这是真的。刚刚发现问题。这是因为只有驱动程序正在加载文件,而不是9个工人。奇怪的是,我提交了集群模式,为什么只有驱动程序工作?好的,问题解决了。虽然我在提交Java作业时将spark驱动程序地址设置为spark_master,但我没有意识到在Java应用程序内部将“local”设置为spark master。如果在这两个地方都配置了,Spark会选择Java应用程序中的一个来运行。