自定义Hive Sql Job分析工具

前言

我们都知道,在大数据领域,Hive的出现帮我降低了许多使用Hadoop书写方式的学习成本.使用用户可以使用类似Sql的语法规则写明查询语句,从hive表数据中查询目标数据.最为重要的是这些sql语句会最终转化为map reduce作业进行处理.这也是Hive最强大的地方.可以简单的理解为Hive就是依托在Hadoop上的1个壳.但是这里有一点点小小的不同,不是每段hive查询sql语句与最后生成的job一一对应,如果你的这段sql是一个大sql,他在转化掉之后,会衍生出许多小job,这些小job是独立存在运行的,以不同的job名称进行区别,但是也会保留公共的job名称.所以一个问题来了,对于超级长的hive sql语句,我想查看到底是哪段子sql花费了我大量的执行时间,在JobHistory上只有每个子Job的运行时间,没有子Job对应的sql语句,一旦这个功能有了之后,就会帮助我们迅速的定位到问题所在.


Hive子Job中的Sql

OK,带着上述的目标,我们要想分析出到底哪段子sql所衍生的job运行时间更长,就要先知道这些sql到底在存在与哪里.在前面的描述中,已经提到了,Hive是依托于Hadoop,自然Hive提交的job信息也是保存在Hadoop的HDFS上的.在联想一下JobHistory中的各个文件类型.你应该会发现带有下面后缀的文件存在.


我们发现里面包含了之前分析过的.jhist文件,还有带conf字符的.xml格式文件,从文件名上来看就是job提交时的一些配置信息,然后我们用vim命令查阅conf.xml后缀的文件,看看里面是不是有我们想要的hive qury string 这样的属性


OK,目标算是找到了,这的确就是我们想要的属性.说明这样的信息的确是存在的,后面的操作就是怎么去解析这段有用的信息了.


程序工具分析Hive Sql Job

知道了目标数据源,我们能想到的最简单快速的方法就是逐行解析文件,做做文本匹配,筛选关键信息.这些代码谁都会写,首先要传入一个HDFS目录地址,这个是在JobHistory的存储目录上加上一个具体日期目录,这段解析程序在文章的末尾会加上.下面列举在调试分析程序时遇到的一些问题,这个还是比较有用的.

1.hive sql中的中文导致解析出现乱码

