上一篇博客分享了QQ共同好友的實現方案,本篇博客博主將繼續爲小夥伴們分享web日誌清洗案例。php
1、需求css
在實際生產的日誌文件中,有可能某些日誌數據並不規整,咱們須要對其進行清洗,而後用於分析;以下圖的日誌文件:html
194.237.142.21 - - [18/Sep/2013:06:49:18 +0000] "GET /wp-content/uploads/2013/07/rstudio-git3.png HTTP/1.1" 304 0 "-" "Mozilla/4.0 (compatible;)" 183.49.46.228 - - [18/Sep/2013:06:49:23 +0000] "-" 400 0 "-" "-" 163.177.71.12 - - [18/Sep/2013:06:49:33 +0000] "HEAD / HTTP/1.1" 200 20 "-" "DNSPod-Monitor/1.0" 163.177.71.12 - - [18/Sep/2013:06:49:36 +0000] "HEAD / HTTP/1.1" 200 20 "-" "DNSPod-Monitor/1.0" 101.226.68.137 - - [18/Sep/2013:06:49:42 +0000] "HEAD / HTTP/1.1" 200 20 "-" "DNSPod-Monitor/1.0" 101.226.68.137 - - [18/Sep/2013:06:49:45 +0000] "HEAD / HTTP/1.1" 200 20 "-" "DNSPod-Monitor/1.0" 60.208.6.156 - - [18/Sep/2013:06:49:48 +0000] "GET /wp-content/uploads/2013/07/rcassandra.png HTTP/1.0" 200 185524 "http://cos.name/category/software/packages/" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36" 222.68.172.190 - - [18/Sep/2013:06:49:57 +0000] "GET /images/my.jpg HTTP/1.1" 200 19939 "http://www.angularjs.cn/A00n" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36" 222.68.172.190 - - [18/Sep/2013:06:50:08 +0000] "-" 400 0 "-" "-" 183.195.232.138 - - [18/Sep/2013:06:50:16 +0000] "HEAD / HTTP/1.1" 200 20 "-" "DNSPod-Monitor/1.0" 183.195.232.138 - - [18/Sep/2013:06:50:16 +0000] "HEAD / HTTP/1.1" 200 20 "-" "DNSPod-Monitor/1.0" 66.249.66.84 - - [18/Sep/2013:06:50:28 +0000] "GET /page/6/ HTTP/1.1" 200 27777 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" 221.130.41.168 - - [18/Sep/2013:06:50:37 +0000] "GET /feed/ HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36" 157.55.35.40 - - [18/Sep/2013:06:51:13 +0000] "GET /robots.txt HTTP/1.1" 200 150 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)" 50.116.27.194 - - [18/Sep/2013:06:51:35 +0000] "POST /wp-cron.php?doing_wp_cron=1379487095.2510800361633300781250 HTTP/1.0" 200 0 "-" "WordPress/3.6; http://blog.fens.me" 58.215.204.118 - - [18/Sep/2013:06:51:35 +0000] "GET /nodejs-socketio-chat/ HTTP/1.1" 200 10818 "http://www.google.com/url?sa=t&rct=j&q=nodejs%20%E5%BC%82%E6%AD%A5%E5%B9%BF%E6%92%AD&source=web&cd=1&cad=rja&ved=0CCgQFjAA&url=%68%74%74%70%3a%2f%2f%62%6c%6f%67%2e%66%65%6e%73%2e%6d%65%2f%6e%6f%64%65%6a%73%2d%73%6f%63%6b%65%74%69%6f%2d%63%68%61%74%2f&ei=rko5UrylAefOiAe7_IGQBw&usg=AFQjCNG6YWoZsJ_bSj8kTnMHcH51hYQkAA&bvm=bv.52288139,d.aGc" "Mozilla/5.0 (Windows NT 5.1; rv:23.0) Gecko/20100101 Firefox/23.0" 58.215.204.118 - - [18/Sep/2013:06:51:36 +0000] "GET /wp-includes/js/jquery/jquery-migrate.min.js?ver=1.2.1 HTTP/1.1" 304 0 "http://blog.fens.me/nodejs-socketio-chat/" "Mozilla/5.0 (Windows NT 5.1; rv:23.0) Gecko/20100101 Firefox/23.0" 58.215.204.118 - - [18/Sep/2013:06:51:35 +0000] "GET /wp-includes/js/jquery/jquery.js?ver=1.10.2 HTTP/1.1" 304 0 "http://blog.fens.me/nodejs-socketio-chat/" "Mozilla/5.0 (Windows NT 5.1; rv:23.0) Gecko/20100101 Firefox/23.0" 58.215.204.118 - - [18/Sep/2013:06:51:36 +0000] "GET /wp-includes/js/comment-reply.min.js?ver=3.6 HTTP/1.1" 304 0 "http://blog.fens.me/nodejs-socketio-chat/" "Mozilla/5.0 (Windows NT 5.1; rv:23.0) Gecko/20100101 Firefox/23.0" 58.215.204.118 - - [18/Sep/2013:06:51:36 +0000] "GET /wp-content/uploads/2013/08/chat.png HTTP/1.1" 200 48968 "http://blog.fens.me/nodejs-socketio-chat/" "Mozilla/5.0 (Windows NT 5.1; rv:23.0) Gecko/20100101 Firefox/23.0" 58.215.204.118 - - [18/Sep/2013:06:51:36 +0000] "GET /wp-content/uploads/2013/08/chat2.png HTTP/1.1" 200 59852 "http://blog.fens.me/nodejs-socketio-chat/" "Mozilla/5.0 (Windows NT 5.1; rv:23.0) Gecko/20100101 Firefox/23.0" 58.215.204.118 - - [18/Sep/2013:06:51:37 +0000] "GET /wp-content/uploads/2013/08/socketio.png HTTP/1.1" 200 80493 "http://blog.fens.me/nodejs-socketio-chat/" "Mozilla/5.0 (Windows NT 5.1; rv:23.0) Gecko/20100101 Firefox/23.0" 58.248.178.212 - - [18/Sep/2013:06:51:37 +0000] "GET /nodejs-grunt-intro/ HTTP/1.1" 200 51770 "http://blog.fens.me/series-nodejs/" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; MDDR; InfoPath.2; .NET4.0C)" 58.248.178.212 - - [18/Sep/2013:06:51:40 +0000] "GET /wp-includes/js/jquery/jquery-migrate.min.js?ver=1.2.1 HTTP/1.1" 200 7200 "http://blog.fens.me/nodejs-grunt-intro/" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; MDDR; InfoPath.2; .NET4.0C)" 58.248.178.212 - - [18/Sep/2013:06:51:40 +0000] "GET /wp-includes/js/comment-reply.min.js?ver=3.6 HTTP/1.1" 200 786 "http://blog.fens.me/nodejs-grunt-intro/" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; MDDR; InfoPath.2; .NET4.0C)" 58.248.178.212 - - [18/Sep/2013:06:51:40 +0000] "GET /wp-includes/js/jquery/jquery.js?ver=1.10.2 HTTP/1.1" 200 45307 "http://blog.fens.me/nodejs-grunt-intro/" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; MDDR; InfoPath.2; .NET4.0C)" 58.248.178.212 - - [18/Sep/2013:06:51:40 +0000] "GET /wp-includes/js/jquery/jquery.js?ver=1.10.2 HTTP/1.1" 200 93128 "http://blog.fens.me/nodejs-grunt-intro/" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; MDDR; InfoPath.2; .NET4.0C)" 58.248.178.212 - - [18/Sep/2013:06:51:40 +0000] "GET /wp-includes/js/comment-reply.min.js?ver=3.6 HTTP/1.1" 200 786 "http://blog.fens.me/nodejs-grunt-intro/" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; MDDR; InfoPath.2; .NET4.0C)" 58.215.204.118 - - [18/Sep/2013:06:51:41 +0000] "-" 400 0 "-" "-" 58.215.204.118 - - [18/Sep/2013:06:51:41 +0000] "-" 400 0 "-" "-"
本次的清洗規則:主要是對字段數不合法的數據進行清洗(加入標記位),而且對其中一些字段進行處理,如時間等等。java
2、代碼實現node
WebLogBean(web日誌bean類實現)jquery
package com.empire.hadoop.mr.weblogwash; public class WebLogBean { private String remote_addr; // 記錄客戶端的ip地址 private String remote_user; // 記錄客戶端用戶名稱,忽略屬性"-" private String time_local; // 記錄訪問時間與時區 private String request; // 記錄請求的url與http協議 private String status; // 記錄請求狀態;成功是200 private String body_bytes_sent;// 記錄發送給客戶端文件主體內容大小 private String http_referer; // 用來記錄從那個頁面連接訪問過來的 private String http_user_agent;// 記錄客戶瀏覽器的相關信息 private boolean valid = true; // 判斷數據是否合法 public String getRemote_addr() { return remote_addr; } public void setRemote_addr(String remote_addr) { this.remote_addr = remote_addr; } public String getRemote_user() { return remote_user; } public void setRemote_user(String remote_user) { this.remote_user = remote_user; } public String getTime_local() { return time_local; } public void setTime_local(String time_local) { this.time_local = time_local; } public String getRequest() { return request; } public void setRequest(String request) { this.request = request; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public String getBody_bytes_sent() { return body_bytes_sent; } public void setBody_bytes_sent(String body_bytes_sent) { this.body_bytes_sent = body_bytes_sent; } public String getHttp_referer() { return http_referer; } public void setHttp_referer(String http_referer) { this.http_referer = http_referer; } public String getHttp_user_agent() { return http_user_agent; } public void setHttp_user_agent(String http_user_agent) { this.http_user_agent = http_user_agent; } public boolean isValid() { return valid; } public void setValid(boolean valid) { this.valid = valid; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(this.valid); sb.append("\001").append(this.remote_addr); sb.append("\001").append(this.remote_user); sb.append("\001").append(this.time_local); sb.append("\001").append(this.request); sb.append("\001").append(this.status); sb.append("\001").append(this.body_bytes_sent); sb.append("\001").append(this.http_referer); sb.append("\001").append(this.http_user_agent); return sb.toString(); } }
WebLogParser(日誌清洗規則類)git
package com.empire.hadoop.mr.weblogwash; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; public class WebLogParser { static SimpleDateFormat sd1 = new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss", Locale.US); static SimpleDateFormat sd2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static WebLogBean parser(String line) { WebLogBean webLogBean = new WebLogBean(); String[] arr = line.split(" "); if (arr.length > 11) { webLogBean.setRemote_addr(arr[0]); webLogBean.setRemote_user(arr[1]); webLogBean.setTime_local(parseTime(arr[3].substring(1))); webLogBean.setRequest(arr[6]); webLogBean.setStatus(arr[8]); webLogBean.setBody_bytes_sent(arr[9]); webLogBean.setHttp_referer(arr[10]); if (arr.length > 12) { webLogBean.setHttp_user_agent(arr[11] + " " + arr[12]); } else { webLogBean.setHttp_user_agent(arr[11]); } if (Integer.parseInt(webLogBean.getStatus()) >= 400) {// 大於400,HTTP錯誤 webLogBean.setValid(false); } } else { webLogBean.setValid(false); } return webLogBean; } public static String parseTime(String dt) { String timeString = ""; try { Date parse = sd1.parse(dt); timeString = sd2.format(parse); } catch (ParseException e) { e.printStackTrace(); } return timeString; } public static void main(String[] args) { WebLogParser wp = new WebLogParser(); String parseTime = wp.parseTime("18/Sep/2013:06:49:48"); System.out.println(parseTime); } }
WeblogPreProcess(mapreduce主程序類)angularjs
package com.empire.hadoop.mr.weblogwash; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.NullWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class WeblogPreProcess { static class WeblogPreProcessMapper extends Mapper<LongWritable, Text, Text, NullWritable> { Text k = new Text(); NullWritable v = NullWritable.get(); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); WebLogBean webLogBean = WebLogParser.parser(line); //能夠插入一個靜態資源過濾(.....) /* WebLogParser.filterStaticResource(webLogBean); */ if (!webLogBean.isValid()) return; k.set(webLogBean.toString()); context.write(k, v); } } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf); job.setJarByClass(WeblogPreProcess.class); job.setMapperClass(WeblogPreProcessMapper.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(NullWritable.class); FileInputFormat.setInputPaths(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); job.waitForCompletion(true); } }
3、執行程序web
#上傳jar Alt+p lcd d:/ put WeblogWash.jar put access.log.txt #準備hadoop處理的數據文件 cd /home/hadoop hadoop fs -mkdir -p /weblogwash/loginput hdfs dfs -put access.log.txt /weblogwash/loginput #運行程序 hadoop jar WeblogWash.jar com.empire.hadoop.mr.weblogwash.WeblogPreProcess /weblogwash/loginput /weblogwash/logoutput
4、運行效果apache
[hadoop@centos-aaron-h1 ~]$ hadoop jar WeblogWash.jar com.empire.hadoop.mr.weblogwash.WeblogPreProcess /weblogwash/loginput /weblogwash/logoutput 18/12/23 07:46:35 INFO client.RMProxy: Connecting to ResourceManager at centos-aaron-h1/192.168.29.144:8032 18/12/23 07:46:35 WARN mapreduce.JobResourceUploader: Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this. 18/12/23 07:46:35 INFO input.FileInputFormat: Total input files to process : 1 18/12/23 07:46:35 INFO mapreduce.JobSubmitter: number of splits:1 18/12/23 07:46:35 INFO Configuration.deprecation: yarn.resourcemanager.system-metrics-publisher.enabled is deprecated. Instead, use yarn.system-metrics-publisher.enabled 18/12/23 07:46:36 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1545512861141_0003 18/12/23 07:46:36 INFO impl.YarnClientImpl: Submitted application application_1545512861141_0003 18/12/23 07:46:36 INFO mapreduce.Job: The url to track the job: http://centos-aaron-h1:8088/proxy/application_1545512861141_0003/ 18/12/23 07:46:36 INFO mapreduce.Job: Running job: job_1545512861141_0003 18/12/23 07:46:43 INFO mapreduce.Job: Job job_1545512861141_0003 running in uber mode : false 18/12/23 07:46:43 INFO mapreduce.Job: map 0% reduce 0% 18/12/23 07:46:51 INFO mapreduce.Job: map 100% reduce 0% 18/12/23 07:46:56 INFO mapreduce.Job: map 100% reduce 100% 18/12/23 07:46:57 INFO mapreduce.Job: Job job_1545512861141_0003 completed successfully 18/12/23 07:46:58 INFO mapreduce.Job: Counters: 49 File System Counters FILE: Number of bytes read=1843125 FILE: Number of bytes written=4080159 FILE: Number of read operations=0 FILE: Number of large read operations=0 FILE: Number of write operations=0 HDFS: Number of bytes read=3025884 HDFS: Number of bytes written=1799829 HDFS: Number of read operations=6 HDFS: Number of large read operations=0 HDFS: Number of write operations=2 Job Counters Launched map tasks=1 Launched reduce tasks=1 Data-local map tasks=1 Total time spent by all maps in occupied slots (ms)=5806 Total time spent by all reduces in occupied slots (ms)=3342 Total time spent by all map tasks (ms)=5806 Total time spent by all reduce tasks (ms)=3342 Total vcore-milliseconds taken by all map tasks=5806 Total vcore-milliseconds taken by all reduce tasks=3342 Total megabyte-milliseconds taken by all map tasks=5945344 Total megabyte-milliseconds taken by all reduce tasks=3422208 Map-Reduce Framework Map input records=14619 Map output records=13535 Map output bytes=1807907 Map output materialized bytes=1843125 Input split bytes=127 Combine input records=0 Combine output records=0 Reduce input groups=13017 Reduce shuffle bytes=1843125 Reduce input records=13535 Reduce output records=13535 Spilled Records=27070 Shuffled Maps =1 Failed Shuffles=0 Merged Map outputs=1 GC time elapsed (ms)=217 CPU time spent (ms)=3510 Physical memory (bytes) snapshot=346947584 Virtual memory (bytes) snapshot=1694277632 Total committed heap usage (bytes)=142786560 Shuffle Errors BAD_ID=0 CONNECTION=0 IO_ERROR=0 WRONG_LENGTH=0 WRONG_MAP=0 WRONG_REDUCE=0 File Input Format Counters Bytes Read=3025757 File Output Format Counters Bytes Written=1799829 [hadoop@centos-aaron-h1 ~]$
5、運行結果
[hadoop@centos-aaron-h1 ~]$ hdfs dfs -cat /weblogwash/logoutput/part-r-00000 true1.162.203.134-2013-09-18 13:47:35/images/my.jpg20019939"http://www.angularjs.cn/A0d9""Mozilla/5.0 (Windows true1.202.186.37-2013-09-18 15:39:11/wp-content/uploads/2013/08/windjs.png20034613"http://cnodejs.org/topic/521a30d4bee8d3cb1272ac0f""Mozilla/5.0 (Macintosh; true1.202.186.37-2013-09-18 15:39:18/nodejs-async-windjs/20010139"http://cnodejs.org/topic/521a30d4bee8d3cb1272ac0f""Mozilla/5.0 (Macintosh; true1.202.186.37-2013-09-18 15:39:18/wp-content/themes/silesia/functions/css/shortcodes.css2002899"http://blog.fens.me/nodejs-async-windjs/""Mozilla/5.0 (Macintosh; true1.202.186.37-2013-09-18 15:39:18/wp-content/themes/silesia/functions/js/shortcode.js200333"http://blog.fens.me/nodejs-async-windjs/""Mozilla/5.0 (Macintosh; true1.202.186.37-2013-09-18 15:39:18/wp-content/themes/silesia/js/jquery.cycle.all.min.js2007784"http://blog.fens.me/nodejs-async-windjs/""Mozilla/5.0 (Macintosh; true1.202.186.37-2013-09-18 15:39:18/wp-content/themes/silesia/js/load.js200715"http://blog.fens.me/nodejs-async-windjs/""Mozilla/5.0 (Macintosh; true1.202.186.37-2013-09-18 15:39:18/wp-content/themes/silesia/style.css2007554"http://blog.fens.me/nodejs-async-windjs/""Mozilla/5.0 (Macintosh; true1.202.186.37-2013-09-18 15:39:18/wp-includes/js/comment-reply.min.js?ver=3.6200786"http://blog.fens.me/nodejs-async-windjs/""Mozilla/5.0 (Macintosh; true1.202.186.37-2013-09-18 15:39:18/wp-includes/js/jquery/jquery-migrate.min.js?ver=1.2.12007200"http://blog.fens.me/nodejs-async-windjs/""Mozilla/5.0 (Macintosh; true1.202.186.37-2013-09-18 15:39:18/wp-includes/js/jquery/jquery.js?ver=1.10.220032851"http://blog.fens.me/nodejs-async-windjs/""Mozilla/5.0 (Macintosh; true1.202.186.37-2013-09-18 15:39:19/js/baidu.js200249"http://blog.fens.me/nodejs-async-windjs/""Mozilla/5.0 (Macintosh; true1.202.186.37-2013-09-18 15:39:19/js/google.js200475"http://blog.fens.me/nodejs-async-windjs/""Mozilla/5.0 (Macintosh; true1.202.186.37-2013-09-18 15:39:19/wp-content/themes/silesia/images/bullets/5.gif20062"http://blog.fens.me/nodejs-async-windjs/""Mozilla/5.0 (Macintosh; true1.202.186.37-2013-09-18 15:39:19/wp-content/themes/silesia/images/crubms-div.png2001255"http://blog.fens.me/nodejs-async-windjs/""Mozilla/5.0 (Macintosh; true1.202.186.37-2013-09-18 15:39:19/wp-content/themes/silesia/images/home-ico.png2001103"http://blog.fens.me/nodejs-async-windjs/""Mozilla/5.0 (Macintosh; true1.202.186.37-2013-09-18 15:39:19/wp-content/themes/silesia/images/ico-meta.gif20073"http://blog.fens.me/nodejs-async-windjs/""Mozilla/5.0 (Macintosh; true1.202.186.37-2013-09-18 15:39:19/wp-content/themes/silesia/images/natty-logo.png2001438"http://blog.fens.me/nodejs-async-windjs/""Mozilla/5.0 (Macintosh; true1.202.186.37-2013-09-18 15:39:19/wp-content/themes/silesia/images/slide-bg.png200934"http://blog.fens.me/nodejs-async-windjs/""Mozilla/5.0 (Macintosh; true1.202.186.37-2013-09-18 15:39:19/wp-content/themes/silesia/images/sprites/post-type.png2002009"http://blog.fens.me/nodejs-async-windjs/""Mozilla/5.0 (Macintosh; true1.202.186.37-2013-09-18 15:39:19/wp-content/uploads/2013/08/stage1.png20010208"http://blog.fens.me/nodejs-async-windjs/""Mozilla/5.0 (Macintosh; true1.202.186.37-2013-09-18 15:39:19/wp-content/uploads/2013/08/stage2.png20016419"http://blog.fens.me/nodejs-async-windjs/""Mozilla/5.0 (Macintosh; true1.202.186.37-2013-09-18 15:39:19/wp-content/uploads/2013/08/stage3.png20015227"http://blog.fens.me/nodejs-async-windjs/""Mozilla/5.0 (Macintosh; true1.202.186.37-2013-09-18 15:39:20/wp-content/uploads/2013/05/favicon.ico2001150"-""Mozilla/5.0 (Macintosh; [hadoop@centos-aaron-h1 ~]$
最後寄語,以上是博主本次文章的所有內容,若是你們以爲博主的文章還不錯,請點贊;若是您對博主其它服務器大數據技術或者博主本人感興趣,請關注博主博客,而且歡迎隨時跟博主溝通交流。