成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Apache Spark源碼走讀:如何進行代碼跟讀

云計算 Spark
今天不談Spark中什么復雜的技術實現,只稍為聊聊如何進行代碼跟讀。眾所周知,Spark使用scala進行開發,由于scala有眾多的語法糖,很多時候代碼跟著跟著就覺著線索跟丟掉了,另外Spark基于Akka來進行消息交互,那如何知道誰是接收方呢?

概要

今天不談Spark中什么復雜的技術實現,只稍為聊聊如何進行代碼跟讀。眾所周知,Spark使用scala進行開發,由于scala有眾多的語法糖,很多時候代碼跟著跟著就覺著線索跟丟掉了,另外Spark基于Akka來進行消息交互,那如何知道誰是接收方呢?

new Throwable().printStackTrace

代碼跟讀的時候,經常會借助于日志,針對日志中輸出的每一句,我們都很想知道它們的調用者是誰。但有時苦于對spark系統的了解程度不深,或者對scala認識不夠,一時半會之內無法找到答案,那么有沒有什么簡便的辦法呢?

我的辦法就是在日志出現的地方加入下面一句話

  1. new Throwable().printStackTrace() 

現在舉一個實際的例子來說明問題。

比如我們在啟動spark-shell之后,輸入一句非常簡單的sc.textFile("README.md"),會輸出下述的log

  1. 14/07/05 19:53:27 INFO MemoryStore: ensureFreeSpace(32816) called with curMem=0, maxMem=308910489 
  2. 14/07/05 19:53:27 INFO MemoryStore: Block broadcast_0 stored as values in memory (estimated size 32.0 KB, free 294.6 MB)  
  3. 14/07/05 19:53:27 DEBUG BlockManager: Put block broadcast_0 locally took  78 ms  
  4. 14/07/05 19:53:27 DEBUG BlockManager: Putting block broadcast_0 without replication took  79 ms  
  5. res0: org.apache.spark.rdd.RDD[String] = README.md MappedRDD[1] at textFile at :13 

那我很想知道是第二句日志所在的tryToPut函數是被誰調用的該怎么辦?

辦法就是打開MemoryStore.scala,找到下述語句

  1. logInfo("Block %s stored as %s in memory (estimated size %s, free %s)".format(  
  2.           blockId, valuesOrBytes, Utils.bytesToString(size), Utils.bytesToString(freeMemory)))  

在這句話之上,添加如下語句

  1. new Throwable().printStackTrace() 

然后,重新進行源碼編譯

  1. sbt/sbt assembly 

