Intel Pin抓取Hadoop 和Spark 中java进程

来源:互联网 发布:js高德地图api接口 编辑:程序博客网 时间:2024/06/05 09:40
一.核心理论知识:
  Intel Pin 是intel 推出的一款优秀的二进制可执行代码分析框架,它支android ,Linux,OSx和Windows 等诸多操作系统,并且提供了能在IA-32,Intel(R)64,和集成多核的Intel(R)系列架构上运行的二进制可执行文件,可以用于构建强大的动态程序分析工具。
  Pin 工具允许一个其自身所带的二进制代码分析工具插入到一个可执行二进制代码的任意部分,这些pintool工具大多都是用C或者C++写的,包含在pin 安装报的SimpleExamles中,而这个过程则是在宿主二进制代码执行时候动态添加的,这也使得Intel Pin 工具能够嵌入到任何一个正在运行的进程。
  Intel Pin 提供了丰富的API,这些API抽象了底层指令集的诸多设置特性,并且允许指令集信息中诸如寄存器信息作为传递参数随pintools代码一起注入到宿主代码中。
  Intel Pin能够动态的保存和恢复被注入代码重写的寄存器,以使得二进制应用可执行代码能够继续工作,其有限的存取信息和调试信息在我们学习和调试代码的过程中可以被使用。
  Intel Pin 包含了大量的pintools实例源码,像基本的块分析工具,高速缓存模拟分析工具,指令trace分析工具,都能在Pin包中找到相应的源码。这使得根据现有实例分析工具生成新的功能更为强大的其他功能分析工具的过程变得相对简单。
  学习Intel Pin 工具的过程中最重要的概念就是pintools 和intel pin工具的使用原理。
  这里先说明下intel pin 工具的使用原理:
  其原理大致是Intel Pin在可执行二进制代码中插入一些探测函数,用于观察、记录、分析宿主代码执行过程中的一些与计算机体系结构相关的特性,如访存指令,寄存器内容,寄存器地址等,通过Pin提供的API可以编写各种分析函数,这样程序运行完以后,统计和分析结果也同时产生,阅读各种pintools 的 .so生成的各类.out 文件,并最终根据.out输出文件,处理这些数据,分析数据处理结果,获取有价值的学术成果和科研结论,并将其应用于整个计算机体系结构的技术革新和进步。
  而所谓的pintools,通俗的讲,就是一些pin 工具分析二进制可执行文件的时候附加的插件,正是在二进制执行代码中插入了这些插件,才能在相应的.out文件中获得trace结果,并最终对trace结果进行数据分析。
二.Intel Pin安装环境搭建:
  在计算所学习的过程中,你会发现,所有的人都会劝诫你使用google,因此刚来学习,最好先养成独立使用google搜索资料的习惯,在这里,还有一个特别的地方,就是你所需要的学习资源基本都是纯英文,因此,你还应该养成一个主动去阅读英文Wiki 的习惯,当然,如果你天生就有学习英语的优秀基因和绝对英语优势,那么在这儿,你会觉得你比我这样的门外汉更合适。
  1.在google中搜索 “Intel Pin”(注,以后将google搜索的,实际搜索过程中都应该去“”号) 运气好的话通常第一个网页就是你要的“Pin-A Dynamic Binary Instrumentation Tool…”看到一个很显眼的带光驱图标向下箭头“Download Now”点击Linux 的Compiler Kit列,下载最新的Pin 安装包(我当时下载的是62732的Compiler Kit)下载下来直接安装即可。
  由于当时使用的版本中存在着使用-pid抓取进程的过程无法实现,且问题一直没有解决,不过找到了另一种替代方案,如果想要尝试-pid 抓取进程的实验过程,个人建议直接使用江老师给提供的压缩包。 
  下载地址:https://software.intel.com/en-us/articles/pintool-downloads
  
  2.在linux 机解压后,就可以进行下一步了,由于向别人借来pin压缩有可能发生多层打包找不到pin包主目录的问题,解压后首先要找的是一个文件和一个目录,即处于同一目录的一个名为Pin的 执行脚本和一个source目录,如果找到了,那么你所在的当前目录就是pin 的主目录,运行 “./pin  –version 便能找到你pin包的版本信息”。
  3.  cd  /source/tools ;
      ls  
  可以看到一个SimpleExamples 目录,这个目录也就是Pintools Examples 源码目录,也是以后使用Pin工具主要的一个目录, 
  cd  SimpleExamples;
  除了可以看到pintools 程序源码,还有一个makefile 文件,执行make 命令,生成pintools 工具目录obj-ia32(注此目录会因版本问题而存在不同,不过目录前缀都为obj-,编译时留心),
  Make
  cd  obj-ia32
  其中的.so 文件便是所谓的pintools,重点关注的pinatrace.so ,其他工具感兴趣或有时间可以深入学习。
  注:make 步骤比不可少
  检测安装是否正确的方法:
全路径目录/pin主目录/pin  -t  全路径目录/Pin主目录/source/tools/SimpleExamples/[obj-自己版本目录]/pinatrace.so  — — [一个空格] [二进制执行脚本,初学者可尝试跟ls]
 注:如果未运行成功,则在 pin 脚本之后 ,–t 参数前再添加一行参数 –injection child。 
  
三.Intel Pin主要实验内容和学习知识:
1主要学习资源:https://software.intel.com/sites/landingpage/pintool/docs/61206/Pin/html/
实验前应先看一遍pin 包主目录中的README中的内容。
2.主要学习的部分:
Pin 工具的命令格式如下:
<Pin executable> <pin options> -t <Pin tool> -support_jit_api <Other Pin tool options> -- <Test application> <Test application options>

在pin包主目录中执行:
./pin –help 
    得到pin工具的option参数项,结合上面给的学习资源网站中Examles中的实例了解和掌握这些参数项以及Pin 工具的pinatrace.so 的使用方法。
以下是自己使用过的一个pintools 生成.out 文件的过程:
./pin -t source/tools/SimpleExamples/obj-intel64/pinatrace.so -logfile mytest/calltrace_log.log -profile -- ./mytest/pin_test_hello   
执行完后,在当前目录下生成一个pinatrace.out 的文件。
实践中使用的pintools 全部在
/home/wangwei/pin_zhuaqu_trace/pin-2.12-58423-gcc.4.4.7-linux/source/tools/SimpleExamples/obj-intel64 之中,有22个之多,自己试过的有4,5个,命令格式大同小异,只是生成的.out的内容却是十分的不同。
注:学习的重点和任务主要是pinatrace.so 工具的灵活使用,学习的主要来源是linux Pin包和上面提供的学习网站。
Intel Pin 

第二章Hadoop 核心理论知识和技术实践
一.核心理论知识:
  Hadoop 相关理论知识学习和对Hadoop的理解:
  Hadoop 是什么?业界人士喜欢称它为一款优秀的开源数据处理框架,的确,谈它就不能不谈“数据”,就不能不谈开源。Hadoop 通俗点讲,它就两个主要功能:存储数据和分析数据。存储数据,核心代表:HDFS ,即分布式文件系统;分析数据,核心代表Map/Reduce;而连接两者的,正是数据,促进这项技术成长的,正是开源;Hadoop 是把牛刀,区别于普通的能够以数据结构定义的数据,它主要针对的对象是大数据;那什么是“大数据”?大数据主要有四个特点:数据量大,数据种类丰富,数据处理速度快,数据背后的潜藏价值,且大数据一般都没有固定的数据结构。
  HDFS:分布式文件系统,核心理论:数据文件分块存贮,冗余数据备份存储块。Map 和Reduce像是数据接口,分别负责读入待处理数据和输出已处理结果数据。
  Hadoop 五大核心进程: Namenode 进程:HDFS文件系统管理者,记录数据块位置信息;Datanode 进程:数据存储结点;Secondary Namenode:HDFS 容错,Namenode 数据备份;JobTracker 进程,生成job ,接收job ,统管map/reduce;TaskTracker 进程,执行JobTracker分配的单个map/reduce 任务。  
二.Hadoop安装环境搭建:
  1.安装版本:hadoop 1.2.1,据小姜老师说计算所实验室也用的是这个版本
软件下载地址:http://archive.apache.org/dist/hadoop/core/hadoop-1.2.1/
下载 hadoop-1.2.1-bin.tar.gz 36M
下载后直接在linux 机上进行解压缩;
  Hadoop 安装不难,难在配置conf 中的配置文件,具体配置文件参考官网,官网配置文件如下:
  http://hadoop.apache.org/docs/r1.2.1/single_node_setup.html
  仿照官网进行配置即可;
  注:如果linux 机上未安装java jdk ,应提前安装jdk,jdk 建议使用openjdk7,因为后面项目中会经常使用到 jps 命令,这个命令只能是在java版本安装正确的前提下才可能得到。
  Hadoop 技术相对成熟,学习资源较丰富,可以在google上找你想要的学习资源,下面仅提供自己在学习过程中使用到的apache hadoop 学习网站:
  http://hadoop.apache.org/docs/r1.2.1/single_node_setup.html
  主要学习内容为网站中的documentation 和wiki.
