基于论坛的apache common日志分析项目

Apache虚拟主机核心原理与Debian 7实战配置 虚拟主机是Web服务器实现多站点托管的基础机制,其本质是HTTP请求中Host头与服务端配置的精确匹配过程。原理上依赖监听地址声明(NameVirtualHost)、域名标识(ServerName/ServerAlias)和路径映射(DocumentRoot+Directory)三层协同,缺一不可。该机制具有高度通用性,支撑着现代运维中宝塔面板站点隔离、JMeter多域名压测、Shiro漏洞靶场环境划分等关键场景。理解其在Apache 2.2时代的原生实现,能穿透框架封装,精准定位路由错配、403拒绝、.h 阅读详情

项目托管于 Github,欢迎Star | Fork 并留言互相学习 基于论坛的apache common日志分析项目

项目描述

通过对技术论坛的apache common日志进行分析,计算论坛关键指标,供运营者决策。

项目设计

  • MapReduce程序计算KPI
  • HBASE详单查询
  • HIVE数据仓库多维分析

    日志报告分析

开发步骤:

1. 使用flume把日志数据导入到hdfs中

技术:flume(源是文件夹,目的是hdfs和hbase,管道是文件)
flume-hdfs.conf

# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# Describe/configure the source
a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = /home/elon/log

a1.sources.r1.fileHeader = true

# Describe the sink
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://hadoop:9000/log/
a1.sinks.k1.hdfs.filePrefix = access-%Y-%m-%d
a1.sinks.k1.hdfs.round = true
a1.sinks.k1.hdfs.roundValue = 10
a1.sinks.k1.hdfs.roundUnit = minute
a1.sinks.k1.hdfs.useLocalTimeStamp = true
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

2. 对数据进行清洗

技术:mapreduce
package com.elon33.bbs;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
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.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