再次打開spark-shell,執行sc.textFile("README.md"),就可以得到如下輸出,從中可以清楚知道tryToPut的調用者是誰

  1. 14/07/05 19:53:27 INFO MemoryStore: ensureFreeSpace(32816) called with curMem=0, maxMem=308910489 
  2. 14/07/05 19:53:27 WARN MemoryStore: just show the calltrace by entering some modified code  
  3. java.lang.Throwable  
  4.   at org.apache.spark.storage.MemoryStore.tryToPut(MemoryStore.scala:182)  
  5.   at org.apache.spark.storage.MemoryStore.putValues(MemoryStore.scala:76)  
  6.   at org.apache.spark.storage.MemoryStore.putValues(MemoryStore.scala:92)  
  7.   at org.apache.spark.storage.BlockManager.doPut(BlockManager.scala:699)  
  8.   at org.apache.spark.storage.BlockManager.put(BlockManager.scala:570)  
  9.   at org.apache.spark.storage.BlockManager.putSingle(BlockManager.scala:821)  
  10.   at org.apache.spark.broadcast.HttpBroadcast.(HttpBroadcast.scala:52)  
  11.   at org.apache.spark.broadcast.HttpBroadcastFactory.newBroadcast(HttpBroadcastFactory.scala:35)  
  12.   at org.apache.spark.broadcast.HttpBroadcastFactory.newBroadcast(HttpBroadcastFactory.scala:29)  
  13.   at org.apache.spark.broadcast.BroadcastManager.newBroadcast(BroadcastManager.scala:62)  
  14.   at org.apache.spark.SparkContext.broadcast(SparkContext.scala:787)  
  15.   at org.apache.spark.SparkContext.hadoopFile(SparkContext.scala:556)  
  16.   at org.apache.spark.SparkContext.textFile(SparkContext.scala:468)  
  17.   at $line5.$read$$iwC$$iwC$$iwC$$iwC.(:13)  
  18.   at $line5.$read$$iwC$$iwC$$iwC.(:18)  
  19.   at $line5.$read$$iwC$$iwC.(:20)  
  20.   at $line5.$read$$iwC.(:22)  
  21.   at $line5.$read.(:24)  
  22.   at $line5.$read$.(:28)  
  23.   at $line5.$read$.()  
  24.   at $line5.$eval$.(:7)  
  25.   at $line5.$eval$.()  
  26.   at $line5.$eval.$print()  
  27.   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
  28.   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)  
  29.   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)  
  30.   at java.lang.reflect.Method.invoke(Method.java:483)  
  31.   at org.apache.spark.repl.SparkIMain$ReadEvalPrint.call(SparkIMain.scala:788)  
  32.   at org.apache.spark.repl.SparkIMain$Request.loadAndRun(SparkIMain.scala:1056)  
  33.   at org.apache.spark.repl.SparkIMain.loadAndRunReq$1(SparkIMain.scala:614)  
  34.   at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:645)  
  35.   at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:609)  
  36.   at org.apache.spark.repl.SparkILoop.reallyInterpret$1(SparkILoop.scala:796)  
  37.   at org.apache.spark.repl.SparkILoop.interpretStartingWith(SparkILoop.scala:841)  
  38.   at org.apache.spark.repl.SparkILoop.command(SparkILoop.scala:753)  
  39.   at org.apache.spark.repl.SparkILoop.processLine$1(SparkILoop.scala:601)  
  40.   at org.apache.spark.repl.SparkILoop.innerLoop$1(SparkILoop.scala:608)  
  41.   at org.apache.spark.repl.SparkILoop.loop(SparkILoop.scala:611)  
  42.   at org.apache.spark.repl.SparkILoop$$anonfun$process$1.apply$mcZ$sp(SparkILoop.scala:936)  
  43.   at org.apache.spark.repl.SparkILoop$$anonfun$process$1.apply(SparkILoop.scala:884)  
  44.   at org.apache.spark.repl.SparkILoop$$anonfun$process$1.apply(SparkILoop.scala:884)  
  45.   at scala.tools.nsc.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:135)  
  46.   at org.apache.spark.repl.SparkILoop.process(SparkILoop.scala:884)  
  47.   at org.apache.spark.repl.SparkILoop.process(SparkILoop.scala:982)  
  48.   at org.apache.spark.repl.Main$.main(Main.scala:31)  
  49.   at org.apache.spark.repl.Main.main(Main.scala)  
  50.   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
  51.   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)  
  52.   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)  
  53.   at java.lang.reflect.Method.invoke(Method.java:483)  
  54.   at org.apache.spark.deploy.SparkSubmit$.launch(SparkSubmit.scala:303)  
  55.   at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:55)  
  56.   at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)  
  57. 14/07/05 19:53:27 INFO MemoryStore: Block broadcast_0 stored as values in memory (estimated size 32.0 KB, free 294.6 MB)  
  58. 14/07/05 19:53:27 DEBUG BlockManager: Put block broadcast_0 locally took  78 ms  
  59. 14/07/05 19:53:27 DEBUG BlockManager: Putting block broadcast_0 without replication took  79 ms  
  60. res0: org.apache.spark.rdd.RDD[String] = README.md MappedRDD[1] at textFile at :13 

git同步

對代碼作了修改之后,如果并不想提交代碼,那該如何將***的內容同步到本地呢?

  1. git reset --hard  
  2. git pull origin master 

