`

Hadoop分析日志实例的详细步骤及出现的问题分析和解决

阅读更多

1). 日志格式分析

首先分析 Hadoop 的日志格式, 日志是一行一条, 日志格式可以依次描述为:日期、时间、级别、相关类和提示信息。如下所示:

2014-01-07 00:31:25,393 INFO org.apache.hadoop.mapred.JobTracker: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down JobTracker at hadoop1/192.168.91.101
************************************************************/
2014-01-07 00:33:42,425 INFO org.apache.hadoop.mapred.JobTracker: STARTUP_MSG: 
/************************************************************
STARTUP_MSG: Starting JobTracker
STARTUP_MSG:   host = hadoop1/192.168.91.101
STARTUP_MSG:   args = []
STARTUP_MSG:   version = 1.1.2
STARTUP_MSG:   build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.1 -r 1440782; compiled by 'hortonfo' on Thu Jan 31 02:03:24 UTC 2013
************************************************************/
2014-01-07 00:33:43,305 INFO org.apache.hadoop.metrics2.impl.MetricsConfig: loaded properties from hadoop-metrics2.properties
2014-01-07 00:33:43,358 INFO org.apache.hadoop.metrics2.impl.MetricsSourceAdapter: MBean for source MetricsSystem,sub=Stats registered.
2014-01-07 00:33:43,359 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: Scheduled snapshot period at 10 second(s).
2014-01-07 00:33:43,359 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: JobTracker metrics system started
2014-01-07 00:33:43,562 INFO org.apache.hadoop.metrics2.impl.MetricsSourceAdapter: MBean for source QueueMetrics,q=default registered.
2014-01-07 00:33:44,118 INFO org.apache.hadoop.metrics2.impl.MetricsSourceAdapter: MBean for source ugi registered.
2014-01-07 00:33:44,118 INFO org.apache.hadoop.security.token.delegation.AbstractDelegationTokenSecretManager: Updating the current master key for generating delegation tokens
2014-01-07 00:33:44,119 INFO org.apache.hadoop.mapred.JobTracker: Scheduler configured with (memSizeForMapSlotOnJT, memSizeForReduceSlotOnJT, limitMaxMemForMapTasks, limitMaxMemForReduceTasks) (-1, -1, -1, -1)
2014-01-07 00:33:44,120 INFO org.apache.hadoop.util.HostsFileReader: Refreshing hosts (include/exclude) list
2014-01-07 00:33:44,125 INFO org.apache.hadoop.security.token.delegation.AbstractDelegationTokenSecretManager: Starting expired delegation token remover thread, tokenRemoverScanInterval=60 min(s)
2014-01-07 00:33:44,125 INFO org.apache.hadoop.security.token.delegation.AbstractDelegationTokenSecretManager: Updating the current master key for generating delegation tokens
2014-01-07 00:33:44,126 INFO org.apache.hadoop.mapred.JobTracker: Starting jobtracker with owner as root
2014-01-07 00:33:44,187 INFO org.apache.hadoop.metrics2.impl.MetricsSourceAdapter: MBean for source RpcDetailedActivityForPort9001 registered.
2014-01-07 00:33:44,187 INFO org.apache.hadoop.metrics2.impl.MetricsSourceAdapter: MBean for source RpcActivityForPort9001 registered.
2014-01-07 00:33:44,188 INFO org.apache.hadoop.ipc.Server: Starting SocketReader
2014-01-07 00:33:44,490 INFO org.mortbay.log: Logging to org.slf4j.impl.Log4jLoggerAdapter(org.mortbay.log) via org.mortbay.log.Slf4jLog
2014-01-07 00:33:44,805 INFO org.apache.hadoop.http.HttpServer: Added global filtersafety (class=org.apache.hadoop.http.HttpServer$QuotingInputFilter)
2014-01-07 00:33:44,825 INFO org.apache.hadoop.http.HttpServer: Port returned by webServer.getConnectors()[0].getLocalPort() before open() is -1. Opening the listener 

这只是部分日志。

2). 程序设计
本程序是在个人机器用 Eclipse 开发,该程序连接 Hadoop 集群,处理完的结果存储在MySQL 服务器上。下面是程序开发示例图。

MySQL 数据库的存储信息的表“hadooplog”的 SQL 语句如下:

 

drop table if exists  hadooplog;
create table hadooplog(
    id int(11) not null auto_increment,
    rdate varchar(50)  null,
    time varchar(50) default null,
    type varchar(50) default null,
    relateclass tinytext default null,
    information longtext default null,
    primary key (id)
) engine=innodb default charset=utf8;


操作如下:进入mysql 直接执行sql语句就行,创建一个hadooplog表

 

 3). 程序代码

 

package com.wzl.hive;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * 该类的主要功能是负责建立与 Hive 和 MySQL 的连接, 由于每个连接的开销比较大, 所以此类的设计采用设计模式中的单例模式。
 */
class DBHelper {
        private static Connection connToHive = null;
        private static Connection connToMySQL = null;

        private DBHelper() {
        }

        // 获得与 Hive 连接,如果连接已经初始化,则直接返回
        public static Connection getHiveConn() throws SQLException {
                if (connToHive == null) {
                        try {
                                Class.forName("org.apache.hadoop.hive.jdbc.HiveDriver");
                        } catch (ClassNotFoundException err) {
                                err.printStackTrace();
                                System.exit(1);
                        }
                        connToHive = DriverManager.getConnection("jdbc:hive://192.168.91.101:10000/default", "hive", "");
                }
                return connToHive;
        }

        // 获得与 MySQL 连接
        public static Connection getMySQLConn() throws SQLException {
                if (connToMySQL == null) {
                        try {
                                Class.forName("com.mysql.jdbc.Driver");
                        } catch (ClassNotFoundException err) {
                                err.printStackTrace();
                                System.exit(1);
                        }

                        connToMySQL = DriverManager.getConnection("jdbc:mysql://192.168.91.101:3306/hive?useUnicode=true&characterEncoding=UTF8",
                                        "root", "root"); //编码不要写成UTF-8
                }
                return connToMySQL;
        }

        public static void closeHiveConn() throws SQLException {
                if (connToHive != null) {
                        connToHive.close();
                }
        }

        public static void closeMySQLConn() throws SQLException {
                if (connToMySQL != null) {
                        connToMySQL.close();
                }
        }
        
        public static void main(String[] args) throws SQLException {
                System.out.println(getMySQLConn());
                closeMySQLConn();
        }

}

 

package com.wzl.hive;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * 
 * 针对 Hive 的工具类
 */
class HiveUtil {
        // 创建表
        public static void createTable(String sql) throws SQLException {
                Connection conn = DBHelper.getHiveConn();
                Statement stmt = conn.createStatement();
                ResultSet res = stmt.executeQuery(sql);
        }

        // 依据条件查询数据
        public static ResultSet queryData(String sql) throws SQLException {
                Connection conn = DBHelper.getHiveConn();
                Statement stmt = conn.createStatement();
                ResultSet res = stmt.executeQuery(sql);
                return res;
        }

        // 加载数据
        public static void loadData(String sql) throws SQLException {
                Connection conn = DBHelper.getHiveConn();
                Statement stmt = conn.createStatement();
                ResultSet res = stmt.executeQuery(sql);
        }

        // 把数据存储到 MySQL 中
        public static void hiveToMySQL(ResultSet res) throws SQLException {
                Connection conn = DBHelper.getMySQLConn();
                Statement stmt = conn.createStatement();
                while (res.next()) {
                        String rdate = res.getString(1);
                        String time = res.getString(2);
                        String type = res.getString(3);
                        String relateclass = res.getString(4);
                        String information = res.getString(5) + res.getString(6) + res.getString(7);
                        StringBuffer sql = new StringBuffer();
                        sql.append("insert into hadooplog values(0,'");
                        sql.append(rdate + "','");
                        sql.append(time + "','");
                        sql.append(type + "','");
                        sql.append(relateclass + "','");
                        sql.append(information + "')");
                        System.out.println(sql.toString());
                        int i = stmt.executeUpdate(sql.toString());
                }
        }
}

 

package com.wzl.hive;

import java.sql.ResultSet;
import java.sql.SQLException;

public class AnalyszeHadoopLog {

        public static void main(String[] args) throws SQLException {
                StringBuffer sql = new StringBuffer();

                // 第一步:在 Hive 中创建表
                sql.append("create table if not exists loginfo( ");
                sql.append("rdate string,  ");
                sql.append("time array<string>, ");
                sql.append("type string, ");
                sql.append("relateclass string, ");
                sql.append("information1 string, ");
                sql.append("information2 string, ");
                sql.append("information3 string)  ");
                sql.append("row format delimited fields terminated by ' '  ");
                sql.append("collection items terminated by ','   ");
                sql.append("map keys terminated by  ':'");

                System.out.println(sql);
                HiveUtil.createTable(sql.toString());

                // 第二步:加载 Hadoop 日志文件
                sql.delete(0, sql.length());
                sql.append("load data local inpath ");
                sql.append("'/usr/local/hadoop/logs/hadoop-root-jobtracker-hadoop1.log'");
                sql.append(" overwrite into table loginfo");
                System.out.println(sql);
                HiveUtil.loadData(sql.toString());

                // 第三步:查询有用信息
                sql.delete(0, sql.length());
                sql.append("select rdate,time[0],type,relateclass,");
                sql.append("information1,information2,information3 ");
                sql.append("from loginfo where type='INFO'");
                System.out.println(sql);
                ResultSet res = HiveUtil.queryData(sql.toString());
                // 第四步:查出的信息经过变换后保存到 MySQL 中
                HiveUtil.hiveToMySQL(res);
                // 第五步:关闭 Hive 连接
                DBHelper.closeHiveConn();

                // 第六步:关闭 MySQL 连接
                DBHelper.closeMySQLConn();
        }
}


4). 运行结果
在执行之前要注意的问题:

 

 

  1. 在运行前必须保证hive远端服务端口是开的  执行命令:nohup hive --service hiveserver  &  如果没有执行这句命令常出现这个错误:Could not establish connection to 192.168.91.101:10000/default: java.net.ConnectException: Connection refused: connect
  2. mysql已经建立了hadooplog表
  3. mysql数据库允许本机连接数据库执行命令:grant all privileges on *.* to root@'%' identified by 'root'; 这句意思是允许任何的ip都能访问mysql数据库。如果如果没有执行这句命令常出现这个错误:java连接linux中mysql出现:Access denied for user 'root'@'192.168.91.1' (using password: YES)

 

 

mysql> use hive;
mysql> show tables;
mysql> select * from hadooplog;

 

 

5). 经验总结
在示例中同时对 Hive 的数据仓库库和 MySQL 数据库进行操作,虽然都是使用了 JDBC接口,但是一些地方还是有差异的,这个实战示例能比较好地体现 Hive 与关系型数据库的异同。
如果我们直接采用 MapReduce 来做,效率会比使用 Hive 高,因为 Hive 的底层就是调用了 MapReduce,但是程序的复杂度和编码量都会大大增加,特别是对于不熟悉 MapReduce编程的开发人员,这是一个棘手问题。Hive 在这两种方案中找到了平衡,不仅处理效率较高,而且实现起来也相对简单,给传统关系型数据库编码人员带来了便利,这就是目前 Hive被许多商业组织所采用的原因。

 

分享到:
评论

相关推荐

    hadoop几个实例

    例如,可能有一个实例是使用Hadoop处理日志文件,分析用户行为;或者使用MapReduce计算大规模数据集的统计指标,如平均值、最大值和最小值。 5. **Hadoop生态系统**:Hadoop并不是孤立的,它有一个丰富的生态系统,...

    大数据时代:高性能Hadoop集群与应用案例

    5. **EMC的统一数据存储和分析平台**:EMC利用Hadoop建立了一个综合性的数据存储和分析解决方案,帮助企业更好地管理和分析数据。 #### 四、结语 Hadoop作为大数据领域的关键技术之一,为企业提供了强大的数据处理...

    hadoop史上最详尽的实例

    5. 日志处理:收集和分析系统及应用日志,监控系统性能,及时发现和解决问题。 四、Hadoop实战——《Hadoop实战》 《Hadoop实战》这本书提供了丰富的实践教程,涵盖从基础概念到高级技术,包括集群搭建、数据处理...

    基于 Hadoop 平台,使用 MapReduce 编程,统计NBA球员五项数据.zip

    在大数据处理领域,Hadoop 是一个至关...通过实际操作,我们可以深入了解大数据处理的流程,并学习如何利用 Hadoop 解决实际问题。在人工智能的背景下,这种能力尤为重要,因为高效的数据处理是许多 AI 应用的基础。

    Hadoop平台搭建及实例运行.docx

    本文档详细介绍了在Ubuntu系统上搭建Hadoop平台的步骤,并通过一个简单的WordCount实例展示了其运行过程。 首先,搭建Hadoop平台需要满足一定的硬件环境,包括足够的内存、处理器和磁盘空间。在Ubuntu系统上,我们...

    基于MapReduce的Hadoop实例.zip

    在AI领域,Hadoop通过其强大的数据处理能力,帮助解决机器学习和深度学习中的大规模数据问题。例如: 1. 数据预处理:Hadoop可以高效地清洗、整合和转换海量数据,为后续的模型训练提供准备。 2. 训练模型:利用...

    hadoop核心技术

    总之,“Hadoop核心技术”涵盖了从理论到实践的全面知识,从理解Hadoop的基本架构到掌握其优化配置,再到运用Hadoop解决实际问题,每一个环节都是大数据处理中不可或缺的部分。通过对Hadoop的学习和应用,我们可以...

    hadoop-1.2.1运行WordCount

    - 可以通过检查Hadoop的日志配置文件,调整日志输出策略来解决此类问题。 3. **调试工具使用不当**: - 在使用Hadoop Web界面查看任务日志时,如果选择不当的查看方式也可能导致混淆。 - 确保正确选择查看map和...

    Hadoop完全分布式详细安装图解教程

    学习如何阅读和理解Hadoop的日志文件对于解决这些问题非常有帮助。 通过这个高清图解教程,你将能够亲手实践每一个步骤,深入了解Hadoop的分布式架构和工作原理。记得在实际操作中,耐心和细心是成功的关键。如果你...

    Hadoop官方教案

    最后一课将通过具体的应用场景,如日志分析、推荐系统等,演示如何利用Hadoop解决实际问题。通过实例,学员可以更直观地理解和应用所学知识。 通过这套官方教案,无论是对Hadoop感兴趣的初学者还是寻求深化理解的...

    Hadoop经典参考书

    在配置指导方面,书中会提供详尽的步骤和实例,帮助读者在实际环境中安装、配置和管理Hadoop集群。这包括硬件需求、网络配置、安全设置以及性能调优等方面。同时,也会介绍如何使用Hadoop与其他工具(如Pig、Spark、...

    Hadoop入门手册

    8. **Hadoop应用实例**:通过具体的案例,如网页日志分析、推荐系统等,演示如何使用Hadoop解决实际问题,让你更好地理解和掌握Hadoop的实际应用。 9. **Hadoop的高级主题**:包括Hadoop的安全性、性能调优、容错与...

    实战hadoop源代码

    1. **Hadoop环境搭建**:源代码可能包含如何在本地或虚拟机上安装和配置Hadoop的详细步骤,包括配置Hadoop的环境变量、修改Hadoop配置文件(如hdfs-site.xml和mapred-site.xml)等。 2. **HDFS操作**:源码可能包含...

    尚硅谷大数据技术之Hadoop

    4. Hadoop实战:通过实际案例分析,演示如何使用Hadoop解决实际问题,例如日志分析、数据挖掘等。 在【3.代码.zip】中,可能包含了一系列示例代码,用于辅助学习者实践Hadoop编程。这些代码可能涵盖了以下方面: 1....

    云计算hadoop java写的源代码

    2. **运行和调试**:在本地或集群环境中运行代码,观察其执行过程和输出,通过日志分析可能出现的问题。 3. **修改和优化**:尝试修改代码,如改变分区策略、优化Mapper和Reducer的实现,以提升性能。 4. **扩展应用...

    大数据教程之搭建Hadoop集群.zip_大数据环境搭建hadoop

    1. "hadoop安装实例(原创最终版).doc":这可能是一个详细的Hadoop安装步骤文档,包括了从下载源码到编译、安装、配置的全过程,可能还包含了遇到问题时的解决方案。 2. "细细品味Hadoop_Hadoop集群(第1期)_...

    Hadoop商业应用案例(1)

    【描述】提到的“开发商业实例进行Hadoop的使用,开发分析讲解”意味着本资料可能包含具体的项目实施步骤、技术选型考量以及数据分析方法。通过视频教程和学习大纲,学习者可以系统地了解如何将Hadoop技术应用于实际...

    Hadoop实战+源代码

    通过实例代码,读者可以掌握如何处理各种类型的数据和计算问题。 5. **HDFS操作**:Hadoop实战中包含如何使用HDFS命令进行文件操作,如上传、下载、查看文件属性等。同时,还会讨论HDFS的副本策略和故障恢复机制。 ...

    Hadoop学习网址

    - **最佳实践**: 分享了一些实际应用场景下的配置和优化技巧,帮助用户更好地利用Hadoop解决实际问题。 #### 二、Wikipedia上的Hadoop条目 - **网址**: [Wikipedia上的Hadoop页面]...

Global site tag (gtag.js) - Google Analytics