0%

Scala 递归修改 HDFS 路径权限

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


前言

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

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

1
2
3
4
5
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

1
2
3
import sys.process._

"ls -al"!

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)
}
}


参考链接