métodos estáticos Java bloquear sólo reciben un identificador de un objeto para un uso global

prefacio

A decir verdad, no había conocido antes sólo colocar uno debe adquirir el objeto para el uso mundial, o decir cómo repetidos casos de la nueva manija no tienen influencia en el programa, pero este hábito es muy, muy mal, por ejemplo, hace poco a cuando quiero escribir en el fichero HDF sistema de archivos fs este identificador se obtiene sólo una vez, detrás de todas estas operaciones fs con un objeto en la línea, ya que la autenticación Kerberos, si cada fs operación FileSystem necesitan para obtener un identificador para la verificación de los residuos tiempo, y en segundo lugar, se está llevando a poca memoria!

código

package com.bodyproperty.util;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.security.UserGroupInformation;
import org.springframework.stereotype.Component;
import java.io.IOException;

/**
 * @Auther: kc
 * @Date: 2018/12/19 11:22
 * @Description:
 */
@Component
public class HdfsUtil {
            static FileSystem fs;
            static{
            if (System.getProperty("os.name").toLowerCase().startsWith("win")) {
                // Windows系统
                System.setProperty("java.security.krb5.conf", "C:/Program Files/MIT/Kerberos/krb5.ini");
            } else {
                // linux系统
                System.setProperty("java.security.krb5.conf", "/etc/krb5.conf");
            }
            Configuration conf = new Configuration();
            //这里设置namenode新
            conf.set("fs.defaultFS", "hdfs://test-da-shanghai:8020");
            //需要增加hadoop开启了安全的配置
            conf.setBoolean("hadoop.security.authorization", true);
            //配置安全认证方式为kerberos
            conf.set("hadoop.security.authentication", "kerberos");
            //设置namenode的principal
            conf.set("dfs.namenode.kerberos.principal", "nn/[email protected]");
            //设置datanode的principal值为“hdfs/[email protected]”
            conf.set("dfs.datanode.kerberos.principal", "dn/[email protected]");

            conf.set("dfs.support.append", "true");
            conf.set("dfs.client.block.write.replace-datanode-on-failure.policy", "NEVER");
            conf.set("dfs.client.block.write.replace-datanode-on-failure.enable", "true");

            //通过hadoop security下中的 UserGroupInformation类来实现使用keytab文件登录
            UserGroupInformation.setConfiguration(conf);
            //设置登录的kerberos principal和对应的keytab文件,其中keytab文件需要kdc管理员生成给到开发人员
            try {
                UserGroupInformation.loginUserFromKeytab("[email protected]", "file:/usr/lihong/lihong.keytab");
            } catch (Exception e) {
                System.out.println("身份认证异常: " + e.getMessage());
                e.printStackTrace();
            }
                try {
                    fs = FileSystem.get(conf);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    public static  FileSystem getFs() {
                return  fs;
    }

}

De hecho, en el medio de todo no se ven en toda la verificación de código, principalmente utilizo bloque de código estático estará rodeado lógica de validación, a continuación, fs este objeto sólo se generará una vez, y cada getFs método call () para obtener los objetos son los mismos fs .

Publicados 169 artículos originales · ganado elogios 224 · vistas 260 000 +

Supongo que te gusta

Origin blog.csdn.net/sureSand/article/details/85244059
Recomendado
Clasificación