分享

spark处理1亿行的数据耗时应为多少?

395455030 发表于 2016-1-19 15:04:28 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 10 61532
    spark可以通过增加计算机数量来提高速度。我做了测试,单节点处理(1亿行*20字节/行)的文件用时27s,双节点用时19s,这是想要的结果。单节点处理(1亿行*40字节/行)的文件用时约52s,双节点用时约51s。这40亿字节的文件怎么回事,单节点和双节点速度差不多,我看运行时把文件切成30个分片,单节点完成每个分片约3秒,双节点完成每个分片约7秒,本来不是应该完成1个分片用时都差不多的吗,双节点竟然要多用那么多时间。
    说一下我的程序,其实也没什么东西,就是读文件,把一亿行过滤得只剩一万行,再挑100行打印出来,下面的是读20亿字节文件的,只要把strFile路径改一下就是读40亿字节文件的了。
    val strFile="hdfs://master151:8020/user/hadoop/test/test20b_10e8.txt"
    val rddFile = spark.textFile(strFile);

    var num= -1;
    var num1= -1;
    val answer = rddFile.map { i =>
      num1=num1+1;
      num=num+1;
      if(10000==num)
        num=0;
      (num1,num,i)
    }.filter(x=>{x._2==0})
    val arr=answer.collect();
    for(i<-0 until 100){
      println(arr(i*100));
    }
    我想结果本应该是这样,单节点速度慢一点,再启动一个节点变成双节点时速度有所加快,怎么得到的两个都差不多?双节点完成1个分片所需时间竟然约为单节点时的2倍?能介绍一下你们用spark处理这样的文件耗时是怎么样的?

已有(10)人评论

跳转到指定楼层
regan 发表于 2016-1-19 16:46:57

RE: spark处理1亿行的数据耗时应为多少?

        集群处理优势,只有在单机处理遇到瓶颈的时候,才能够体现出来。因为集群资源时可以通过增加集群节点数量来水平扩展的,当数据量大到一台机器处理不了的时候,使用集群处理就看到优势了。理论在单机能够处理的情况下,使用单机和集群分别处理相同的数据,单机应该会比集群快一些,因为集群中资源的调度和程序的分发需要消耗时间的,但是在单机不能够处理的情况下如:处理1PB数据,单机肯定处理不了(没有足够大的内存装下这些数据,或者即使有这么大的内存,但是由于处理能力有限,这些处理任务也会排很长的队),这个时候集群威力就体现出来了,三个臭皮匠赛过诸葛亮,在多个节点上并行处理,这样处理数据肯定比单机要快了,即便资源的调度会消耗时间,但是这个调度的时间远远小于排队等待的时间。
       处理一亿行数据,也要看你是什么数据?,要对这些数据做什么运算?,算法的时间复杂度等等都有关系?等等,,,,,
光是简单的读文件,过滤文件,那太low了

回复

使用道具 举报

Alkaloid0515 发表于 2016-1-19 16:47:14
会不会跟分片的规则有关系
回复

使用道具 举报

395455030 发表于 2016-1-19 16:58:49
regan 发表于 2016-1-19 16:46
集群处理优势,只有在单机处理遇到瓶颈的时候,才能够体现出来。因为集群资源时可以通过增加集群节 ...

我做这么简单也是为了方便查错,如果这么简单的程序都不知道什么原因造成耗时超出预期,复杂程序问题不是更多吗。30片每片3秒,单机二线程用时应为45秒,加上一些调度、辅助功能的实现,实际用时51秒差不多。如果双机每片也用时3秒,最后时间应能缩短到30秒左右,可是为什么双机每片用时增加了好多,要说调度、分发上的时间消耗,那应该是主节点的事,从节点只管拿来数据就算,双从节点和单从节点不应该是一样的吗?
回复

使用道具 举报

395455030 发表于 2016-1-19 17:01:22
Alkaloid0515 发表于 2016-1-19 16:47
会不会跟分片的规则有关系

你做过什么数据量、节点数量的速度测试吗?给我参考比较一下。
回复

