All Downloads are FREE. Search and download functionalities are using the official Maven repository.

scala.cli.commands.util.RunHadoop.scala Maven / Gradle / Ivy

There is a newer version: 1.5.0
Show newest version
package scala.cli.commands.util

import scala.build.EitherCps.{either, value}
import scala.build.errors.BuildException
import scala.build.internal.Runner
import scala.build.{Build, Logger}
import scala.cli.commands.package0.{Package => PackageCmd}
import scala.cli.commands.packaging.Spark

object RunHadoop {

  def run(
    build: Build.Successful,
    mainClass: String,
    args: Seq[String],
    logger: Logger,
    allowExecve: Boolean,
    showCommand: Boolean,
    scratchDirOpt: Option[os.Path]
  ): Either[BuildException, Either[Seq[String], (Process, Option[() => Unit])]] = either {

    // FIXME Get Spark.hadoopModules via provided settings?
    val providedModules = Spark.hadoopModules
    scratchDirOpt.foreach(os.makeDir.all(_))
    val assembly = os.temp(
      dir = scratchDirOpt.orNull,
      prefix = "hadoop-job",
      suffix = ".jar",
      deleteOnExit = scratchDirOpt.isEmpty
    )
    value {
      PackageCmd.assembly(
        build,
        assembly,
        // "hadoop jar" doesn't accept a main class as second argument if the jar as first argument has a main class in its manifest…
        None,
        providedModules,
        withPreamble = false,
        () => Right(()),
        logger
      )
    }

    val javaOpts = build.options.javaOptions.javaOpts.toSeq.map(_.value.value)
    val extraEnv =
      if (javaOpts.isEmpty) Map[String, String]()
      else
        Map(
          "HADOOP_CLIENT_OPTS" -> javaOpts.mkString(" ") // no escaping…
        )
    val hadoopJarCommand = Seq("hadoop", "jar")
    val finalCommand =
      hadoopJarCommand ++ Seq(assembly.toString, mainClass) ++ args
    if (showCommand)
      Left(Runner.envCommand(extraEnv) ++ finalCommand)
    else {
      val proc =
        if (allowExecve)
          Runner.maybeExec("hadoop", finalCommand, logger, extraEnv = extraEnv)
        else
          Runner.run(finalCommand, logger, extraEnv = extraEnv)
      Right((
        proc,
        if (scratchDirOpt.isEmpty) Some(() => os.remove(assembly, checkExists = true))
        else None
      ))
    }

  }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy