scala操作Hadoop Api改变目录权限成777及写入单个hdfs文件
-
Hadoop 2.7.0支持修改目录的权限,可以修改成任意权限。这个问题的背景是,如果是某个人生成了一个hdfs路径,同一个group的成员如果想修改这个路径上面的内容,需要重新写入hdfs路径,在新的Hadoop Api这里会存在权限问题,必须将目录的权限修改下才能写入。
-
如果想单独在某个hdfs目录下面写入一个文件,可以使用FSDataOutputStream类。spark生成的hdfs都是目录,这里使用输出流可以单独写入一个文件
示例代码如下
import org.apache.hadoop.fs.permission.{FsAction, FsPermission}
import org.apache.hadoop.fs.{FSDataOutputStream, Path}
import org.apache.spark.sql.{DataFrame, SparkSession}
import org.joda.time.DateTime
object Tmp {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder()
.appName("Tmp")
.master("local[2]")
.getOrCreate()
import spark.implicits._
val df = Seq("123", "345").toDF("id")
save(spark, df, args.head)
}
// inputPath hdfs://xxx
def save(spark: SparkSession, df: DataFrame, path: String): Unit = {
val hadoopConf = spark.sparkContext.hadoopConfiguration
val fs = new Path(path).getFileSystem(hadoopConf)
val result = df
val filePermission = new FsPermission(
FsAction.ALL, // user
FsAction.ALL, // group
FsAction.ALL); // other
if (fs.exists(new Path(path))) {
fs.delete(new Path(path), true)
}
result.repartition(10).write.text(path)
fs.setPermission(new Path(path), filePermission)
val out: FSDataOutputStream = fs.create(new Path(path + "/" + "save.timestamp"))
val ts = (new DateTime().getMillis / 1000).toString + "\n"
out.write(ts.getBytes())
out.close()
}
}