runqueries.sh 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. #!/usr/bin/bash
  2. databaseName="$1"
  3. filename="$2"
  4. runName="$3"
  5. DEFAULT=default
  6. samplingrate=1
  7. startDstatsCollection () {
  8. if [ -z "$1" ] # Is parameter #1 zero length?
  9. then
  10. echo "-Parameter #1 run path is zero length.-" # Or no parameter passed.
  11. return 0
  12. fi
  13. if [ -z "$2" ] # Is parameter #1 zero length?
  14. then
  15. echo "-Parameter #2 collection name is zero length.-" # Or no parameter passed.
  16. return 0
  17. fi
  18. dstatoufileextension="csv"
  19. dstatoutdir=${1-$DEFAULT}
  20. collectionname=${2-$DEFAULT}
  21. collectioncsvfile="$collectionname.csv"
  22. while read -r machinename
  23. do
  24. echo "Start dstat on $machinename"
  25. collectioncsvfile="$machinename.$collectionname.csv"
  26. outfile="$dstatoutdir/$collectioncsvfile"
  27. sudo ssh $machinename "mkdir -p \"$dstatoutdir\" ;" < /dev/null
  28. sudo ssh $machinename "dstat -t -a --output $outfile $samplingrate > /dev/null & " < /dev/null
  29. done < dn.txt
  30. }
  31. stopDstatsCollection () {
  32. while read -r machinename
  33. do
  34. echo $machinename
  35. echo "Stop dstat on $machinename"
  36. #ssh -i $HOME/cloud.key cloud-user@$machinename "nohup ps aux | grep dstat | awk '{print \$2}' | xargs kill > /dev/null 2>&1 & " < /dev/null
  37. #ssh -i $HOME/cloud.key cloud-user@$machinename "ps aux | grep dstat | awk '{print \$2}' | xargs kill > /dev/null & " & < /dev/null
  38. sudo ssh $machinename "ps aux | grep dstat | awk '{print \$2}' | xargs kill > /dev/null & " & < /dev/null
  39. #ssh -n -o BatchMode=yes $HOME/cloud.key cloud-user@$machinename "/home/cloud-user/impala-tpcds-kit/queries/stopdstat.sh" 2>&1 &
  40. #ssh -i $HOME/cloud.key cloud-user@$machinename 'bash -s' < "/home/cloud-user/impala-tpcds-kit/queries/stopdstat.sh" < /dev/null
  41. done < dn.txt
  42. }
  43. consLogFile () {
  44. if [ -z "$1" ]
  45. then
  46. echo "-Parameter #1 run path is zero length.-"
  47. return 0
  48. fi
  49. headmachine=$(cat dn.txt | head -n 1)
  50. sourcedir=${1-$DEFAULT}
  51. while read -r machinename
  52. do
  53. if [ "$headmachine" = "$machinename" ]
  54. then
  55. continue
  56. fi
  57. echo "Copy from $machinename $sourcedir"
  58. sudo scp -rp $machinename:$sourcedir $baseoutdir
  59. done < dn.txt
  60. }
  61. summarizedstats () {
  62. if [ -z "$1" ] # Is parameter #1 zero length?
  63. then
  64. echo "-Parameter #1 run path is zero length.-" # Or no parameter passed.
  65. return 0
  66. fi
  67. if [ -z "$2" ] # Is parameter #1 zero length?
  68. then
  69. echo "-Parameter #2 collection name is zero length.-" # Or no parameter passed.
  70. return 0
  71. fi
  72. dstatfilesdir=${1-$DEFAULT}
  73. dstatsummaryfile=${2-$DEFAULT}
  74. echo $dstatfilesdir
  75. echo $dstatsummaryfile
  76. echo "machineName,query,executionNumber,elapsedTimeSecs,avgCpuUser,avgCpuSys,avgDiskReadBytes/sec,avgDiskWriteBytes/sec,avgNetworkReadBytes/sec,avgNetworkWriteBytes/sec,totalCpuUser,totalCpuSys,totalDiskReadBytes,totalDiskWriteBytes,totalNetworkReadBytes,totalNetworkWriteBytes,filename" > $dstatsummaryfile
  77. cd $dstatfilesdir
  78. for filename in `ls *csv`
  79. do
  80. echo "Summarizing on $filename..."
  81. # Some book keeping
  82. parsecsvdata=0
  83. sampleCount=0
  84. # Avg counts
  85. avgCpuUser=0
  86. avgCpusys=0
  87. avgDiskRead=0
  88. avgDiskWrite=0
  89. avgNetworkRead=0
  90. avgNetworkWrite=0
  91. # total counts
  92. totCpuUser=0
  93. totCpusys=0
  94. totdiskRead=0
  95. totdiskWrite=0
  96. totnetworkRead=0
  97. totnetworkWrite=0
  98. # Set "," as the field separator using $IFS
  99. # and read line by line using while read combo
  100. while IFS=',' read -r c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12
  101. do
  102. if [ "$c1" = "\"date/time\"" ]
  103. then
  104. parsecsvdata=1
  105. continue
  106. fi
  107. if [ $parsecsvdata -eq 1 ]
  108. then
  109. let sampleCount=$sampleCount+1
  110. totCpuUser=$(echo "scale=4; $totCpuUser+$c2" | bc)
  111. totCpusys=$(echo "scale=4; $totCpusys+$c3" | bc)
  112. totdiskRead=$(echo "scale=4; $totdiskRead+$c8" | bc)
  113. totdiskWrite=$(echo "scale=4; $totdiskWrite+$c9" | bc)
  114. totnetworkRead=$(echo "scale=4; $totnetworkRead+$c10" | bc)
  115. totnetworkWrite=$(echo "scale=4; $totnetworkWrite+$c11" | bc)
  116. #echo "$totCpuUser $totCpusys $totdiskRead $totdiskWrite $totnetworkRead $totnetworkWrite $c1 $c2 $c3 $c4 $c5 $c6 $c7"
  117. fi
  118. done < "$filename"
  119. # Get the averages
  120. avgCpuUser=$(echo "scale=4; $totCpuUser/$sampleCount" | bc)
  121. avgCpusys=$(echo "scale=4; $totCpusys/$sampleCount" | bc)
  122. avgDiskRead=$(echo "scale=4; $totdiskRead/$sampleCount" | bc)
  123. avgDiskWrite=$(echo "scale=4; $totdiskWrite/$sampleCount" | bc)
  124. avgNetworkRead=$(echo "scale=4; $totnetworkRead/$sampleCount" | bc)
  125. avgNetworkWrite=$(echo "scale=4; $totnetworkWrite/$sampleCount" | bc)
  126. # Parse the test metadata from the file name
  127. IFS=. read -a testinfo <<<"$filename"
  128. machineName="${testinfo[0]}"
  129. query="${testinfo[1]}"
  130. executionNumber="${testinfo[3]}"
  131. echo "$machineName,$query,$executionNumber,$sampleCount,$avgCpuUser,$avgCpusys,$avgDiskRead,$avgDiskWrite,$avgNetworkRead,$avgNetworkWrite,$totCpuUser,$totCpusys,$totdiskRead,$totdiskWrite,$totnetworkRead,$totnetworkWrite,$filename" >> $dstatsummaryfile
  132. done
  133. }
  134. loopCount="4"
  135. timeStamp="$(date "+%s-%d-%H-%M-%S")"
  136. baseoutdir="$runName/$databaseName"
  137. outDir="$baseoutdir/$timeStamp"
  138. explainPlans="$outDir/explainPlans"
  139. queryOutPut="$outDir/queryOutPut"
  140. profileOutPut="$outDir/queryProfile"
  141. tempQueries="$outDir/tempQueries"
  142. masterLogFile="$outDir/masterlog.txt"
  143. executionTimeFile="$outDir/summary.csv"
  144. currentDir=$(pwd)
  145. dstatCountersDir="$currentDir/$outDir/dstats"
  146. resourcesummaryfile="$currentDir/$outDir/resourceSummary.csv"
  147. mkdir -p "$outDir"
  148. mkdir -p "$tempQueries"
  149. mkdir -p "$queryOutPut"
  150. mkdir -p "$explainPlans"
  151. mkdir -p "$profileOutPut"
  152. mkdir -p "$dstatCountersDir"
  153. echo "runName,databaseName,queryName,executionNumber,responseTime,rows(s),jobID,executionTime" > $executionTimeFile
  154. explainString="explain "
  155. exitString="exit;"
  156. while read -r line
  157. do
  158. name=$line
  159. queryName=$line
  160. queryFileName="$tempQueries/$queryName.explain.txt"
  161. outFileName="$explainPlans/$queryName.explain.out"
  162. echo "$explainString " | cat - $line > "$queryFileName"
  163. echo "$exitString" >> "$queryFileName"
  164. echo "$(date "+%m-%d-%Y %T") : Starting $queryFileName"
  165. echo "$(date "+%m-%d-%Y %T") : Starting $queryFileName" >> $masterLogFile
  166. START=$(($(date +%s%N)/1000000))
  167. hive --database $databaseName -i "$queryFileName" > "$outFileName" 2>&1
  168. #impala-shell -i impala2 -V -B -d $databaseName -f "$queryFileName" > "$outFileName" 2>&1
  169. END=$(($(date +%s%N)/1000000))
  170. ET=$((END-START))
  171. echo "$runName,$databaseName,$queryName.explain,explain,$ET" >> $executionTimeFile
  172. echo "$(date "+%m-%d-%Y %T") : End $outDir/$line.explain.txt"
  173. echo "$(date "+%m-%d-%Y %T") : End $outDir/$line.explain.txt" >> $masterLogFile
  174. for i in $(seq 1 1 $loopCount)
  175. do
  176. queryFileName="$tempQueries/$queryName.$i.txt"
  177. outFileName="$queryOutPut/$queryName.$i.out"
  178. outProfileName="$profileOutPut/$queryName.$i.out"
  179. cat $line > "$queryFileName"
  180. echo "$exitString" >> "$queryFileName"
  181. # Run queries without profiling
  182. echo "$(date "+%m-%d-%Y %T") : Starting $queryFileName"
  183. echo "$(date "+%m-%d-%Y %T") : Starting $queryName.$i.txt" >> $masterLogFile
  184. # start data trace
  185. startDstatsCollection $dstatCountersDir "$queryName.$i"
  186. START=$(($(date +%s%N)/1000000))
  187. hive --database $databaseName -e "`cat $queryFileName`" > "$outFileName" 2>&1
  188. #impala-shell -i impala2 -V -B -d $databaseName -f "$queryFileName" > "$outFileName" 2>&1
  189. END=$(($(date +%s%N)/1000000))
  190. ET=$((END-START))
  191. stopDstatsCollection
  192. responsetime=$(cat $outFileName | grep "Time taken:" | grep "seconds" | awk '{print $3}')
  193. returnedrowcount=$(cat $outFileName | grep "Time taken:" | grep "row(s)" | awk '{print $63}')
  194. jobid=$(cat $outFileName | grep "Query ID" | awk '{print $4}')
  195. echo "$queryName.$i completed $ET msec"
  196. echo "$runName,$databaseName,$queryName,$i,$responsetime,$returnedrowcount,$jobid,$ET" >> $executionTimeFile
  197. echo "$(date "+%m-%d-%Y %T") : End $queryName.$i.txt" >> $masterLogFile
  198. done
  199. done < "$filename"
  200. # Copy log files from all machines
  201. consLogFile $currentDir/$outDir
  202. summarizedstats $dstatCountersDir $resourcesummaryfile