需求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()
}
}