三.Hadoop主要实验内容和学习知识: 
  Hadoop bin 目录各个启动脚本和关闭脚本的使用方法,主要的三个脚本,start-all.sh,stop-all.sh,hadoop-daemons.sh; 
  Hadoop bin 目录中hadoop 脚本的使用方法,重要的参数项 fs  [-cat ,-ls ,-put,-get,-mkdir,-rmr,-rm,-dus];  jar  [hadoop 目录自带包或自己生成包名]  [包中类名]  [作业hdfs 路径]  [作业处理完成hdfs路径];
  Hadoop conf目录中hadoop-env.sh(jdk),core-site.xml(hdfs 9000),mapred-site.xml(job tracker),hdfs-site.xml(republication),masters,slavers。
  Hadoop logs 目录中出错信息的查找与读取。
Hadoop 运行实例 WordCount:
hadoop@ubuntu:/usr/local/hadoop/bin$ ./hadoop fs -put ../readme.txt ../input/
hadoop@ubuntu:/usr/local/hadoop/bin$ ./hadoop jar ../wordcount.jar  com.felix.WordCount ../input/ ../output/
hadoop@ubuntu:/usr/local/hadoop/bin$ ./hadoop dfs -cat ../output/part-00000 
Hadoop 1
Hello 1

第三章Spark 核心理论知识与技术实践
一.核心理论知识:
  Spark 相关理论知识学习和对Hadoop的理解 :
  Spark学起来相对比较轻松, 除了其本身具有和Hadoop理论知识第一段讲的如大数据,开源等诸多特点,其本身也是一款优秀的大数据存储分析框架,和hadoop 有着惊人的相似,如果不是业界专门给了这么两个长像不相同的概念,真想说一句“Spark就是Hadoop”,打开apache Spark学习官网,有这么一句很显眼的话“Run programs up to 100x faster than Hadoop MapReduce in memory, or 10x faster on disk”,业界喜欢拿“百倍Hadoop处理速度,亚十倍Hadoop处理代码”来盛赞Spark,可能因为是初学这两个专题技术的原因吧,对于Spark到底快在哪儿,数据处理代码到底少在哪儿,尚不能够分辨,要说快,倒是在spark的sbin目录启动start-all.sh 和stop-all.sh脚本的时候速度比hadoop 快,至于说数据处理代码少,那也只能说Spark 支持的scala语言人家本身代码量就很少,官网spark 实例一共支持三种运行方式,即Scala,Python,Java,以实例处理代码量由小到大排名:Scala<Python<Java,不过这并不代表代码量小,学习周期就小,Spark 和Hadoop 数据分析方面,熟优熟劣,熟好熟坏,可能真得不断深入的学习实践,才能慢慢体会得到。
  Spark启动过程中包括两个进程,即Master 和Worker,Master 进程负责接收分配任务,Worker 负责处理各个子任务,当Worker将各个任务处理完成之后,将结果返回给Master.

二.Spark安装环境搭建:
  有了 Hadoop 的基础,Spark的学习和安装就相对简单多了,下面为Spark 的主要学习和下载网站。
下载网站:http://spark.apache.org/downloads.html 
  到官网下载编译过的Spark 最新版在本地linux机解压缩即可,我用的是spark 0.9.1。
  相比Hadoop ,Spark 的可配置的东西就少很多,
  进入spark 主目录,再进入其conf 目录: cd  conf
使用mv 指令:“mv  spark-env.sh.template  spark-env.sh”
主要添加4个环境变量:
JAVA_HOME=”openjdk 7 的安装路径”
SCALA_HOME=”scala 的安装路径”
HADOOP_HOME=”hadoop主目录绝对安装路径”
SPARK_HOME=”Spark 主目录绝对安装路径”
网上安装环境配置很多,不会的网上搜一下spark 配置。
如果没有安装scala ,可以先到官网下载安装包,在本机linux 机解压缩即可。
Scala 下载网站:http://www.scala-lang.org/
下载最新版,我用的是scala 2.10.0。

三.Spark主要实验内容和学习知识:
  Spark sbin 目录各个启动脚本和关闭脚本的使用方法,主要包括的脚本,start-all.sh,stop-all.sh,spark-daemons.sh,start-master.sh,start-slave.sh.
  Spark 配置文件比较简单,主要配置的文件仅为spark-env.sh和slaves,主要配置的参数项为四个,即JAVA_HOME,SCALA_HOME,HADOOP_HOME,SPARK_HOME,salves配置为默认的locolhost即可。
Spark bin 目录中启动spark-shell 运行scala 函数实例的方法,初步尝试的两个能用spark-shell 运行实例的方法:
scala> val textFile = sc.textFile("readme.txt")
scala> textFile.count() 
统计一个文件中一共有多少行代码;
val linesWithSpark = textFile.filter(line => line.contains("Hello"))
过滤出文件中包含“Hello”的行数。
val file = spark.textFile("hdfs://localhost:9000/user/hadoop/input/readme.txt ")
val counts = file.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey(_ + _)
counts.saveAsTextFile("hdfs://localhost:9000/user/hadoop/output/part-00000")
   Spark中wordCount 的使用方法。

