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

13 篇文章 0 订阅
3 篇文章 0 订阅

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()

  }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值