代码改变世界

工作随笔-20171012

2017-10-13 17:08  轩脉刃  阅读(633)  评论(0编辑  收藏  举报

scala在idea中本地运行遇到问题:

17/10/12 17:09:43 INFO storage.DiskBlockManager: Created local directory at /private/var/folders/bv/0tp4dw1n5tl9cxpc6dg2jy180000gp/T/blockmgr-0b0bf3cf-dd77-4bb4-97dc-60d6a65a35ae
Exception in thread "main" java.lang.ExceptionInInitializerError
     at org.apache.spark.storage.DiskBlockManager.addShutdownHook(DiskBlockManager.scala:147)
     at org.apache.spark.storage.DiskBlockManager.<init>(DiskBlockManager.scala:54)
     at org.apache.spark.storage.BlockManager.<init>(BlockManager.scala:78)
     at org.apache.spark.SparkEnv$.create(SparkEnv.scala:365)
     at org.apache.spark.SparkEnv$.createDriverEnv(SparkEnv.scala:193)
     at org.apache.spark.SparkContext.createSparkEnv(SparkContext.scala:288)
     at org.apache.spark.SparkContext.<init>(SparkContext.scala:457)
     at com.didichuxing.scala.BenchMarkMain$.main(BenchMarkMain.scala:21)
     at com.didichuxing.scala.BenchMarkMain.main(BenchMarkMain.scala)
Caused by: java.lang.NoSuchFieldException: SHUTDOWN_HOOK_PRIORITY
     at java.lang.Class.getField(Class.java:1695)
     at org.apache.spark.util.SparkShutdownHookManager.install(ShutdownHookManager.scala:223)
     at org.apache.spark.util.ShutdownHookManager$.shutdownHooks$lzycompute(ShutdownHookManager.scala:50)
     at org.apache.spark.util.ShutdownHookManager$.shutdownHooks(ShutdownHookManager.scala:48)
     at org.apache.spark.util.ShutdownHookManager$.addShutdownHook(ShutdownHookManager.scala:191)
     at org.apache.spark.util.ShutdownHookManager$.<init>(ShutdownHookManager.scala:58)
     at org.apache.spark.util.ShutdownHookManager$.<clinit>(ShutdownHookManager.scala)
     ... 9 more

查看这个帖子:
https://forums.databricks.com/questions/2227/shutdown-hook-priority-javalangnosuchfieldexceptio.html

貌似说的是运行在老版本的spark上

我的本地并没有安装spark,是否是这个原因?

看了这个帖子,感觉确实是这个问题。需要指定跑的spark,可以是远端的,也可以是local的。

export SPARK_SUBMIT_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=7777

但是我本地和开发机器上没有spark,所以就不能本地调试了,需要在服务上使用spark-shell进行手动调试。

=================================

最快的进行调试和开发spark的方法是什么?

现在线上有一个spark集群,只能通过线上机器上的spark客户端进行连接,最快的方法应该是在spark客户端机器上进行开发,然后mvn打包,然后使用spark-submit,在local下面,这个应该是最快的方法了。

根据文章:http://blog.csdn.net/lovehuangjiaju/article/details/49227919

要想搭建spark远程调试方法,需要先把jar包提交到spark客户端机器,然后使用submit开启一个端口,然后idea上连接远端,这个也是很麻烦的。

可能最方便的方法就是在客户端机器上开发了。可惜这样的话idea就有点鸡肋了。

这篇文章:http://www.eurekao.com/post/build-spark-environment-for-windows-base-on-docker.html

貌似可以本地搭建一个docker,然后在本地通过setJars的方法来进行直接调试。

这个以后再尝试。。。TODO

====================

如何通过rdd来进行合并?

使用到了rdd的union算子。不过今天遇到的问题是需要一个初始化的rdd。所以就使用到emptyRDD,但是这个是个范型的类型,需要初始化的时候定义下范型。

var rdd = sc.emptyRDD[FlowInfo]

========================

mvn中-DskipTests和-Dmaven.test.skip=true的区别?

主要区别在于是否编译测试用例类。

http://zephiruswt.blog.51cto.com/5193151/1302770

========================

如何使用spark-sql获取分位数字

可以使用spark-sql的方法:

val df = sqlContext.sql("select flowId, percentile_approx(duration, 0.95) as approxQuantile from flowInfos group by flowId")

这里使用到的percentile_approx可能不是所有spark-sql都支持,至少我尝试在spark-1.6版本下是不支持的。(错误)

org.apache.spark.sql.AnalysisException: undefined function percentile_approx

还以为是1.6不支持,原来是我的sqlContext不是创建的HiveContext,一些hive-sql的语法就不能使用

https://stackoverflow.com/questions/36171349/using-windowing-functions-in-spark/36172311#36172311

修改过来就可以了

val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)

========================

打的log没有打印在页面上?使用logInfo没有打印任何东西?

========================

EmptyRDD怎么使用和RDD进行join?

var rdd: org.apache.spark.rdd.RDD[FlowInfo] = sc.emptyRDD[FlowInfo]
...
rdd = rdd union trdd