1.需求:
现有一些原始日志需要做增强解析处理,流程:
1、 从原始日志文件中读取数据(日志文件:https://pan.baidu.com/s/12hbDvP7jMu9yE-oLZXvM_g)
2、 根据日志中的一个URL字段到外部知识库中获取信息增强到原始日志
3、 如果成功增强,则输出到增强结果目录;如果增强失败,则抽取原始数据中URL字段输出到待爬清单目录
2.需求分析:
程序的关键点是要在一个mapreduce程序中根据数据的不同输出两类结果到不同目录,这类灵活的输出需求可
以通过自定义outputformat来实现
3.需求实现:
技术实现要点:
1、 在mapreduce中访问外部资源(知识数据库)
2、 自定义outputformat,改写其中的recordwriter,改写具体输出数据的方法write()
代码实现:
1.数据库获取数据的工具类:
1.首先启动数据库服务(192.168.232.201):service mysql start
2.使用远程客户端连接数据库工具Navicat操作数据库:导入创建url_rule表语句和导入该表数据
3.创建表语句及其数据下载:https://pan.baidu.com/s/1k74-o8wbFp5QC8Ee4Fu1YQ
package cn.bigdata.hdfs.LogEnhance; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.Map; public class DBLoader { public static void dbLoader(Map<String, String> ruleMap) throws Exception { Connection conn = null; Statement st = null; ResultSet res = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://192.168.232.201:3306/mysql", "root", "root"); st = conn.createStatement(); res = st.executeQuery("select url,content from url_rule"); while (res.next()) { ruleMap.put(res.getString(1), res.getString(2)); } } finally { try{ if(res!=null){ res.close(); } if(st!=null){ st.close(); } if(conn!=null){ conn.close(); } }catch(Exception e){ e.printStackTrace(); } } } }