public class bbsCleaner extends Configured implements Tool {
    @Override
    public int run(String[] args) throws Exception {
        final Job job = new Job(new Configuration(), bbsCleaner.class.getSimpleName());
        job.setJarByClass(bbsCleaner.class);
        FileInputFormat.setInputPaths(job, args[0]);
        job.setMapperClass(MyMapper.class);
        job.setMapOutputKeyClass(LongWritable.class);
        job.setMapOutputValueClass(Text.class);
        job.setReducerClass(MyReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(NullWritable.class);
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        job.waitForCompletion(true);
        return 0;
    }

    public static void main(String[] args) throws Exception {
        ToolRunner.run(new bbsCleaner(), args);
    }

    static class MyMapper extends Mapper<LongWritable, Text, LongWritable, Text> {
        LogParser logParser = new LogParser();
        Text v2 = new Text();

        protected void map(LongWritable key, Text value,
                org.apache.hadoop.mapreduce.Mapper<LongWritable, Text, LongWritable, Text>.Context context)
                        throws java.io.IOException, InterruptedException {
            final String[] parsed = logParser.parse(value.toString());

            // 过滤掉静态信息
            if (parsed[2].startsWith("GET /static/") || parsed[2].startsWith("GET /uc_server")) {
                return;
            }

            // 过掉开头的特定格式字符串
            if (parsed[2].startsWith("GET /")) {
                parsed[2] = parsed[2].substring("GET /".length());
            } else if (parsed[2].startsWith("POST /")) {
                parsed[2] = parsed[2].substring("POST /".length());
            }

            // 过滤结尾的特定格式字符串
            if (parsed[2].endsWith(" HTTP/1.1")) {
                parsed[2] = parsed[2].substring(0, parsed[2].length() - " HTTP/1.1".length());
            }

            v2.set(parsed[0] + "\t" + parsed[1] + "\t" + parsed[2]);
            context.write(key, v2);
        };
    }

    static class MyReducer extends Reducer<LongWritable, Text, Text, NullWritable> {
        protected void reduce(LongWritable k2, java.lang.Iterable<Text> v2s,
                org.apache.hadoop.mapreduce.Reducer<LongWritable, Text, Text, NullWritable>.Context context)
                        throws java.io.IOException, InterruptedException {
            for (Text v2 : v2s) {
                context.write(v2, NullWritable.get());
            }
        };
    }

    static class LogParser {
        public static final SimpleDateFormat FORMAT = new SimpleDateFormat("d/MMM/yyyy:HH:mm:ss", Locale.ENGLISH);
        public static final SimpleDateFormat dateformat1 = new SimpleDateFormat("yyyyMMddHHmmss");

        public static void main(String[] args) throws ParseException {
            final String S1 = "27.19.74.143 - - [30/May/2013:17:38:20 +0800] \"GET /static/image/common/faq.gif HTTP/1.1\" 200 1127";
            LogParser parser = new LogParser();
            final String[] array = parser.parse(S1);
            System.out.println("样例数据: " + S1);
            System.out.format("解析结果:  ip=%s, time=%s, url=%s, status=%s, traffic=%s", array[0], array[1], array[2],
                    array[3], array[4]);
        }

        /**
         * 解析英文时间字符串
         * 
         * @param string
         * @return
         * @throws ParseException
         */
        private Date parseDateFormat(String string) {
            Date parse = null;
            try {
                parse = FORMAT.parse(string);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return parse;
        }

        /**
         * 解析日志的行记录
         * 
         * @param line
         * @return 数组含有5个元素,分别是ip、时间、url、状态、流量
         */
        public String[] parse(String line) {
            String ip = parseIP(line);
            String time = parseTime(line);
            String url = parseURL(line);
            String status = parseStatus(line);
            String traffic = parseTraffic(line);

            return new String[] { ip, time, url, status, traffic };
        }

        private String parseTraffic(String line) {
            final String trim = line.substring(line.lastIndexOf("\"") + 1).trim();
            String traffic = trim.split(" ")[1];
            return traffic;
        }

        private String parseStatus(String line) {
            final String trim = line.substring(line.lastIndexOf("\"") + 1).trim();
            String status = trim.split(" ")[0];
            return status;
        }

        private String parseURL(String line) {
            final int first = line.indexOf("\"");
            final int last = line.lastIndexOf("\"");
            String url = line.substring(first + 1, last);
            return url;
        }

        private String parseTime(String line) {
            final int first = line.indexOf("[");
            final int last = line.indexOf("+0800]");
            String time = line.substring(first + 1, last).trim();
            Date date = parseDateFormat(time);
            return dateformat1.format(date);
        }

        private String parseIP(String line) {
            String ip = line.split("- -")[0].trim();
            return ip;
        }
    }

}

数据清洗结果

hadoop fs -cat /user/elon/bbs_cleaned/2013_05_30/part-r-00000

3. 明细日志使用hbase存储,能够利用ip、时间查询

技术:设计表、预分区
在HBase中创建bbs_log表,其中包含一个列族cf
HBase=> create 'bbs_log','cf'
package com.elon33.bbs;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.mapreduce.TableOutputFormat;
import org.apache.hadoop.hbase.mapreduce.TableReducer;
import org.apache.hadoop.hbase.util.Bytes;
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.input.TextInputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;


public class bbsHBase extends Configured implements Tool {

    @Override
    public int run(String[] args) throws Exception {
        final Configuration configuration = new Configuration();
        // 设置zookeeper
        configuration.set("hbase.zookeeper.quorum", "hadoop");
        // 设置hbase表名称
        configuration.set(TableOutputFormat.OUTPUT_TABLE, "bbs_log");// 先在shell下创建一个表:create
        // 将该值改大,防止hbase超时退出
        configuration.set("dfs.socket.timeout", "180000");

        final Job job = new Job(configuration, "bbsHBaseBatchImport");
        job.setJarByClass(bbsHBase.class);  //是否打jar包运行
        job.setMapperClass(MyMapper.class);
        job.setReducerClass(MyReducer.class);

        // 设置map的输出类型,不设置reduce的输出类型
        job.setMapOutputKeyClass(LongWritable.class);
        job.setMapOutputValueClass(Text.class);
        job.setInputFormatClass(TextInputFormat.class);

        // 不再设置输出路径,而是设置输出格式类型
        job.setOutputFormatClass(TableOutputFormat.class);

        FileInputFormat.setInputPaths(job, args[0]);  // 设置输入文件为mapreduce中已经清洗过的文件
        job.waitForCompletion(true);
        return 0;
    }

    public static void main(String[] args) throws Exception {
        ToolRunner.run(new bbsHBase(), args);
    }

    static class MyMapper extends Mapper<LongWritable, Text, LongWritable, Text> {
        Text v2 = new Text();
        public static final SimpleDateFormat dateformat = new SimpleDateFormat("yyyyMMddHHmmss");
        public static final SimpleDateFormat dateformat1 = new SimpleDateFormat("yyyyMMdd");

        protected void map(LongWritable key, Text value,
                org.apache.hadoop.mapreduce.Mapper<LongWritable, Text, LongWritable, Text>.Context context)
                        throws java.io.IOException, InterruptedException {
            final String[] parsed = value.toString().split("\t");
            if(parsed.length==3){
                Date parseDate = null;
                String time1 = "";
                try {
                    parseDate = dateformat.parse(parsed[1]);
                    time1 = dateformat1.format(parseDate);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                String rowKey = parsed[0] + ":" + time1;// 设置行键:ip+time(只保留日期,去除时分秒)
                v2.set(rowKey + "\t" + parsed[0] + "\t" + parsed[1] + "\t" + parsed[2]); // ip+time ip  time  url
                context.write(key, v2);
            }else{
                return;
            }
        };
    }

    // 数据按行键和值 存入HBase中
    static class MyReducer extends TableReducer<LongWritable, Text, NullWritable> {
        protected void reduce(LongWritable k2, java.lang.Iterable<Text> v2s, Context context)
                throws java.io.IOException, InterruptedException {
            for (Text v2 : v2s) {
                final String[] splited = v2.toString().split("\t");
                final Put put = new Put(Bytes.toBytes(splited[0])); // 第一列行键
                put.add(Bytes.toBytes("cf"), Bytes.toBytes("date"), Bytes.toBytes(splited[1])); // 第二列IP
                put.add(Bytes.toBytes("cf"), Bytes.toBytes("time"), Bytes.toBytes(splited[2])); // 第三列time
                put.add(Bytes.toBytes("cf"), Bytes.toBytes("url"), Bytes.toBytes(splited[3])); // 第四列url
                context.write(NullWritable.get(), put);
            }
        };
    }
}

HBase中 bbs_log表存储结果

4. 使用hive进行数据的多维分析

技术:hive(表、视图)、自定义函数
# 存放数据的主分区表
hive -e "ALTER TABLE bbs ADD PARTITION(logdate='2013_05_30') LOCATION 'hdfs://hadoop:9000/user/elon/bbs_cleaned/2013_05_30';"
# create hive table everyday

## 统计单日PV数
hive -e "CREATE TABLE bbs_pv_2013_05_30 AS SELECT COUNT(1) AS PV FROM bbs WHERE logdate='2013_05_30';"

## 统计单日注册数
hive -e "CREATE TABLE bbs_reguser_2013_05_30 AS SELECT COUNT(1) AS REGUSER FROM bbs WHERE logdate='2013_05_30' AND INSTR(url,'member.php?mod=register')>0;"

## 统计单日访问IP用户数
hive -e "CREATE TABLE bbs_ip_2013_05_30 AS SELECT COUNT(DISTINCT ip) AS IP FROM bbs WHERE logdate='2013_05_30';"

## 统计单日跳出数
hive -e "CREATE TABLE bbs_jumper_2013_05_30 AS SELECT COUNT(1) AS jumper FROM (SELECT COUNT(ip) AS times FROM bbs WHERE logdate='2013_05_30' GROUP BY ip HAVING times=1) e;"

## 以上四个结果汇总到一张表统计
hive -e "CREATE TABLE bbs_2013_05_30 AS SELECT '2013_05_30', a.pv, b.reguser, c.ip, d.jumper FROM bbs_pv_2013_05_30 a JOIN bbs_reguser_2013_05_30 b ON 1=1 JOIN bbs_ip_2013_05_30 c ON 1=1 JOIN bbs_jumper_2013_05_30 d ON 1=1;"

汇总表结果

5. 把hive分析结果使用sqoop导出到mysql中

技术:sqoop、MySQL

创建bbs表

sqoop export --connect jdbc:mysql://hadoop:3306/bbs --username root --password 123456 --table bbs_logs --fields-terminated-by '\001' --export-dir 'hdfs://hadoop:9000/user/hive/warehouse/bbs_2013_05_30'

当最终分析的论坛指标数据导出到MySQL中时,之前那些临时表就可以删除了。在下面的自动调度中,实现临时表删除。

6. 最后,使用linux的crontab做自动调度

要想通过脚本实现每天自动调度进行日志分析,就必须用到shell脚本,将命令都封装在shell脚本中,通过每天日期的迭代和定时任务设置,实现自动调度分析日志。

在 crontab -e 中实现定时任务设置

* 1 * * * bbs_daily.sh

在 bbs_daily.sh 脚本中实现任务调度
bbs_daily.sh

#!/bin/sh

yesterday=`date --date='1 days ago' +%Y_%m_%d`
hmbbs_common.sh $yesterday

在bbs_common.sh 中通过通用命令脚本实现日志分析过程,得到分析指标结果
bbs_common.sh

#!/bin/sh

#get yesterday format string
#yesterday=`date --date='1 days ago' +%Y_%m_%d`
yesterday=$1

#upload logs to hdfs
hadoop fs -put /apache_logs/access_${yesterday}.log  /bbs_logs

#cleaning data
hadoop jar /apache_logs/cleaned.jar  /bbs_logs/access_${yesterday}.log  /bbs_cleaned/${yesterday}  1>/dev/null


#alter hive table and then add partition to existed table
hive -e "ALTER TABLE bbs ADD PARTITION(logdate='${yesterday}') LOCATION '/bbs_cleaned/${yesterday}';"

#create hive table everyday
hive -e "CREATE TABLE bbs_pv_${yesterday} AS SELECT COUNT(1) AS PV FROM bbs WHERE logdate='${yesterday}';"
hive -e "CREATE TABLE bbs_reguser_${yesterday} AS SELECT COUNT(1) AS REGUSER FROM bbs WHERE logdate='${yesterday}' AND INSTR(url,'member.php?mod=register')>0;"
hive -e "CREATE TABLE bbs_ip_${yesterday} AS SELECT COUNT(DISTINCT ip) AS IP FROM bbs WHERE logdate='${yesterday}';"
hive -e "CREATE TABLE bbs_jumper_${yesterday} AS SELECT COUNT(1) AS jumper FROM (SELECT COUNT(ip) AS times FROM bbs WHERE logdate='${yesterday}' GROUP BY ip HAVING times=1) e;"
hive -e "CREATE TABLE bbs_${yesterday} AS SELECT '${yesterday}', a.pv, b.reguser, c.ip, d.jumper FROM bbs_pv_${yesterday} a JOIN bbs_reguser_${yesterday} b ON 1=1 JOIN bbs_ip_${yesterday} c ON 1=1 JOIN bbs_jumper_${yesterday} d ON 1=1;"

#delete hive tables
hive -e "drop table bbs_pv_${yesterday};"
hive -e "drop table bbs_reguser_${yesterday};"
hive -e "drop table bbs_ip_${yesterday};"
hive -e "drop table bbs_jumper_${yesterday};"


#sqoop export to mysql
sqoop export --connect jdbc:mysql://hadoop0:3306/bbs --username root --password admin --table bbs_logs --fields-terminated-by '\001' --export-dir '/user/hive/warehouse/bbs_${yesterday}'

#delete hive tables
hive -e "drop table bbs_${yesterday};"
Apache访问日志分析(含源代码) 一个分析Apache服务器访问日志的工具, 基于C#开发. 可以分析用户访问所在地, 访问次数, UserAgent等信息. 立即下载

相关推荐

jetson agx orin开箱及接口介绍

jetson agx orin开箱及接口介绍

qq_58728069的博客 1万+

论坛日志处理项目总结

项目描述通过对黑马技术论坛的apache common日志进行分析, 计算论坛关键指标,供运营者决策。数据情况每行记录有5部分组成: 1.访问ip 2.访问时间 3.访问资源 4.访问状态 5.本次流量more access_2013_05_30.log27.19.74.143 - - [30/May/2013:17:38:20 +0800] “GET /static/image/com

岸芷汀兰 1779

企业网络架构设计:从内网到外网的无缝通信方案

本文详细解析了企业网络架构设计中的关键技术与实践方案,重点介绍了VLAN划分、OSPF路由优化、安全策略及无线网络集成等核心内容。通过OSPF多区域部署和链路聚合技术,实现内网到外网的无缝通信,提升企业网络性能与安全性。文章还提供了具体的配置示例和最佳实践,助力企业构建高效可靠的网络架构。

weixin_28331555的博客 625

Hadoop项目实战---黑马论坛日志分析

1、项目描述 通过对黑马技术论坛的apache common日志进行分析, 计算论坛关键指标,供运营者决策。 2、数据情况 每行记录有5部分组成: 1.访问ip 2.访问时间 3.访问资源【跟着两个访问的Url】 4.访问状态 5.本次流量 截取部分数据如下:27.19.74.143 - - [30/May/2013:17:38:21 +0800] "GET /static/im

什么最重要?算法!! 1万+

yolov5 onnx推理时报错[ONNXRuntimeError] : 2 : INVALID_ARGUMENT : Unexpected input data type.

yolov5 onnxruntime 推理报错

zjulkw的博客 1223

验证工具:VCS与Verdi介绍

VCS和Verdi都是Synopsys公司旗下的工具,在集成电路设计和验证领域发挥着重要作用。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 1346

爬虫爬取黑马程序员论坛的网页数据

这里的请求头header可以是任意一个网站上面的请求头,进入开发者模式就可以找到,推荐使用google浏览器,比较方便查看#file_name = '第' + str(page) + '页.html'begin_page = int(input('请输入起始页:'))end_page = int(input('请输出结束页:'))#根据url发起请求,获取服务器响应文件 url:待抓取的url。#上面的url以黑马程序员论坛的大数据技术交流模块为例子。#将html文件保存为网页文件。

weixin_66425427的博客 8817

《基于FPGA的数字信号处理》专栏的导航与说明

《基于FPGA的数字信号处理》专栏的导航与说明

孤独的单刀 4163

黑马大数据分析课程---2、用户访问网站日志采集

黑马大数据分析课程---2、用户访问网站日志采集 一、总结 一句话总结: 前端js埋点采集数据:用js对用户的行为(比如点击啊,跳转啊)进行采集,不影响用户的正常操作, 后端nginx处理接收数据: 1、nginx默认自带的日志收集是什么? access_log:就是用户访问的每一条数据都会写在里面 2、OpenResty是什么? 整合了Nginx和lua的框架:...

weixin_34303897的博客 451

8、硬件工程师笔试面试知识器件篇——二极管(2025版本)

当二极管正向偏置时(阳极相对于阴极为正电压),PN结内部的电场减小,允许电子和空穴复合,形成电流。而当二极管反向偏置时,PN结的电场增强,阻止电流通过。在接触区域,P型半导体中的空穴和N型半导体中的自由电子会相互扩散和复合,形成一个没有自由载流子的耗尽区。在设计电子电路时,平衡二极管的正向电压降(Vf)和最大电流(I)是一个重要的考虑因素,因为这两者直接影响电路的性能和效率。通过这些步骤,可以确保在设计电子电路时选择的二极管能够安全地处理预期的最大正向电流和最大反向电压,从而提高电路的可靠性和安全性。

XU157303764的博客 3504

【DaVinci Developer专题】-28-Client Server Port Interface中useArgumentType、useArrayBaseType和useVoid介绍

共7页 目录 1 ImplPolicy = useArgumentType 2 ImplPolicy = useArrayBaseType 3 ImplPolicy = useVoid 4 三者代码差异部分 5 结尾 <--返回「实战篇」博文-总目录--> <--返回「Autosar从入门到精通-实战篇」专栏主页--> 关键字: 缩略语/术语 含义 DEV DaVinci Developer

「汽车电子助手」的博客 1505

大数据日志数据分析

大数据日志分析: 1.背景 1.1 黑马论坛日志,数据分为两部分,原来是一个大文件56G,以后每天生成一个文件 1.2日志格式是apache common日志格式 1.3分析一些核心指标,供运营决策者使用 1.4开发该系统的目的是为了获取一些业务相关的指标,这些指标在第三方工具(谷歌统计,百度统计,cnzz统计)中无法获得。 2.开发步骤 2.1把日志数据上传到HDFS中进行处理 ...

zhengun的专栏 1795

基于Jeecgboot3.9.0的文档管理系统(四)

基于Jeecgboot3.9.0的文档管理系统(四)

宁波阿成的博客 255

Hadoop学习笔记—20.网站日志分析项目案例(一)项目介绍

一、项目背景与数据情况 1.1 项目来源   本次要实践的数据日志来源于国内某技术学习论坛,该论坛由某培训机构主办,汇聚了众多技术学习者,每天都有人发帖、回帖,如图1所示。 图1 项目来源网站-技术学习论坛   本次实践的目的就在于通过对该技术论坛的apache common日志进行分析,计算该论坛的一些关键指标,供运营者进行决策时参考。 PS:开发该系统的目的是为了获取一些

qq_35281775的博客 812

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

1-网站日志分析案例-日志数据处理介绍

本文是网站日志分析案例的第1部分,主要用于数据集介绍,日志分析的常用指标介绍,并针对案例的实现流程进行描述。

IT从业者的成长历程 1498

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Hadoop学习笔记—20.网站日志分析项目案例

一、项目背景与数据情况 1.1 项目来源   本次要实践的数据日志来源于国内某技术学习论坛,该论坛由某培训机构主办,汇聚了众多技术学习者,每天都有人发帖、回帖,如图1所示。 图1 项目来源网站-技术学习论坛   本次实践的目的就在于通过对该技术论坛的apache common日志进行分析,计算该论坛的一些关键指标,供运营者进行决策时参考。 PS:开发该系统的目

mergerly的专栏 4967

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

基于Hive的海量Web日志分析

1.背景 1.1 黑马论坛日志,数据分为两部分组成,原来是一个大文件,是56GB;以后每天生成一个文件,大约是150-200MB之间; 1.2 日志格式是apache common日志格式; 1.3 分析一些核心指标,供运营决策者使用; 1.4 开发该系统的目的是分了获取一些业务相关的指标,这些指标在第三方工具中无法获得的;   2.开发步骤 2.1 把日志数据上传到HDFS中进行处

小江专栏 3191

apache日志切割

对于搭建的网站来说,访问的话就会有访问日志。就对我们所搭建的discuz论坛来说,访问这个论坛就会有日志产生。[root@No~]#vim/usr/local/apache2/conf/extra/httpd-vhosts.conf找到以下内容:ErrorLog"logs/dummy-host.example.com-error_log"Cust...

weixin_34014277的博客 131

h2oGPT开源大模型深度解析:Apache 2.0商用、分层量化与生产级部署

大语言模型(LLM)本地化部署正成为企业AI落地的核心路径,其关键挑战在于商用合规性、显存效率与微调可控性。Apache 2.0协议提供无限制商用授权,显著降低法律与知识产权风险;分层量化技术在INT4/INT6混合精度下实现显存减半与精度帕累托最优,兼顾推理稳定性与成本效益。h2oGPT通过RoPE-ALiBi混合位置编码、领域增强词表及可信数据飞轮,强化长文本理解与专业场景泛化能力,已在法律、医疗、金融等垂直领域验证生产可用性。本文聚焦开源大模型的工程化闭环——从许可证合规、低显存推理、Docker容器

weixin_30340617的博客 429

Ubuntu 12.04 下 Froxlor 面板深度部署与原理剖析

Web服务器管理面板是运维自动化的核心基础设施,其本质是通过图形化界面封装底层LAMP/LEMP组件的配置逻辑。理解面板运行原理需回归基础:PHP扩展加载机制、Apache MPM模型差异、MySQL最小权限设计及Web服务进程模型。Froxlor作为轻量级代表,不依赖复杂框架,直连系统服务,因此成为学习Web服务架构解耦与安全加固的理想样本。它强制暴露PHP-FPM与Apache协作细节、system()调用权限继承规则、以及Debian系配置目录分离规范,特别适合需要掌握老旧系统维护、嵌入式运维或等保合

转些好文章,促进分享。 487
上一篇: 【概率论与数理统计】-排列组合笔试题汇总
下一篇: Hive
gamedev˚
博客等级 码龄12年 280粉丝 293原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值