spark 2.x在windows环境使用idea本地调试启动了kerberos认证的hive

1 概述

开发调试spark程序时,因为要访问开启kerberos认证的hive/hbase/hdfs等组件,每次调试都需要打jar包,上传到服务器执行特别影响工作效率,所以调研了下如何在windows环境用idea直接跑spark任务的方法,本文旨在记录配置本地调试环境中遇到的问题及解决方案。

2 环境

Jdk 1.8.0
Spark 2.1.0
Scala 2.11.8
Hadoop 2.6.0-cdh5.12.1
Hive 1.1.0-cdh5.12.1

环境搭建略,直接看本地调试spark程序遇到的问题。

注意:若要访问远端hadoop集群服务,需将hosts配置到windows本地。

3 测试代码

测试主类,功能spark sql读取开启Kerberos认证的远端hive数据

import org.apache.spark.sql.SparkSession

object SparkTest{
  def main(args: Array[String]): Unit = {
    //kerberos认证
    initKerberos()

    val spark = SparkSession.builder().master("local[2]").appName("SparkTest")
    .enableHiveSupport()
    .getOrCreate()
    spark.sql("show databases").show()
    spark.sql("use testdb")
    spark.sql("show tables").show()

    val sql = "select * from infodata.sq_dim_balance where dt=20180625 limit 10"
    spark.sql(sql).show()

    spark.stop()
  }

def initKerberos(): Unit ={
  //kerberos权限认证
  val path = RiskControlUtil.getClass.getClassLoader.getResource("").getPath
  val principal = PropertiesUtil.getProperty("kerberos.principal")
  val keytab = PropertiesUtil.getProperty("kerberos.keytab")

  val conf = new Configuration
  System.setProperty("java.security.krb5.conf", path + "krb5.conf")
  conf.addResource(new Path(path + "hbase-site.xml"))
  conf.addResource(new Path(path + "hdfs-site.xml"))
  conf.addResource(new Path(path + "hive-site.xml"))
  conf.set("hadoop.security.authentication", "Kerberos")
  conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem")
  UserGroupInformation.setConfiguration(conf)
  UserGroupInformation.loginUserFromKeytab(principal, path + keytab)
  println("login user: "+UserGroupInformation.getLoginUser())
}
}

4 问题及解决方案

4.1 问题1

java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.

winutils.exe是在Windows系统上需要的hadoop调试环境工具,里面包含一些在Windows系统下调试hadoop、spark所需要的基本的工具类
出现上面的问题,可能是因为windows环境下缺少winutils.exe文件或者版本不兼容的原因。

解决办法:
(1)下载winutils,注意需要与hadoop的版本相对应。
hadoop2.6版本可以在这里下载https://github.com/amihalik/hadoop-common-2.6.0-bin
由于配置的测试集群是hadoop2.6,所以我在这里下载的是2.6.0版本的。下载后,将其解压,包括:hadoop.dll和winutils.exe

(2)配置环境变量
①增加系统变量HADOOP_HOME,值是下载的zip包解压的目录,我这里解压后将其重命名为hadoop-common-2.6.0
②在系统变量path里增加%HADOOP_HOME%\bin
③重启电脑,使环境变量配置生效,上述问题即可解决。  

添加系统变量HADOOP_HOME

编辑系统变量Path,添加%HADOOP_HOME%\bin;

4.2 问题2

如果hadoop集群开启了kerberos认证,本地调试也需要进行认证,否则会报权限错误;
将权限相关配置文件放入工程的resource目录,如下所示

认证代码如下:

def initKerberos(): Unit ={
  //kerberos权限认证
  val path = RiskControlUtil.getClass.getClassLoader.getResource("").getPath
  val principal = PropertiesUtil.getProperty("kerberos.principal")
  val keytab = PropertiesUtil.getProperty("kerberos.keytab")

  val conf = new Configuration
  System.setProperty("java.security.krb5.conf", path + "krb5.conf")
  conf.addResource(new Path(path + "hbase-site.xml"))
conf.addResource(new Path(path + "hdfs-site.xml"))
conf.addResource(new Path(path + "hive-site.xml"))
  conf.set("hadoop.security.authentication", "Kerberos")
  conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem")
  UserGroupInformation.setConfiguration(conf)
  UserGroupInformation.loginUserFromKeytab(principal, path + keytab)
  println("login user: "+UserGroupInformation.getLoginUser())
}

4.3 问题3

Caused by: java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.createDirectoryWithMode0(Ljava/lang/String;I)V

