scala操作Hadoop Api改变目录权限成777及写入单个hdfs文件

scala操作Hadoop Api改变目录权限成777及写入单个hdfs文件

  1. Hadoop 2.7.0支持修改目录的权限,可以修改成任意权限。这个问题的背景是,如果是某个人生成了一个hdfs路径,同一个group的成员如果想修改这个路径上面的内容,需要重新写入hdfs路径,在新的Hadoop Api这里会存在权限问题,必须将目录的权限修改下才能写入。

  2. 如果想单独在某个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()

  }

}

你可能感兴趣的:(Hadoop,Spark,scala,hdfs,hadoop,spark)