第四章Intel Pin抓取Spark中java进程访存trace
一.核心理论知识:
  Intel Pin 抓取Spark 中java 进程访存trace 主要用到前三章讲的关于Intel Pin,Hadoop 和Spark 的理论知识,只不过由于自己本机安装的intel pin 的-pid 方式访问进程的方法不能实现,抓取Spark 中Java进程过程中通过 常规的intel Pin 方法抓取到的仅是Spark 启动脚本的trace,不过很让人意外的是,Hadoop 中start-all.sh 和Spark 中start-all.sh 脚本启动时,抓不到的pinatrace.out文件都是4.2M,但两个脚本运行的时间长短明显不相同,不知道这两个脚本是不是真的是一样的。
  因此,要想真正用 Intel Pin 工具自动在Spark的 start-all.sh脚本启动时抓到Spark 中的java 进程,必须要对Spark 中的部分shell 脚本进行重写,重新添加的shell 脚本主要考虑到三方面的内容:
如何保证Spark 的start-all.sh脚本每次启动时便自动trace 到java进程的结果。
如何能够将Spark的start-all.sh 脚本启动时的Master 和Worker 两个java进程trace结果分离,即如何制定有效的trace.out命名机制以启动脚本时便动态的分离出两个java 进程的trace.out结果。
如何集中处理trace到的数据以方便进行管理。
  在制定Intel  Pin抓取Spark中java 进程访存trace的过程中,最终得到一个比较满意的可行性方案,并成功将Master 和Worker的trace.out进行了成功的分离。在此,不得不佩服他对整个计算机体系运行机理的醇厚技术底蕴以及敏锐的感知力和洞察力。
二.Intel Pin 的Spark实验环境搭建:
 
要改Spark 源码,首选要做的便是如何定位spark 的程序源码,缩小修改范围,最终才能决定该如何进行修改,本人整个一头雾水,即便给了解决方案,可能也无从下手,最终将修改部分定位到了Spark 的bin 目录下的spark-class脚本的最后一行“ exec "$RUNNER" -cp "$CLASSPATH" $JAVA_OPTS "$@”。
找到了修改位置,便开始解决Spark shell 脚本启动直接抓取trace的问题,解决方案如下:“exec /home/hadoop/software/pin/pin -injection child -t /home/hadoop/software/pin/source/tools/SimpleExamples/obj-ia32/pinatrace.so -o spark_trace_$RUNN    ER\_$CLASSPATH\_$JAVA_OPTS\_$@.out  -- "$RUNNER" -cp "$CLASSPATH" $JAVA_OPTS     "$@”
设置完这一步以后,保存重启Spark的start-all.sh后,运行jps命令,这时Master 和Worker的两个进程将不能正常启动,但top 命令查看进程,可以看到两个java进程已成功启动,生成的pinatrace.out在spark主目录,抓到的pinatrace.out 达2.5G,如果本机硬盘分区太小的话,建议提前用kill 命令杀死两个java进程。
接下来便是如何根据启动的java进程的不同动态的设置pinatrace.out,提出写个动态重命名脚本,格式为”pinatrace_$NAME(Master|Worker)_$Time(日期时间戳).out”,可以根据启动的Master 和Worker脚本的不同动态的生成pinatrace.out
本人设计的脚本如下:
   realname="${@##*.}"
   158 echo "$realname"
   159 finalname="${realname:0:6}"
   160 echo "$finalname"
   161 #touch spark_trace_$finalname.out
   162 echo "name:spark_trace_$realname.out"
   163 time=`date +%Y-%m-%d-%H:%M:%S`
   164 echo"$time"
   165trace_name=/usr/local/spark/tracedates/spark_trace_$finalname\_$time.out
  166 echo "trace_name:$trace_name"
  此段脚本直接写到spark的bin目录的spark-class脚本中,最后一行“
  #exec "$RUNNER" -cp "$CLASSPATH" $JAVA_OPTS "$@”之前即可。
最后便是如何如何进行统一管理trace 的问题,我在自己spark主目录中建了tracedates目录,如果想将trace数据生成到别的目录,则还应该替换3中的trace_name为:
trace_name=/存储trace数据绝对路径/spark_trace_$finalname\_$time.out


参考文献
[1]https://software.intel.com/sites/landingpage/pintool/docs/61206/Pin/html/index.html#EXAMPLES
[2] http://hadoop.apache.org/docs/r1.2.1/single_node_setup.html
[3] http://spark.apache.org/examples.html
0 0
原创粉丝点击