网上说目前错误的解决办法还没有解决,采用一种临时的方式来解决,解决的办法是:通过下载你的CDH的版本的源码(http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.12.1-src.tar.gz),
在对应的文件下,hadoop2.6.0-cdh5.12.1-src\hadoop-common-project\hadoop- common\src\main\java\org\apache\hadoop\io\nativeio下NativeIO.java 复制到对应的Eclipse的project(复制的过程中需要注意一点,就是在当前的工程下创建相同的包路径,这里的包路径org.apache.hadoop.io.nativeio再将对应NativeIO.java文件复制到对应的包路径下即可。)

Windows的唯一方法用于检查当前进程的请求,在给定的路径的访问权限,所以我们先给以能进行访问,我们自己先修改源代码,return true 时允许访问。修改NativeIO.java文件中的557行的代码,如下所示:
源代码如下:

public static boolean access(String path, AccessRight desiredAccess)
    throws IOException {
    return access0(path, desiredAccess.accessRight());
}

修改后的代码如下:

public static boolean access(String path, AccessRight desiredAccess)
    throws IOException {
  return true;
    //return access0(path, desiredAccess.accessRight());
}

再次执行,这个错误修复。

4.4 问题4

Caused by: java.io.FileNotFoundException: File /tmp/hive does not exist

这个错误是说临时目录/tmp/hive需要有全部权限,即777权限,创建/tmp/hive 目录,用winutils.exe对目录赋权,如下

C:\>D:\spark_hadoop\hadoop-common\hadoop-common-2.6.0\bin\winutils.exe chmod -R 777 D:\tmp\hive

C:\>D:\spark_hadoop\hadoop-common\hadoop-common-2.6.0\bin\winutils.exe chmod -R 777 \tmp\hive

4.5 问题5

Exception in thread "main" java.lang.NoSuchFieldError: METASTORE_CLIENT_SOCKET_LIFETIME

OR

Exception in thread "main" java.lang.IllegalArgumentException: Unable to instantiate SparkSession with Hive support because Hive classes are not found

原因是spark sql 读取hive元数据需要的字段METASTORE_CLIENT_SOCKET_LIFETIME hive1.2.0开始才有,而我们引用的cdh版本的hive为1.1.0-cdh5.12.1,没有该字段,故报错。

Spark SQL when configured with a Hive version lower than 1.2.0 throws a java.lang.NoSuchFieldError for the field METASTORE_CLIENT_SOCKET_LIFETIME because this field was introduced in Hive 1.2.0 so its not possible to use Hive metastore version lower than 1.2.0 with Spark. The details of the Hive changes can be found here: https://issues.apache.org/jira/browse/HIVE-9508

解决方法,引入第三方依赖

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-hive_2.11</artifactId>
    <version>2.1.0</version>
</dependency>

4.6 问题6

Exception in thread "main" java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProvider,org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory

解决方法,将window idea引入的hive-site.xml进行如下修改

<!--<property>-->
  <!--<name>hive.security.authorization.manager</name>-->
  <!--<value>org.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProvider,org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory</value>-->
<!--</property>-->
<property>
<name>hive.security.authorization.manager</name>
<value>org.apache.hadoop.hive.ql.security.authorization.DefaultHiveAuthorizationProvider</value>
</property>

5 总结

总结重要的几点就是:

(1) 配置HADOOP_HOME,内带winutils.exe 和 hadoop.dll 工具;

(2) 引入hive-site.xml等配置文件,开发kerberos认证逻辑;

(3) 本地重写NativeIO.java类;

(4) 给临时目录/tmp/hive赋予777权限;

(5) 引入第三方依赖spark-hive_2.11,要与spark版本对应;

(6) 本地hive-site.xml将hive.security.authorization.manager改为默认manager

最后提醒一点,本地调试只是问了开发阶段提高效率,避免每次修改都要打包提交到服务器运行,但调试完,还是要打包到服务器环境运行测试,没问题才能上线。
至此,spark本地调试程序配置完成,以后就可以愉快地在本地调试spark on hadoop程序了。

6 参考

https://abgoswam.wordpress.com/2016/09/16/getting-started-with-spark-on-windows-10-part-2/

原文地址:https://www.cnblogs.com/xiaodf/p/11115843.html

时间: 2024-08-02 22:20:04

spark 2.x在windows环境使用idea本地调试启动了kerberos认证的hive的相关文章

Dev-c++在windows环境下无法debug(调试)的解决方案

如标题所见,在官网上下载的最新版本的Dev-C++居然无法调试,这是何等烦人,有些时候我们为了更加了解一下代码中递归部分的变化情况,debug功能举足轻重. 在本人的windows环境下一debug(F5),dev-c++就立马跳出个程序遇到错误的提示,然后关闭程序,但是本人想了想:是不是本人代码功力太菜,是代码导致软件崩溃呢?最后尝试着写了个"Hello-World!",依然是在Debug中崩溃,经过查阅资料,给出以下解决方案: 1 在软件的tools选项->complie o

