Scala 递归修改 HDFS 路径权限

2019/03/07 Spark

通过scala代码可以直接调用JVM的系统功能或者OS的系统功能或者OS的shell命令,这可以极大的简化外部功能的实现


前言

写了一个 spark 的文件操作的代码。遇到一个权限问题。

HDFS 提供 API 修改某个路径的权限。

val sparkConf = new SparkConf()
val sc = new SparkContext(sparkConf)

val fs: FileSystem =  FileSystem.get(sc.hadoopConfiguration)
fs.setPermission(new Path("/user/hadoop/data"),new FsPermission("777"))

但是没有递归修改某个路径的权限。

最先想法是通过递归的方式去一个个路径改权限。

同事给了一个 idea ,说可以试试代码调用外部命令来直接使用 hadoop fs -chmod -R 777 path 的方式来实现。

原理

scala外部命令工作的原理:

通过scala代码可以直接调用JVM的系统功能或者OS的系统功能或者OS的shell命令,这可以极大的简化外部功能的实现,因为这种工作方式实际上是复用JVM和OS本身提供的功能,作为scala本身是直接把结果拿过来,其实这是代码模块化和软件复用的一种表现。

scala是基于JVM进程的,scala程序运行的时候会运行在JVM进程中,而JVM进程是OS的一个普通进程,通过JVM可以直接和OS进行交互,而OS有例如启动进程等功能,所以scala程序可以通过JVM去调用外部的功能。

示例

spark-shell

import sys.process._

"ls -al"!

代码

import sys.process._

/**
  * scala外部命令
  */
object CMD {
  def main(args: Array[String]): Unit = {
    "hadoop fs -chmod -R 777 /user/hadoop/data"!
    
    val tmp = Process(s"""ls""").!!
    
    println(tmp)
  }
}


参考链接

Search

    Table of Contents