使用道具 举报

regan 发表于 2016-1-19 17:22:05
395455030 发表于 2016-1-19 16:58
我做这么简单也是为了方便查错,如果这么简单的程序都不知道什么原因造成耗时超出预期,复杂程序问题不是 ...

       集群肯定会超过51秒,集群里面涉及到分片,代码分发【代码序列化,分发到节点反序列化】,数据本地性判断,如果数据不是本地性的,还会涉及到数据的下载,消耗带宽。
        请问,你HDFS中文件几个副本?机器有几个处理核?代码在每个节点上的线程池中运行,建议分片数为核数的2~3倍


回复

使用道具 举报

395455030 发表于 2016-1-19 18:56:30
regan 发表于 2016-1-19 17:22
集群肯定会超过51秒,集群里面涉及到分片,代码分发【代码序列化,分发到节点反序列化】,数据本 ...

我布的是一个三节点系统。1号主节点;2号从节点,一直连着主节点;3号从节点,或者启动或者停止来改变集群中从节点的数量。当我只用一个从节点时,也是采用类似集群的部署方式,二从节点会涉及的哪个单从节点不涉及?
我只有1个副本,每个机器2核。分片为核数的2~3倍这有什么根据?我知道的是分片数应为文件大小除以128M,如果设置为核数的2~3倍,比如5,它还会被自动改为30。

回复

使用道具 举报

regan 发表于 2016-1-19 20:12:24
本帖最后由 regan 于 2016-1-19 20:14 编辑
395455030 发表于 2016-1-19 18:56
我布的是一个三节点系统。1号主节点;2号从节点,一直连着主节点;3号从节点,或者启动或者停止来改变集 ...

      哥哥,你一个副本,如果你副本正好放在启动的节点,这个好说,如果不在的话,该节点运行计算任务还要到其他节点拷贝数据。HDFS设置副本数不仅仅是为了容灾容错,更大的作用是计算数据的本地性。移动代码,尽量不移动数据!
      分片会影响计算任务的并行度,每一个partition都会在线程池中的一个线程上面运行,你分得越细,并行度越好。2~3倍是说,一个核上面运行2到3个线程,充分利用系统资源。如果你有一个文件128M,你觉得是分成10份,每份12.8M,10个线程同时运行快呢?还是就一份,一个线程更快?分区依据自己看官网!
      你每个节点只有两个核,如果你的Driver程序运行在某个节点上,Driver独占了一个核,那就还剩下一个核可以运行计算任务。Driver是如何分发运行的?为什么会独占一个核,想必大神应该会看源代码吧
回复

使用道具 举报

regan 发表于 2016-1-19 20:16:51
395455030 发表于 2016-1-19 18:56
我布的是一个三节点系统。1号主节点;2号从节点,一直连着主节点;3号从节点,或者启动或者停止来改变集 ...

还有就是,不要单单拿着运行结果分析,,,,,运行日志到哪里去了,拿出来看看,分析分析,日志不会看吗?看到底是那一步拖慢了时间,自己尝试着改变参数去优化,不是每一个问题都有人有空回答你的。。。。。
回复

使用道具 举报

395455030 发表于 2016-1-19 21:27:09
本帖最后由 395455030 于 2016-1-19 21:46 编辑
regan 发表于 2016-1-19 20:12
哥哥,你一个副本,如果你副本正好放在启动的节点,这个好说,如果不在的话,该节点运行计算任务还 ...

        我文件是放在主节点上,本来想一个从节点从主节点读,改为两个从节点从主节点读,应该速度差不多,现在可以试试把文件备份到三个节点上。
        Driver是指什么?master程序?这个源代码在哪个文件夹给指一下。运行日志是运行时打印在屏幕的和logs文件夹的那些?这个只说了一个分片用时多少,感觉没讲什么。
        不知这种问题回答起来会不会很花时间,如果大神还要多想会比较费时,就想如果大神之前做过相似的事,讲一下之前做的效果就好啦。

回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条