spark-测试模式-在windows中连接虚拟机中cdh集群的hdfs和hive和linux单机模式

需求1:在windows的idea中连接虚拟机cdh集群的hdfs和hive

在windows中的idea中直接把spark程序的master设为local,然后连接虚拟机中的hdfs和hive。这是目前最方便的测试方式,不需要打包程序然后上传再运行,随改随运行。一些文章中所谓的单机版spark只是在官网下载了带hadoop(spark运行必须要有hadoop以及相关依赖)的spark然后安装到linux上运行,仍然需要打包上传。

之前没用kerberos 且 用原生apache版的连成功过,这次用cdh + kerberos,也成功了,但遇到了很多坑。

以下全部亲测可用

1. kerberos认证

使用工具类认证即可,跟linux中的java程序一样,但krb5.conf要改为windows中的krb5.ini,具体格式看代码中的配文。ini格式文件注释用;,别的都一样

2. 将相关配置文件复制到idea的resources下,上传到cdh的程序是不需要的,因为cdh已经把这些配文放到类路径下了。但在windows中的程序就必须要放了。

Can't get Master Kerberos principal for use as renewer这个错应该就跟这些配置文件有关,全部复制过来就好了。
一开始以为只需要放core-site.xml、hdfs-site.xml、hive-site.xml,但后来不断报错,就把linux中/etc/hive/conf.cloudera.hive/下的配置文件全部复制过来
这个目录下有所有的配置文件:/etc/hive/conf.cloudera.hive/

3. 虚拟机和windows时间要相同

虚拟机和windows时间要相同,否则Caused by: KrbException: Identifier doesn’t match expected value
the NTP socket is in use, exiting
https://blog.csdn.net/ytp151730/article/details/48373679/
在这里插入图片描述

4. Hive support because Hive classes are not found

导入spark_hive的依赖,注意version是spark的版本号,不是hive的,而且这个版本号要跟spark的版本号严格对应,否则报错

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-hive_2.11</artifactId>
    <version>2.2.0</version>
    <scope>${unify.scope}</scope>
</dependency>

5. (null) entry in command string: null chmod

6. java.lang.UnsatisfiedLinkError:

https://blog.csdn.net/Vector97/article/details/99695838
在这里插入图片描述

7. 在本地找个地方复制hadoop的bin目录,注意不需要像有些blog说的那样在windows启动hadoop,只需要把bin目录的东西复制到位,然后设置HADOOP_HOME 并在path设置%HADOOP_HOME%\bin的env。注意,设完之后要重启IDE

https://www.cnblogs.com/tijun/p/7567664.html
https://github.com/sdravida/hadoop2.6_Win_x64

8. ExitCodeException exitCode=-1073741515:

https://blog.csdn.net/psp0001060/article/details/83057663
一开始只下了2个dll,不起作用,根据这篇blog直接下载全部的c++合集并安装,就可以正常使用windows的idea中的spark连接虚拟机中的hive了

代码

1. resources目录

在这里插入图片描述

2. krb5.ini

includedir /etc/krb5.conf.d/
; 日志文件路径
[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log
[libdefaults]
 dns_lookup_realm = false
 ; 这个的作用跟kdc.conf中的max_life和max_renewable_life = 7d相同,但作用域不同。server上的管理当前realm,这里配的是default_realm
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true
 rdns = false
 pkinit_anchors = /etc/pki/tls/certs/ca-bundle.crt
 ; 这个默认注释,一般解开,这样认证时就不用写realm名字
 default_realm = XYYH.COM
 ; 这个要注释掉
 ;default_ccache_name = KEYRING:persistent:%{uid}
 ; 禁用udp,防止报错
 udp_preference_limit = 1
; 客户端访问server,需要有realm的信息
[realms]
 XYYH.COM = {
  kdc = node101
  ; KDC中数据库的地址
  admin_server = node101
 }
; kerberos能管理多个realm,服务和realm需要建立映射,这里通过域名和realm的映射来实现。如果只有1个realm,这里就不用配置
[domain_realm]
 .xyyh.com = XYYH.COM
 xyyh.com = XYYH.COM

3. krb5.conf

includedir /etc/krb5.conf.d/
# 日志文件路径
[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log
[libdefaults]
 dns_lookup_realm = false
 # 这个的作用跟kdc.conf中的max_life和max_renewable_life = 7d相同,但作用域不同。server上的管理当前realm,这里配的是default_realm
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true
 rdns = false
 pkinit_anchors = /etc/pki/tls/certs/ca-bundle.crt
 # 这个默认注释,一般解开,这样认证时就不用写realm名字
 default_realm = XYYH.COM
 # 这个要注释掉
 #default_ccache_name = KEYRING:persistent:%{uid}
 # 禁用udp,防止报错
 udp_preference_limit = 1
# 客户端访问server,需要有realm的信息
[realms]
 XYYH.COM = {
  kdc = node101
  # KDC中数据库的地址
  admin_server = node101
 }
# kerberos能管理多个realm,服务和realm需要建立映射,这里通过域名和realm的映射来实现。如果只有1个realm,这里就不用配置
[domain_realm]
 .xyyh.com = XYYH.COM
 xyyh.com = XYYH.COM

4. 代码

object WinConLin {
  val log = LoggerFactory.getLogger(classOf[WinConLin])

  def main(args: Array[String]): Unit = {
    /*
    环境
     */
    KerberosAuthen.kerberosAuthen()

    val sparkSession = SparkSession.builder()
      .appName("WinConLin")
      .master("local[*]")
      //.config("spark.sql.warehouse.dir", "./wh") 不需要配置,默认/user/hive/warehouse,这里的路径是hdfs上的路径,如果是相对,则父目录是/user/hive
      .enableHiveSupport()
      .getOrCreate()
    val fs = FileSystem.get(sparkSession.sparkContext.hadoopConfiguration)
    val iter = fs.listFiles(new Path("/user"), false)
    while (iter.hasNext) {
      log.error(iter.next().getPath.toString)
    }
    println(fs.getScheme)



    val df1 = sparkSession.sql("show databases")
    df1.show()
}

需求2:linux单机模式

在linux中单个节点上装spark用来测试,但这样实际上没有直接在windows的idea中方便spark-在windows中连接虚拟机中cdh集群的hdfs和hive
spark仅仅是个计算引擎,它强依赖于文件系统,比如hdfs。测试时没必要为了spark单独装个hadoop,所以spark官网提供了带编译好hadoop的spark
在这里插入图片描述
https://zhuanlan.zhihu.com/p/125549332?utm_source=wechat_session&utm_medium=social&utm_oi=939469651441332224

tips

spark单机版也是有UI的,在idea启动后,在windows的浏览器中输入localhost:4040就可以访问。方便测试。
spark单机版的任务往往运行的比较快,可以在代码sparkContext.stop()前面 加入Thread.sleep(50000)来延长UI的时间。

package com.xxxx.sparkPI

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object SparkDepTest {
  def main(args: Array[String]): Unit = {
    //搭建环境
    val sparkConf = new SparkConf().setMaster("local[2]").setAppName(this.getClass.getSimpleName)
    val sparkContext = new SparkContext(sparkConf)
    val rdd = sparkContext.makeRDD(List(1, 2, 3, 4, 5), 5).map(_ + 1)
    

    println(rdd.getNumPartitions)
    //val rdd2: RDD[Int] = rdd.coalesce(1)
     val rdd2: RDD[Int] = rdd.repartition(5)
    println(rdd2.getNumPartitions)

    rdd2.foreach(println(_))
    Thread.sleep(50000)
    sparkContext.stop()
  }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值