Как лучше всего олицетворять учетную запись пользователя на hadoop - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть Java-программа, которая копирует файл из Unix в hdfs. Он работает нормально, однако я ищу для олицетворения другой учетной записи, когда он запускается и копирует файл.

Входные данные: Помимо входного файла формы и пути к целевому каталогу hdfs, другим входным параметром должен быть файл свойств, содержащий учетную запись, каталог keytab, домен

Пожалуйста, дайте мне знать, как лучше двигаться вперед.

В настоящее время я изучаю использование оболочки, чтобы сначала выполнить команду kinit, а затем запустить jar

Я также читаю о Jaas и о том, как это можно сделать в самой Java - с - https://henning.kropponline.de/2016/02/14/a-secure-hdfs-client-example/

Нужны входные данные и любые ссылки на доступные опции.

Моя Java-программа, которая копирует файл, выглядит следующим образом:

public class FileCopy implements Runnable {

@Option(names = {"-i","--input"}, required=true, description="file name to copy to hadoop")
String input;

@Option(names = {"-o","--output"}, required=true, description="hdfs directory path to be copied into")
String output;


public void run() {


    Properties hadoop_properties = new Properties();
    HdfsFileDeploy hdfsFileDeploy = new HdfsFileDeploy();

    try {
        hadoop_properties.load(FileCopy.class.getClassLoader().getResourceAsStream("hadoop.properties"));
    } catch (IOException e) {
        e.printStackTrace();
    }


    FileSystem fs = hdfsFileDeploy.configureFilesystem(hadoop_properties.getProperty("coreSitePath"),hadoop_properties.getProperty("hdfsSitePath"));


    String status = hdfsFileDeploy.writeToHDFS(fs,input,output);

    if (status == "SUCCESS") {
            System.out.println("completed copying");
    } else {
        System.out.println("copying error");
    }

    hdfsFileDeploy.closeFileSystem(fs);

}

public static void main(String[] args) throws IOException {


    CommandLine.run(new FileCopy(), args);

}

}

открытый класс HdfsFileDeploy {

   public FileSystem configureFilesystem(String coreSitePath, String hdfsSitePath) {

        FileSystem fileSystem = null;

        try {

            Configuration conf = new Configuration();
            Path hdfsCoreSitePath = new Path(coreSitePath);
            Path hdfsHDFSSitePath = new Path(hdfsSitePath);
            conf.addResource(hdfsCoreSitePath);
            conf.addResource(hdfsHDFSSitePath);


            fileSystem = FileSystem.get(conf);
            System.out.println(fileSystem);
            return fileSystem;

        } catch (Exception ex) {

            ex.printStackTrace();
            return fileSystem;
        }
    }


   public void closeFileSystem(FileSystem fileSystem) {

        try {
            fileSystem.close();
        } catch (Exception ex) {
                System.out.println("Unable to close Hadoop filesystem : " + ex);

        }
   }

   // 

    public String writeToHDFS(FileSystem fileSystem, String sourcePath, String destinationPath) {

        String failure = "FAILURE";
        String success = "SUCCESS";
        Boolean doNotDelSrc = false;
        Boolean overwrite = true;

        try {
            Path inputPath = new Path(sourcePath);
            Path outputPath = new Path(destinationPath);

            if(!fileSystem.exists(outputPath)) {
                System.out.println("Output path " + outputPath + " does not exist. Creating outputPath directory now..");
                if (fileSystem.mkdirs(outputPath)) {
                    System.out.println("Output path " + outputPath + " created...");
                }
            }

            System.out.println("about to copy from " + inputPath + " to " + outputPath);
            fileSystem.copyFromLocalFile(doNotDelSrc, overwrite, inputPath, outputPath);
            return success;

        } catch (IOException ex) {

            System.out.println("Some exception occurred while writing file to hdfs");
            ex.printStackTrace();
            return failure;
        }
    }
* *} Тысяча двадцать-один

Input1: входной файл Input2: целевой каталог hdfs Ссылочный ввод: файл (скажем, yaml), содержащий учетную запись, домен, путь к ключу.

jar должен олицетворять и копировать входной файл в целевой каталог hdfs.

...