Akka消息跟蹤

追蹤消息的接收者是誰,相對來說比較容易,只要使用好grep就可以了,當然前提是要對actor model有一點點了解。

還是舉個實例吧,我們知道CoarseGrainedSchedulerBackend會發送LaunchTask消息出來,那么誰是接收方呢?只需要執行以下腳本即可。

  1. grep LaunchTask -r core/src/main 

 從如下的輸出中,可以清楚看出CoarseGrainedExecutorBackend是LaunchTask的接收方,接收到該函數之后的業務處理,只需要去看看接收方的receive函數即可。

  1. core/src/main/scala/org/apache/spark/executor/CoarseGrainedExecutorBackend.scala:    case LaunchTask(data) =>  
  2. core/src/main/scala/org/apache/spark/executor/CoarseGrainedExecutorBackend.scala:        logError("Received LaunchTask command but executor was null")  
  3. core/src/main/scala/org/apache/spark/scheduler/cluster/CoarseGrainedClusterMessage.scala:  case class LaunchTask(data: SerializableBuffer) extends CoarseGrainedClusterMessage  
  4. core/src/main/scala/org/apache/spark/scheduler/cluster/CoarseGrainedSchedulerBackend.scala:          executorActor(task.executorId) ! LaunchTask(new SerializableBuffer(serializedTask)) 

小結

今天的內容相對簡單,沒有技術含量,自己做個記述,免得時間久了,不記得。

責任編輯:林師授 來源: 徽滬一郎
相關推薦

2014-07-03 15:40:09

Apache Spar

2014-07-04 10:58:47

Apache Spar

2014-07-23 10:02:11

Spark源碼

2009-08-06 15:03:11

行虛擬機Apache設

2010-02-03 13:55:51

Python 代碼

2010-05-27 16:18:58

SVN設置

2010-06-02 10:10:26

SVN源碼管理

2010-03-16 14:41:06

Java Runnab

2010-05-28 12:55:23

2024-02-22 10:27:00

Python開發

2010-05-25 18:32:22

apache+svn+

2010-06-01 17:07:01

MySQL源碼

2012-10-15 09:30:04

CSSDIVWeb

2010-03-12 17:35:00

Python字符串

2010-03-16 10:32:36

Java線程撥號器

2010-05-19 15:00:18

Apache+SVN部

2017-08-10 15:31:57

Apache Spar TensorFlow

2010-02-01 10:21:36

Python編碼轉換

2010-02-22 16:05:40

Python配置

2010-06-03 11:01:32

Hadoop安裝部署
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品一区二区福利视频 | 玖玖综合网| 中文字幕一区二区三区四区五区 | 欧美一区二区三区国产精品 | 在线观看亚洲专区 | 久久精品16 | 99亚洲精品| 成人午夜影院 | 少妇一区在线观看 | 久在线观看 | 亚洲精品美女 | 亚洲一二三区精品 | 国产精品一区二区在线 | 一区在线观看 | 国产美女黄色 | 亚洲人成人一区二区在线观看 | 国产精品毛片无码 | 日日艹夜夜艹 | 亚洲精品乱码久久久久久按摩观 | 日韩av免费在线观看 | 国产精品久久久久久久久免费高清 | 欧美精品v | 亚洲欧美成人在线 | 毛片黄片免费看 | 成人在线播放网站 | 欧美一级黄带 | 日韩视频在线免费观看 | 国产人成在线观看 | 日韩精品一区二区三区第95 | 精品国产不卡一区二区三区 | 91精品国产综合久久久密闭 | 久久影院一区 | 国产女人第一次做爰毛片 | 91精品久久久久久久久中文字幕 | 超碰成人免费 | 亚洲 欧美 激情 另类 校园 | 色爱综合网 | 一区二区久久 | 亚洲精品一区二区 | 亚洲一区在线日韩在线深爱 | 日韩亚洲视频在线 |