这个又是非常讨厌的java解析出现乱码的原因,因为考虑到sql中存在中文注释,而Hadoop在存中文的时候都是用utf8的编码方式,所以读出文件数据后进行一次转utf-8编码方式的处理,就是下面所示代码.

  1. ...
  2. fileSystem=path.getFileSystem(newConfiguration());
  3. in=fileSystem.open(path);
  4. InputStreamReaderisr;
  5. BufferedReaderbr;
  6. isr=newInputStreamReader(in,"UTF-8");
  7. br=newBufferedReader(isr);
  8. while((str=br.readLine())!=null){
  9. ...

2.单线程解析文件速度过慢

之前在测试环境中做文件解析看不出真实效果,文件一下解析就OK了,但是到真实环境中,多达几万个job文件,程序马上就吃不消了,算上解析文件,再把结果写入mysql,耗时达到60多分钟,后面改成了多线程的方式,后来开到10个线程去跑,速度才快了许多.


3.结果数据写入MySql过慢

后来处理速度是上去了,但是写入sql速度过慢,比如说,我有一次测试,开10个线程区解析,花了8分钟就解析好了几万个文件数据,但是插入数据库花了20分钟左右,而且量也就几万条语句.后来改成了批处理的方式,效果并没有什么大的改变,这个慢的问题具体并没有被解决掉,怀疑可能是因有些语句中存在超长的hive sql语句导致的.


下面是程序的主要分析代码,分为工具类代码,和解析线程类,代码全部链接再此处:https://github.com/linyiqun/yarn-jobhistory-crawler/tree/master/jobHiveSqlAnalyse

主工具代码

  1. packageorg.apache.hadoop.mapreduce.v2.hs.tool.sqlanalyse;
  2. importjava.io.BufferedReader;
  3. importjava.io.FileNotFoundException;
  4. importjava.io.IOException;
  5. importjava.io.InputStream;
  6. importjava.io.InputStreamReader;
  7. importjava.io.PrintStream;
  8. importjava.util.ArrayList;
  9. importjava.util.HashMap;
  10. importjava.util.LinkedList;
  11. importjava.util.List;
  12. importjava.util.Map.Entry;
  13. importorg.apache.hadoop.conf.Configuration;
  14. importorg.apache.hadoop.fs.FSDataInputStream;
  15. importorg.apache.hadoop.fs.FileContext;
  16. importorg.apache.hadoop.fs.FileStatus;
  17. importorg.apache.hadoop.fs.FileSystem;
  18. importorg.apache.hadoop.fs.Path;
  19. importorg.apache.hadoop.fs.RemoteIterator;
  20. importorg.apache.hadoop.fs.UnsupportedFileSystemException;
  21. importorg.apache.hadoop.io.IOUtils;
  22. publicclassHiveSqlAnalyseTool{
  23. privateintthreadNum;
  24. privateStringdirType;
  25. privateStringjobHistoryPath;
  26. privateFileContextdoneDirFc;
  27. privatePathdoneDirPrefixPath;
  28. privateLinkedList<FileStatus>fileStatusList;
  29. privateHashMap<String,String[]>dataInfos;
  30. privateDbClientdbClient;
  31. publicHiveSqlAnalyseTool(StringdirType,StringjobHistoryPath,
  32. intthreadNum){
  33. this.threadNum=threadNum;
  34. this.dirType=dirType;
  35. this.jobHistoryPath=jobHistoryPath;
  36. this.dataInfos=newHashMap<String,String[]>();
  37. this.fileStatusList=newLinkedList<FileStatus>();
  38. this.dbClient=newDbClient(BaseValues.DB_URL,
  39. BaseValues.DB_USER_NAME,BaseValues.DB_PASSWORD,
  40. BaseValues.DB_HIVE_SQL_STAT_TABLE_NAME);
  41. try{
  42. doneDirPrefixPath=FileContext.getFileContext(newConfiguration())
  43. .makeQualified(newPath(this.jobHistoryPath));
  44. doneDirFc=FileContext.getFileContext(doneDirPrefixPath.toUri());
  45. }catch(UnsupportedFileSystemExceptione){
  46. //TODOAuto-generatedcatchblock
  47. e.printStackTrace();
  48. }catch(IllegalArgumentExceptione){
  49. //TODOAuto-generatedcatchblock
  50. e.printStackTrace();
  51. }
  52. }
  53. publicvoidreadJobInfoFiles(){
  54. List<FileStatus>files;
  55. files=newArrayList<FileStatus>();
  56. try{
  57. files=scanDirectory(doneDirPrefixPath,doneDirFc,files);
  58. }catch(IOExceptione){
  59. //TODOAuto-generatedcatchblock
  60. e.printStackTrace();
  61. }
  62. if(files!=null){
  63. for(FileStatusfs:files){
  64. //parseFileInfo(fs);
  65. }
  66. System.out.println("filesnumis"+files.size());
  67. System.out
  68. .println("fileStatusListsizeis"+fileStatusList.size());
  69. ParseThread[]threads;
  70. threads=newParseThread[threadNum];
  71. for(inti=0;i<threadNum;i++){
  72. System.out.println("thread"+i+"startrun");
  73. threads[i]=newParseThread(this,fileStatusList,dataInfos);
  74. threads[i].start();
  75. }
  76. for(inti=0;i<threadNum;i++){
  77. System.out.println("thread"+i+"joinrun");
  78. try{
  79. if(threads[i]!=null){
  80. threads[i].join();
  81. }
  82. }catch(InterruptedExceptione){
  83. //TODOAuto-generatedcatchblock
  84. e.printStackTrace();
  85. }
  86. }
  87. }else{
  88. System.out.println("filesisnull");
  89. }
  90. printStatDatas();
  91. }
  92. protectedList<FileStatus>scanDirectory(Pathpath,FileContextfc,
  93. List<FileStatus>jhStatusList)throwsIOException{
  94. path=fc.makeQualified(path);
  95. System.out.println("dirpathis"+path.getName());
  96. try{
  97. RemoteIterator<FileStatus>fileStatusIter=fc.listStatus(path);
  98. while(fileStatusIter.hasNext()){
  99. FileStatusfileStatus=fileStatusIter.next();
  100. PathfilePath=fileStatus.getPath();
  101. if(fileStatus.isFile()){
  102. jhStatusList.add(fileStatus);
  103. fileStatusList.add(fileStatus);
  104. }elseif(fileStatus.isDirectory()){
  105. scanDirectory(filePath,fc,jhStatusList);
  106. }
  107. }
  108. }catch(FileNotFoundExceptionfe){
  109. System.out.println("Errorwhilescanningdirectory"+path);
  110. }
  111. returnjhStatusList;
  112. }
  113. privatevoidparseFileInfo(FileStatusfs){
  114. StringresultStr;
  115. Stringstr;
  116. Stringusername;
  117. StringfileType;
  118. StringjobId;
  119. StringjobName;
  120. StringhiveSql;
  121. intstartPos;
  122. intendPos;
  123. inthiveSqlFlag;
  124. longlaunchTime;
  125. longfinishTime;
  126. intmapTaskNum;
  127. intreduceTaskNum;
  128. StringxmlNameFlag;
  129. StringlaunchTimeFlag;
  130. StringfinishTimeFlag;
  131. StringlaunchMapFlag;
  132. StringlaunchReduceFlag;
  133. Pathpath;
  134. FileSystemfileSystem;
  135. InputStreamin;
  136. resultStr="";
  137. fileType="";
  138. hiveSql="";
  139. jobId="";
  140. jobName="";
  141. username="";
  142. hiveSqlFlag=0;
  143. launchTime=0;
  144. finishTime=0;
  145. mapTaskNum=0;
  146. reduceTaskNum=0;
  147. xmlNameFlag="<value>";
  148. launchTimeFlag="\"launchTime\":";
  149. finishTimeFlag="\"finishTime\":";
  150. launchMapFlag="\"Launchedmaptasks\"";
  151. launchReduceFlag="\"Launchedreducetasks\"";
  152. path=fs.getPath();
  153. str=path.getName();
  154. if(str.endsWith(".xml")){
  155. fileType="config";
  156. endPos=str.lastIndexOf("_");
  157. jobId=str.substring(0,endPos);
  158. }elseif(str.endsWith(".jhist")){
  159. fileType="info";
  160. endPos=str.indexOf("-");
  161. jobId=str.substring(0,endPos);
  162. }else{
  163. return;
  164. }
  165. try{
  166. fileSystem=path.getFileSystem(newConfiguration());
  167. in=fileSystem.open(path);
  168. InputStreamReaderisr;
  169. BufferedReaderbr;
  170. isr=newInputStreamReader(in,"UTF-8");
  171. br=newBufferedReader(isr);
  172. while((str=br.readLine())!=null){
  173. if(str.contains("mapreduce.job.user.name")){
  174. startPos=str.indexOf(xmlNameFlag);
  175. endPos=str.indexOf("</value>");
  176. username=str.substring(startPos+xmlNameFlag.length(),
  177. endPos);
  178. }elseif(str.contains("mapreduce.job.name")){
  179. startPos=str.indexOf(xmlNameFlag);
  180. endPos=str.indexOf("</value>");
  181. jobName=str.substring(startPos+xmlNameFlag.length(),
  182. endPos);
  183. }elseif(str.contains("hive.query.string")){
  184. hiveSqlFlag=1;
  185. hiveSql=str;
  186. }elseif(hiveSqlFlag==1){
  187. hiveSql+=str;
  188. if(str.contains("</value>")){
  189. startPos=hiveSql.indexOf(xmlNameFlag);
  190. endPos=hiveSql.indexOf("</value>");
  191. hiveSql=hiveSql.substring(
  192. startPos+xmlNameFlag.length(),endPos);
  193. hiveSqlFlag=0;
  194. }
  195. }elseif(str.startsWith("{\"type\":\"JOB_INITED\"")){
  196. startPos=str.indexOf(launchTimeFlag);
  197. str=str.substring(startPos+launchTimeFlag.length());
  198. endPos=str.indexOf(",");
  199. launchTime=Long.parseLong(str.substring(0,endPos));
  200. }elseif(str.startsWith("{\"type\":\"JOB_FINISHED\"")){
  201. mapTaskNum=parseTaskNum(launchMapFlag,str);
  202. reduceTaskNum=parseTaskNum(launchReduceFlag,str);
  203. startPos=str.indexOf(finishTimeFlag);
  204. str=str.substring(startPos+finishTimeFlag.length());
  205. endPos=str.indexOf(",");
  206. finishTime=Long.parseLong(str.substring(0,endPos));
  207. }
  208. }
  209. System.out.println("jobIdis"+jobId);
  210. System.out.println("jobNameis"+jobName);
  211. System.out.println("usernameis"+username);
  212. System.out.println("maptasknumis"+mapTaskNum);
  213. System.out.println("reducetasknumis"+reduceTaskNum);
  214. System.out.println("launchTimeis"+launchTime);
  215. System.out.println("finishTimeis"+finishTime);
  216. System.out.println("hivequerysqlis"+hiveSql);
  217. }catch(IOExceptione){
  218. //TODOAuto-generatedcatchblock
  219. e.printStackTrace();
  220. }
  221. if(fileType.equals("config")){
  222. insertConfParseData(jobId,jobName,username,hiveSql);
  223. }elseif(fileType.equals("info")){
  224. insertJobInfoParseData(jobId,launchTime,finishTime,mapTaskNum,
  225. reduceTaskNum);
  226. }
  227. }
  228. privatevoidinsertConfParseData(StringjobId,StringjobName,
  229. Stringusername,Stringsql){
  230. String[]array;
  231. if(dataInfos.containsKey(jobId)){
  232. array=dataInfos.get(jobId);
  233. }else{
  234. array=newString[BaseValues.DB_COLUMN_HIVE_SQL_LEN];
  235. }
  236. array[BaseValues.DB_COLUMN_HIVE_SQL_JOBID]=jobId;
  237. array[BaseValues.DB_COLUMN_HIVE_SQL_JOBNAME]=jobName;
  238. array[BaseValues.DB_COLUMN_HIVE_SQL_USERNAME]=username;
  239. array[BaseValues.DB_COLUMN_HIVE_SQL_HIVE_SQL]=sql;
  240. dataInfos.put(jobId,array);
  241. }
  242. privatevoidinsertJobInfoParseData(StringjobId,longlaunchTime,
  243. longfinishedTime,intmapTaskNum,intreduceTaskNum){
  244. String[]array;
  245. if(dataInfos.containsKey(jobId)){
  246. array=dataInfos.get(jobId);
  247. }else{
  248. array=newString[BaseValues.DB_COLUMN_HIVE_SQL_LEN];
  249. }
  250. array[BaseValues.DB_COLUMN_HIVE_SQL_JOBID]=jobId;
  251. array[BaseValues.DB_COLUMN_HIVE_SQL_START_TIME]=String
  252. .valueOf(launchTime);
  253. array[BaseValues.DB_COLUMN_HIVE_SQL_FINISH_TIME]=String
  254. .valueOf(finishedTime);
  255. array[BaseValues.DB_COLUMN_HIVE_SQL_MAP_TASK_NUM]=String
  256. .valueOf(mapTaskNum);
  257. array[BaseValues.DB_COLUMN_HIVE_SQL_REDUCE_TASK_NUM]=String
  258. .valueOf(reduceTaskNum);
  259. dataInfos.put(jobId,array);
  260. }
  261. privateintparseTaskNum(Stringflag,StringjobStr){
  262. inttaskNum;
  263. intstartPos;
  264. intendPos;
  265. StringtmpStr;
  266. taskNum=0;
  267. tmpStr=jobStr;
  268. startPos=tmpStr.indexOf(flag);
  269. if(startPos==-1){
  270. return0;
  271. }
  272. tmpStr=tmpStr.substring(startPos+flag.length());
  273. endPos=tmpStr.indexOf("}");
  274. tmpStr=tmpStr.substring(0,endPos);
  275. taskNum=Integer.parseInt(tmpStr.split(":")[1]);
  276. returntaskNum;
  277. }
  278. privatevoidprintStatDatas(){
  279. StringjobId;
  280. StringjobInfo;
  281. String[]infos;
  282. if(dbClient!=null){
  283. dbClient.createConnection();
  284. }
  285. if(dataInfos!=null){
  286. System.out.println("mapdatasizeis"+dataInfos.size());
  287. if(dbClient!=null&&dirType.equals("dateTimeDir")){
  288. dbClient.insertDataBatch(dataInfos);
  289. }
  290. }
  291. /*for(Entry<String,String[]>entry:this.dataInfos.entrySet()){
  292. jobId=entry.getKey();
  293. infos=entry.getValue();
  294. jobInfo=String
  295. .format("jobIdis%s,jobName:%s,usrname:%s,launchTime:%s,finishTime:%s,mapTaskNum:%s,reduceTaskNum:%s,querySql:%s",
  296. jobId,infos[1],infos[2],infos[3],infos[4],
  297. infos[5],infos[6],infos[7]);
  298. //System.out.println("jobdetailinfo"+jobInfo);
  299. if(dbClient!=null&&dirType.equals("dateTimeDir")){
  300. dbClient.insertHiveSqlStatData(infos);
  301. }
  302. }*/
  303. if(dbClient!=null){
  304. dbClient.closeConnection();
  305. }
  306. }
  307. publicsynchronizedFileStatusgetOneFile(){
  308. FileStatusfs;
  309. fs=null;
  310. if(fileStatusList!=null&fileStatusList.size()>0){
  311. fs=fileStatusList.poll();
  312. }
  313. returnfs;
  314. }
  315. publicsynchronizedvoidaddDataToMap(StringjobId,String[]values){
  316. if(dataInfos!=null){
  317. dataInfos.put(jobId,values);
  318. }
  319. }
  320. }

解析线程代码ParseThread.java:

  1. packageorg.apache.hadoop.mapreduce.v2.hs.tool.sqlanalyse;
  2. importjava.io.BufferedReader;
  3. importjava.io.IOException;
  4. importjava.io.InputStream;
  5. importjava.io.InputStreamReader;
  6. importjava.util.HashMap;
  7. importjava.util.LinkedList;
  8. importorg.apache.hadoop.conf.Configuration;
  9. importorg.apache.hadoop.fs.FileStatus;
  10. importorg.apache.hadoop.fs.FileSystem;
  11. importorg.apache.hadoop.fs.Path;
  12. publicclassParseThreadextendsThread{
  13. privateHiveSqlAnalyseTooltool;
  14. privateLinkedList<FileStatus>fileStatus;
  15. privateHashMap<String,String[]>dataInfos;
  16. publicParseThread(HiveSqlAnalyseTooltool,LinkedList<FileStatus>fileStatus,HashMap<String,String[]>dataInfos){
  17. this.tool=tool;
  18. this.fileStatus=fileStatus;
  19. this.dataInfos=dataInfos;
  20. }
  21. @Override
  22. publicvoidrun(){
  23. FileStatusfs;
  24. while(fileStatus!=null&&!fileStatus.isEmpty()){
  25. fs=tool.getOneFile();
  26. parseFileInfo(fs);
  27. }
  28. super.run();
  29. }
  30. privatevoidparseFileInfo(FileStatusfs){
  31. Stringstr;
  32. Stringusername;
  33. StringfileType;
  34. StringjobId;
  35. StringjobName;
  36. StringhiveSql;
  37. intstartPos;
  38. intendPos;
  39. inthiveSqlFlag;
  40. longlaunchTime;
  41. longfinishTime;
  42. intmapTaskNum;
  43. intreduceTaskNum;
  44. StringxmlNameFlag;
  45. StringlaunchTimeFlag;
  46. StringfinishTimeFlag;
  47. StringlaunchMapFlag;
  48. StringlaunchReduceFlag;
  49. Pathpath;
  50. FileSystemfileSystem;
  51. InputStreamin;
  52. fileType="";
  53. hiveSql="";
  54. jobId="";
  55. jobName="";
  56. username="";
  57. hiveSqlFlag=0;
  58. launchTime=0;
  59. finishTime=0;
  60. mapTaskNum=0;
  61. reduceTaskNum=0;
  62. xmlNameFlag="<value>";
  63. launchTimeFlag="\"launchTime\":";
  64. finishTimeFlag="\"finishTime\":";
  65. launchMapFlag="\"Launchedmaptasks\"";
  66. launchReduceFlag="\"Launchedreducetasks\"";
  67. path=fs.getPath();
  68. str=path.getName();
  69. if(str.endsWith(".xml")){
  70. fileType="config";
  71. endPos=str.lastIndexOf("_");
  72. jobId=str.substring(0,endPos);
  73. }elseif(str.endsWith(".jhist")){
  74. fileType="info";
  75. endPos=str.indexOf("-");
  76. jobId=str.substring(0,endPos);
  77. }else{
  78. return;
  79. }
  80. try{
  81. fileSystem=path.getFileSystem(newConfiguration());
  82. in=fileSystem.open(path);
  83. InputStreamReaderisr;
  84. BufferedReaderbr;
  85. isr=newInputStreamReader(in,"UTF-8");
  86. br=newBufferedReader(isr);
  87. while((str=br.readLine())!=null){
  88. if(str.contains("mapreduce.job.user.name")){
  89. startPos=str.indexOf(xmlNameFlag);
  90. endPos=str.indexOf("</value>");
  91. username=str.substring(startPos+xmlNameFlag.length(),
  92. endPos);
  93. }elseif(str.contains("mapreduce.job.name")){
  94. startPos=str.indexOf(xmlNameFlag);
  95. endPos=str.indexOf("</value>");
  96. jobName=str.substring(startPos+xmlNameFlag.length(),
  97. endPos);
  98. }elseif(str.contains("hive.query.string")){
  99. hiveSqlFlag=1;
  100. hiveSql=str;
  101. }elseif(hiveSqlFlag==1){
  102. hiveSql+=str;
  103. if(str.contains("</value>")){
  104. startPos=hiveSql.indexOf(xmlNameFlag);
  105. endPos=hiveSql.indexOf("</value>");
  106. hiveSql=hiveSql.substring(
  107. startPos+xmlNameFlag.length(),endPos);
  108. hiveSqlFlag=0;
  109. }
  110. }elseif(str.startsWith("{\"type\":\"JOB_INITED\"")){
  111. startPos=str.indexOf(launchTimeFlag);
  112. str=str.substring(startPos+launchTimeFlag.length());
  113. endPos=str.indexOf(",");
  114. launchTime=Long.parseLong(str.substring(0,endPos));
  115. }elseif(str.startsWith("{\"type\":\"JOB_FINISHED\"")){
  116. mapTaskNum=parseTaskNum(launchMapFlag,str);
  117. reduceTaskNum=parseTaskNum(launchReduceFlag,str);
  118. startPos=str.indexOf(finishTimeFlag);
  119. str=str.substring(startPos+finishTimeFlag.length());
  120. endPos=str.indexOf(",");
  121. finishTime=Long.parseLong(str.substring(0,endPos));
  122. }
  123. }
  124. /*System.out.println("jobIdis"+jobId);
  125. System.out.println("jobNameis"+jobName);
  126. System.out.println("usernameis"+username);
  127. System.out.println("maptasknumis"+mapTaskNum);
  128. System.out.println("reducetasknumis"+reduceTaskNum);
  129. System.out.println("launchTimeis"+launchTime);
  130. System.out.println("finishTimeis"+finishTime);
  131. System.out.println("hivequerysqlis"+hiveSql);*/
  132. }catch(IOExceptione){
  133. //TODOAuto-generatedcatchblock
  134. e.printStackTrace();
  135. }
  136. if(fileType.equals("config")){
  137. insertConfParseData(jobId,jobName,username,hiveSql);
  138. }elseif(fileType.equals("info")){
  139. insertJobInfoParseData(jobId,launchTime,finishTime,mapTaskNum,
  140. reduceTaskNum);
  141. }
  142. }
  143. privatevoidinsertConfParseData(StringjobId,StringjobName,
  144. Stringusername,Stringsql){
  145. String[]array;
  146. if(dataInfos.containsKey(jobId)){
  147. array=dataInfos.get(jobId);
  148. }else{
  149. array=newString[BaseValues.DB_COLUMN_HIVE_SQL_LEN];
  150. }
  151. array[BaseValues.DB_COLUMN_HIVE_SQL_JOBID]=jobId;
  152. array[BaseValues.DB_COLUMN_HIVE_SQL_JOBNAME]=jobName;
  153. array[BaseValues.DB_COLUMN_HIVE_SQL_USERNAME]=username;
  154. array[BaseValues.DB_COLUMN_HIVE_SQL_HIVE_SQL]=sql;
  155. tool.addDataToMap(jobId,array);
  156. }
  157. privatevoidinsertJobInfoParseData(StringjobId,longlaunchTime,
  158. longfinishedTime,intmapTaskNum,intreduceTaskNum){
  159. String[]array;
  160. if(dataInfos.containsKey(jobId)){
  161. array=dataInfos.get(jobId);
  162. }else{
  163. array=newString[BaseValues.DB_COLUMN_HIVE_SQL_LEN];
  164. }
  165. array[BaseValues.DB_COLUMN_HIVE_SQL_JOBID]=jobId;
  166. array[BaseValues.DB_COLUMN_HIVE_SQL_START_TIME]=String
  167. .valueOf(launchTime);
  168. array[BaseValues.DB_COLUMN_HIVE_SQL_FINISH_TIME]=String
  169. .valueOf(finishedTime);
  170. array[BaseValues.DB_COLUMN_HIVE_SQL_MAP_TASK_NUM]=String
  171. .valueOf(mapTaskNum);
  172. array[BaseValues.DB_COLUMN_HIVE_SQL_REDUCE_TASK_NUM]=String
  173. .valueOf(reduceTaskNum);
  174. tool.addDataToMap(jobId,array);
  175. }
  176. privateintparseTaskNum(Stringflag,StringjobStr){
  177. inttaskNum;
  178. intstartPos;
  179. intendPos;
  180. StringtmpStr;
  181. taskNum=0;
  182. tmpStr=jobStr;
  183. startPos=tmpStr.indexOf(flag);
  184. if(startPos==-1){
  185. return0;
  186. }
  187. tmpStr=tmpStr.substring(startPos+flag.length());
  188. endPos=tmpStr.indexOf("}");
  189. tmpStr=tmpStr.substring(0,endPos);
  190. taskNum=Integer.parseInt(tmpStr.split(":")[1]);
  191. returntaskNum;
  192. }
  193. }


其他更多Yarn,Hadoop方面代码的分析请点击链接 https://github.com/linyiqun/hadoop-yarn ,后续将会继续更新YARN其他方面的代码分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值