需求
由于公司使用了kerberos认证的hadoop。在使用kettle的过程中发现访问hadoop的hdfs时会出现权限错误。故需要寻找一种能够通过kettle访问带kerberos认证hadoop的方法。
查找了网上的文章,发现可以通过自己修改kettle大数据连接源码的方式达到目标,但是网上并没有详细过程。故将详细过程进行分享。
过程
选择对应的目录,修改其中的jar包中的CommonHadoopShim类的getFileSystem方法。
修改后内容如下:
public FileSystem getFileSystem(Configuration conf) throws IOException {
ClassLoader cl = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
JobConf jobConf = ShimUtils.asConfiguration(conf);
//认证kerberos
if (jobConf.getBoolean("hadoop.security.authorization", false)) {
//设置java安全krb5配置,其中krb5.conf文件可以从成功开启kerberos的集群任意一台节点/etc/krb5.conf拿到,放置本地
String krb5File = jobConf.get("krb5_file_location", "/etc/krb5.conf");
// kerberos principal
String kerUser = jobConf.get("krb5_user_principal");
// 对应kerberos principal的keytab文件,从服务器获取放置本地
String keyPath = jobConf.get("krb5_user_keytab");
// 设置krb5.conf到环境变量
System.setProperty("java.security.krb5.conf", krb5File);
// 设置安全认证方式为kerberos
UserGroupInformation.setConfiguration(jobConf);
try {
UserGroupInformation.loginUserFromKeytab(kerUser, keyPath);
} catch (IOException e) {
throw new RuntimeException("kerberos login failed:", e);
}
}
// FileSystemProxy var3;
// try {
// var3 = new FileSystemProxy(org.apache.hadoop.fs.FileSystem.get(ShimUtils.asConfiguration(conf)));
// } finally {
// Thread.currentThread().setContextClassLoader(cl);
// }
FileSystemProxy var3;
try {
var3 = new FileSystemProxy(org.apache.hadoop.fs.FileSystem.get(jobConf));
} finally {
Thread.currentThread().setContextClassLoader(cl);
}
return var3;
}
修改方法:
在idea中新建一个project,导入所需jar包,包括:
引入以上jar包后,在源码中新建一个CommonHadoopShim.java。包和所需修改的class一致,内容直接拷贝反编译的源码,对getFileSystem方法进行对应的修改。
修改完成后,将其build成class,在target里即可找到新编译的class文件,替换之前jar里的class文件即可。
jar修改完成后,将hadoop服务器上配置文件拷贝到对应附录下,并对core-site.xml和hdfs-site.xml进行修改。
core-site.xml 增加kerberos认证相关配置
<property>
<name>hadoop.security.authentication</name>
<value>kerberos</value>
</property>
<property>
<name>hadoop.security.authorization</name>
<value>true</value>
</property>
hdfs-site.xml 增加
<property>
<name>krb5_file_location</name>
<value>C:/ProgramData/MIT/Kerberos5/krb5.ini</value> 修改为自己的
</property>
<property>
<name>krb5_user_principal</name>
<value>hive@SZSWDW.COM</value> 修改为自己的
</property>
<property>
<name>krb5_user_keytab</name>
<value>E:/keytabs/hive.keytab</value> 修改为自己的
</property>
重启spoon。增加hadoop_clusters 点击“测试”即可完成访问kerberos的hdfs。