前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >scala-sparkML学习笔记:迁移文件/ 通过 .!! 隐式方法直接执行系统命令

scala-sparkML学习笔记:迁移文件/ 通过 .!! 隐式方法直接执行系统命令

作者头像
MachineLP
发布2019-11-14 17:02:09
3870
发布2019-11-14 17:02:09
举报
文章被收录于专栏:小鹏的专栏

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://cloud.tencent.com/developer/article/1539117

Scala作为script使用也是非常的方便。

原文地址:https://www.yangbajing.me/2019/03/22/scala实战:迁移文件/

主要指令: (将./nohup.out重命名为machinelp.out)

代码语言:javascript
复制
import scala.sys.process._

s"mv ./nohup.out machinelp.out".!!

前因

最近因为线上文件越来越多,导致磁盘不够用。需要将磁盘上数据迁移到一块新的磁盘上(不用问为啥没用云存储,因为用了的话就不会有这篇文章了)。迁移数据时遇到几个问题:

  1. 迁移过程中服务不能中断
  2. 因为磁盘文件较大,文件移动耗费时间较长……等copy完的话再重新挂载磁盘会造成移动时间这段时间内新上传文件丢失

终上,我想到一个一个子目录的进行迁移,在迁移完后再将新目录做一个符号连接回原地址。这样在完成整体迁移之前若有新文件上传,文件将通过符号连接最终存储到新的磁盘上。

实现

所用Scala script代码如下:

代码语言:javascript
复制
import java.nio.file.{Files, Path, Paths}
import java.time.{Duration, Instant}

import scala.sys.process._

if (args.length != 2) {
  println("""请输入参数:scala MoveDir.scala <src_dir> <dest_dir>""")
}

// 从命令行参数中函数“解构”直接获得源目录和目的目录
val Array(srcDir, distDir) = args

val IGNORE_NAMES = Set("s1")

def ignoreDirectories(dir: Path) = {
  val name = dir.getName(dir.getNameCount - 1).toString
  IGNORE_NAMES(name) || name.length != 2
}

Files
  .list(Paths.get(srcDir))
  .forEach { // 模式匹配
    case dir: Path if !Files.isDirectory(dir) || Files.isSymbolicLink(dir) =>
      println(s"$dir 不是目录或为符号链接")
    case dir: Path if ignoreDirectories(dir) =>
      println(s"强制忽略目录:$dir")
    case dir: Path =>
      val name = dir.getName(dir.getNameCount - 1).toString
      val target = s"$distDir/$name"
      val start = Instant.now()
      try {
        // 通过 .!! 隐式方法直接执行系统命令
        s"mv $dir $target".!!
        s"ln -sf $target $srcDir/$name".!!
        
        val cost = Duration.between(start, Instant.now())
        println(s"移动目录成功,耗时$cost;$dir --> $target")
      } catch {
        case e: Throwable =>
          val cost = Duration.between(start, Instant.now())
          System.err.println(s"移动目录失败,耗时$cost;$dir --> $target。${e.toString}")
      }
  }

脚本执行后的部分输出如下:

代码语言:javascript
复制
$ scala MoveDir.scala /home/upload /data
移动目录成功,耗时PT0.012S;/home/upload/d4 --> /data/d4
移动目录成功,耗时PT0.002S;/home/upload/ba --> /data/ba
移动目录成功,耗时PT0.002S;/home/upload/fd --> /data/fd
移动目录成功,耗时PT0.002S;/home/upload/7e --> /data/7e
移动目录成功,耗时PT0.002S;/home/upload/b7 --> /data/b7
移动目录成功,耗时PT0.003S;/home/upload/76 --> /data/76
移动目录成功,耗时PT0.002S;/home/upload/43 --> /data/43
强制忽略目录:/home/upload/hongka-tmp
移动目录成功,耗时PT0.001S;/home/upload/df --> /data/df
/home/upload/logo.jpg 不是目录或为符号链接
移动目录成功,耗时PT0.001S;/home/upload/85 --> /data/85
移动目录成功,耗时PT0.001S;/home/upload/f0 --> /data/f0
......

小结

Scala是一门强大的、融合了函数式与面向对象范式的编程语言。同时,Scala也是一门精致的语言,除了通常那些 重量 级应用外,日常工作中的脚本也可以使用。接下来,也许你可以尝试下 lihaoyi 的 http://ammonite.io/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/11/13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前因
  • 实现
  • 小结
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档