【问题标题】:Fast file writing in scala?在scala中快速写入文件?
【发布时间】:2017-10-04 05:48:13
【问题描述】:

所以我有一个 scala 程序,它遍历图形并将数据逐行写入文本文件。它本质上是一个与 graphx 一起使用的边缘列表文件。

最大的减速实际上是创建这个文本文件,可能是它写入这个文本文件的数百万条记录。有没有一种方法可以让我以某种方式并行这个任务,或者通过某种方式将它存储在内存中或任何东西中以任何方式加快速度?

更多信息: 我正在使用一个 hadoop 集群来遍历一个图形,这是我的代码 sn-p 用于我的文本文件创建,我现在正在执行写入 HDFS:

val fileName = dbPropertiesFile + "-edgelist-" + System.currentTimeMillis()
val path = new Path("/home/user/graph/" + fileName + ".txt")
val conf = new Configuration()
conf.set("fs.defaultFS", "hdfs://host001:8020")

val fs = FileSystem.newInstance(conf)
val os = fs.create(path)
while (edges.hasNext) {
val current = edges.next()
os.write(current.inVertex().id().toString.getBytes())
os.write(" ".getBytes())
os.write(current.outVertex().id().toString.getBytes())
os.write("\n".toString.getBytes())
}
fs.close()

【问题讨论】:

  • 看看这些在Scala中使用Akka的并行文件处理stackoverflow.com/questions/11576439/…
  • 您想将其写入本地文件系统吗?还是您在使用 HDFS 等的集群上?
  • 我投票结束这个问题,因为它太宽泛,无法回答!
  • 我正在使用 hadoop 集群,但如果证明更快,我愿意将文件写入本地文件系统
  • 您可能可以缩小您的问题范围。你能测量出什么是慢的吗?您是否写入压缩格式(例如 GZIP?切换到 Snappy 怎么样?)您是否将带宽饱和到 hadoop(如果您切换到 BufferedOutputStream 到本地文本文件怎么办?如果您即时压缩怎么办)?如果您手动尝试写入多个 hadoop 文件怎么办? ... 没有更多细节,我们有点不知所措。

标签: scala apache-spark file-writing spark-graphx


【解决方案1】:

将文件写入 HDFS 从来都不是很快。您的标签似乎表明您已经在使用 spark,所以您也可以利用它。

    sparkContext
      .makeRDD(20, edges.toStream)  
      .map(e => e.inVertex.id -> e.outVertex.id)
      .toDF
      .write
      .delimiter(" ")
      .csv(path)

这会将您的输入分成 20 个分区(您可以使用上面的 makeRDD 的数字参数控制该数字),并将它们并行写入 hdfs 中的 20 个不同块,这些块代表您的结果文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-02
    • 2011-06-25
    • 2015-01-27
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    相关资源
    最近更新 更多