IDEA远程运行Spark,解决unread block data和ClassNotFoundException

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名称,不用管

问题解决

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值