上一篇博客分享了QQ共同好友的实现方案,本篇博客博主将继续为小伙伴们分享web日志清洗案例。
一、需求
在实际生产的日志文件中,有可能某些日志数据并不规整,我们需要对其进行清洗,然后用于分析;如下图的日志文件:
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 "-" "-"
本次的清洗规则:主要是对字段数不合法的数据进行清洗(加入标记位),并且对其中一些字段进行处理,如时间等等。
二、代码实现
WebLogBean(web日志bean类实现)
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(日志清洗规则类)
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主程序类)
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);
}
}
三、执行程序
#上传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
四、运行效果
[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 ~]$
五、运行结果
[hadoop@centos-aaron-h1 ~]$ hdfs dfs -cat /weblogwash/logoutput/part-r-00000
true 1.162.203.134 - 2013-09-18 13:47:35 /images/my.jpg 200 19939 "http://www.angularjs.cn/A0d9" "Mozilla/5.0 (Windows
true 1.202.186.37 - 2013-09-18 15:39:11 /wp-content/uploads/2013/08/windjs.png 200 34613 "http://cnodejs.org/topic/521a30d4bee8d3cb1272ac0f" "Mozilla/5.0 (Macintosh;
true 1.202.186.37 - 2013-09-18 15:39:18 /nodejs-async-windjs/ 200 10139 "http://cnodejs.org/topic/521a30d4bee8d3cb1272ac0f" "Mozilla/5.0 (Macintosh;
true 1.202.186.37 - 2013-09-18 15:39:18 /wp-content/themes/silesia/functions/css/shortcodes.css 200 2899 "http://blog.fens.me/nodejs-async-windjs/" "Mozilla/5.0 (Macintosh;
true 1.202.186.37 - 2013-09-18 15:39:18 /wp-content/themes/silesia/functions/js/shortcode.js 200 333 "http://blog.fens.me/nodejs-async-windjs/" "Mozilla/5.0 (Macintosh;
true 1.202.186.37 - 2013-09-18 15:39:18 /wp-content/themes/silesia/js/jquery.cycle.all.min.js 200 7784 "http://blog.fens.me/nodejs-async-windjs/" "Mozilla/5.0 (Macintosh;
true 1.202.186.37 - 2013-09-18 15:39:18 /wp-content/themes/silesia/js/load.js 200 715 "http://blog.fens.me/nodejs-async-windjs/" "Mozilla/5.0 (Macintosh;
true 1.202.186.37 - 2013-09-18 15:39:18 /wp-content/themes/silesia/style.css 200 7554 "http://blog.fens.me/nodejs-async-windjs/" "Mozilla/5.0 (Macintosh;
true 1.202.186.37 - 2013-09-18 15:39:18 /wp-includes/js/comment-reply.min.js?ver=3.6 200 786 "http://blog.fens.me/nodejs-async-windjs/" "Mozilla/5.0 (Macintosh;
true 1.202.186.37 - 2013-09-18 15:39:18 /wp-includes/js/jquery/jquery-migrate.min.js?ver=1.2.1 200 7200 "http://blog.fens.me/nodejs-async-windjs/" "Mozilla/5.0 (Macintosh;
true 1.202.186.37 - 2013-09-18 15:39:18 /wp-includes/js/jquery/jquery.js?ver=1.10.2 200 32851 "http://blog.fens.me/nodejs-async-windjs/" "Mozilla/5.0 (Macintosh;
true 1.202.186.37 - 2013-09-18 15:39:19 /js/baidu.js 200 249 "http://blog.fens.me/nodejs-async-windjs/" "Mozilla/5.0 (Macintosh;
true 1.202.186.37 - 2013-09-18 15:39:19 /js/google.js 200 475 "http://blog.fens.me/nodejs-async-windjs/" "Mozilla/5.0 (Macintosh;
true 1.202.186.37 - 2013-09-18 15:39:19 /wp-content/themes/silesia/images/bullets/5.gif 200 62 "http://blog.fens.me/nodejs-async-windjs/" "Mozilla/5.0 (Macintosh;
true 1.202.186.37 - 2013-09-18 15:39:19 /wp-content/themes/silesia/images/crubms-div.png 200 1255 "http://blog.fens.me/nodejs-async-windjs/" "Mozilla/5.0 (Macintosh;
true 1.202.186.37 - 2013-09-18 15:39:19 /wp-content/themes/silesia/images/home-ico.png 200 1103 "http://blog.fens.me/nodejs-async-windjs/" "Mozilla/5.0 (Macintosh;
true 1.202.186.37 - 2013-09-18 15:39:19 /wp-content/themes/silesia/images/ico-meta.gif 200 73 "http://blog.fens.me/nodejs-async-windjs/" "Mozilla/5.0 (Macintosh;
true 1.202.186.37 - 2013-09-18 15:39:19 /wp-content/themes/silesia/images/natty-logo.png 200 1438 "http://blog.fens.me/nodejs-async-windjs/" "Mozilla/5.0 (Macintosh;
true 1.202.186.37 - 2013-09-18 15:39:19 /wp-content/themes/silesia/images/slide-bg.png 200 934 "http://blog.fens.me/nodejs-async-windjs/" "Mozilla/5.0 (Macintosh;
true 1.202.186.37 - 2013-09-18 15:39:19 /wp-content/themes/silesia/images/sprites/post-type.png 200 2009 "http://blog.fens.me/nodejs-async-windjs/" "Mozilla/5.0 (Macintosh;
true 1.202.186.37 - 2013-09-18 15:39:19 /wp-content/uploads/2013/08/stage1.png 200 10208 "http://blog.fens.me/nodejs-async-windjs/" "Mozilla/5.0 (Macintosh;
true 1.202.186.37 - 2013-09-18 15:39:19 /wp-content/uploads/2013/08/stage2.png 200 16419 "http://blog.fens.me/nodejs-async-windjs/" "Mozilla/5.0 (Macintosh;
true 1.202.186.37 - 2013-09-18 15:39:19 /wp-content/uploads/2013/08/stage3.png 200 15227 "http://blog.fens.me/nodejs-async-windjs/" "Mozilla/5.0 (Macintosh;
true 1.202.186.37 - 2013-09-18 15:39:20 /wp-content/uploads/2013/05/favicon.ico 200 1150 "-" "Mozilla/5.0 (Macintosh;
[hadoop@centos-aaron-h1 ~]$
最后寄语,以上是博主本次文章的全部内容,如果大家觉得博主的文章还不错,请点赞;如果您对博主其它服务器大数据技术或者博主本人感兴趣,请关注博主博客,并且欢迎随时跟博主沟通交流。