Windows 环境下adb.exe无法启动的解决办法之一

应用Eclipse开发安卓,更换工作空间之后会出现adb.exe无法启动的情况,其原因尚不明,但是经查阅资料找到了其解决办法之一,现在叙述如下. 操作步骤: 1:wir+R键进入Dos窗口下,切换到adb.exe文件所在的路径下面 Dos下面进入别的盘的命令:“盘符:”如进入D盘就输入“D:”(大写小写都可以): 在同一个盘符下面的文件之间的切换就可以类似于linux下面的操作 “cd 目录” 在dos环境下面操作dir命令会列出该目录下面的所有文件 同样的类似于Linux可以使用Tab键进行自

Spark+ECLIPSE+JAVA+MAVEN windows开发环境搭建及入门实例【附详细代码】

http://blog.csdn.net/xiefu5hh/article/details/51707529 Spark+ECLIPSE+JAVA+MAVEN windows开发环境搭建及入门实例[附详细代码] 标签: SparkECLIPSEJAVAMAVENwindows 2016-06-18 22:35 405人阅读 评论(0) 收藏 举报  分类: spark(5)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 前言 本文旨在记录初学Spark时,根据官网快速

Windows环境下在IDEA编辑器中spark开发安装步骤

以下是windows环境下安装spark的过程: 1.安装JDK(version:1.8.0.152) 2.安装scala(version:2.11/2.12) 3.安装spark(version:spark-2.3.0-bin-hadoop2.6.tgz) 4.安装wintuils(设置windows系统的环境变量HADOOP_HOME) 以下是spark开发环境搭建: 1.scala插件安装 2.全局JDK和Library的设置 3.配置全局的scala SDK 4.导入spark依赖包(s

spark JAVA 开发环境搭建及远程调试

spark JAVA 开发环境搭建及远程调试 以后要在项目中使用Spark 用户昵称文本做一下聚类分析,找出一些违规的昵称信息.以前折腾过Hadoop,于是看了下Spark官网的文档以及 github 上 官方提供的examples,看完了之后决定动手跑一个文本聚类的demo,于是有了下文. 1. 环境介绍 本地开发环境是:IDEA2018.JDK8.windows 10.远程服务器 Ubuntu 16.04.3 LTS上安装了spark-2.3.1-bin-hadoop2.7 看spark官网

定制windows环境下cmd替代软件ConEmu

定制windows环境下cmd替代软件ConEmu 公认的是Windows环境下命令行界面太难用. 不管是cmd还是powershell都不顺手!!窗口宽度不能全屏,字体太难看还不能调整,窗口背景不能更换,永远的黑白配,最痛苦的是复制和粘贴.都不知道MS是怎么想的?搞个这么个反人类的东西出来,还万年不变,从Windows诞生到Windows7不论是桌面版还是服务器版都一样,到了windows8/windows10换成powershell一样的鸡肋. 在百度搜了一下,找到cmd的替代软件conem

《高可用MySQL》1 – Windows环境下压缩版MySQL安装

近日在读O'REILIY系列的<高可用MySQL>, 自然少不了主从(Master-Slave)配置和横向扩展相关的内容. Master-Slave这东西吧.在很多公司都是标配.开发中基本天天都用.遇到的问题自然也不少(如主从不同步,Master宕机).但操作权限很有限.有些东西,仅仅有自己看了.做了,才干真正知道原理是什么,也才干更好的去把握. 本文是高可用MySQL的第一篇读书笔记,主要记录Windows环境下压缩版MySQL(基于安装版的傻瓜式安装过程这里不再提及)的安装过程. 1. 从

python MySQLdb在windows环境下的快速安装、问题解决方式

使用Python访问MySQL,需要一系列安装 Linux下MySQLdb安装见 Python MySQLdb在Linux下的快速安装 http://blog.csdn.net/wklken/article/details/7271019 ------------------------------------------------------------- 以下是windows环境下的: 1.      安装数据库mysql 下载地址:http://www.mysql.com/downloa

Windows环境下Android Studio v1.0安装教程

Windows环境下Android Studio v1.0安装教程 Windows环境下Android Studio v1.0安装教程 准备工具 JDK安装包. 要求:JDK 7以及以上版本. Android Studio安装文件. Windows: exe(包含SDK) (813 MB) exe(不包含SDK) (250 MB) zip (235 MB) Mac dmg (234 MB) zip (233 MB) Linux: zip (233 MB) 说明: 32位系统和64位系统是同一个安