1.解决java.lang.IllegalStateException: unread block data
项目本身是使用Spark连接Hbase,现在写到进行一个简单的Get获取Hbase中'Watch'表的内容,连接Hbase和put/get之类都是很简单的问题。进行完各种依赖添加、xml编写、maven更新后,使用如下配置
val sparkConf = new SparkConf().setAppName("HbaseGet")
.setMaster("local[2]")
.setJars(Seq("/root/IdeaProjects/SparkHbaseTest/out/artifacts/SparkHbaseTest_jar/SparkHbaseTest.jar"))
进行本地测试,没有任何问题。
然而,在使用
val sparkConf = new SparkConf().setAppName("HbaseGet")
.setMaster("spark://Master:7077")
.setJars(Seq("/root/IdeaProjects/SparkHbaseTest/out/artifacts/SparkHbaseTest_jar/SparkHbaseTest.jar"))
(区别在于local[2]是本地集群提交任务运行,spark://是远程提交到master集群运行)
时出现了
java.lang.IllegalStateException: unread block data问题,参考以下文章得到了解决方案
https://blog.csdn.net/gorocks/article/details/79360038
问题出在远程提交时,实际上本机java(作为driver)无法获取相关jar包,执行到某一步时程序不知道该做什么
修改代码,将相关运行包(类似maven依赖)一起远程提交到集群运行,如下:
val sparkConf = new SparkConf().setAppName("HbaseGet")
//.setMaster("local[2]") //local ok
.setMaster("spark://Master:7077")
.setJars(Seq("/usr/local/hbase/lib/hbase-client-1.0.3.jar",
"/usr/local/hbase/lib/hbase-common-1.0.3.jar",
"/usr/local/hbase/lib/hbase-server-1.0.3.jar",
"/usr/local/hbase/lib/hbase-protocol-1.0.3.jar",
"/usr/local/hbase/lib/guava-12.0.1.jar",
"/usr/local/hbase/lib/htrace-core-3.1.0-incubating.jar",
"/usr/local/hbase/lib/metrics-core-2.2.0.jar",
"/usr/local/hbase/lib/zookeeper-3.4.6.jar",
"/root/IdeaProjects/SparkHbaseTest/out/artifacts/SparkHbaseTest_jar/SparkHbaseTest.jar"))
2.解决ClassNotFoundException
在解决了unread block data后,又遇到了这个问题,经过多方查阅资料,观察到error日志中其实是找不到最主要的scala编译class,导致不能运行,但是我bulid的artifacts里面明明包含了这个文件,猜测会不会是jars目录等级的问题
——就是说,由于我build artifacts其实包含了三个等级的目录,编译生成output目录(文件目录)、SDK或者JDK(本身就是jars,又被放在了SDK目录下)、使用的lib目录(包含很多个jar);而spark运行其实只需要一个output中的.class,在搜索了最高级目录的众多jar没有找到后,停止搜索其他目录?(只是个人推测)
所以修改build artifacts内容,让生成的Output Layout中只剩下META-INF和compile output,META-INF上面的SparkHbaseTest.jar是要生成的artifacts名称,不用管
问题解决