大数据项目实战之新闻话题统计分析

本文介绍了一个大数据项目,涉及实时和离线统计分析新闻搜索话题,利用JavaEE前端展示。项目使用Hadoop、Spark、Flume、Kafka、Hive等工具,实现了数据采集、处理、实时计算、Java后台开发和Web前端展示的完整流程。通过Apache组件处理日志,数据存储在HBase和Hive中,Spark进行实时和离线分析,结果存储在MySQL,并通过WebSocket进行前端实时通信。
摘要由CSDN通过智能技术生成

前言:本文是一个完整的大数据项目实战,实时|离线统计分析用户的搜索话题,并用JavaEE工程前端界面展示出来。这些指标对网站的精准营销、运营都有极大帮助。架构大致是按照企业标准来的,从日志的采集、转化处理、实时计算、JAVA后台开发、WEB前端展示,一条完整流程线下来,甚至每个节点都用的高可用架构,都考虑了故障转移和容错性。所用到的框架包括 :Hadoop(HDFS+MapReduce+Yarn)+Flume+KafKa+Hbase+Hive+Spark(SQL、Streaming )+Hive+Mysql+SpringMVC+Mybatis+Websocket+AugularJs+Echarts。所涉及到的语言包括:JAVA、Scala、Shell 

项目部署地址:http://120.79.35.74:443/Hot_News_Web/

项目源代码联系邮箱:tangzhi8023@gmail.com

项目架构图:

 

     一:数据源处理(搜狗实验室获取新闻资源 XML——>TXT:java解析大批量xml文件 代码后贴)

 

       处理思路:利用SAXReader获取xml文件内容,并构建News实体类以便写入txt文件,然后编写ReadWebLog类并编写脚本运行在Liunx上模拟新闻搜索日志产生

       Liunx运行jar命令:java -jar 你的上传jar包所在目录  args0 args1

       或Shell脚本命令:

#/bin/bash

echo "start log"

java -jar 你的上传jar包所在目录  args0 args1

 

代码:

处理搜狗实验室元数据.xml----->txt

package cn.yusys.hotnews.datasource;

 

import org.dom4j.Document;

import org.dom4j.Element;

import org.dom4j.io.SAXReader;

 

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileWriter;

import java.io.IOException;

import java.text.SimpleDateFormat;

import java.util.ArrayList;

import java.util.Date;

import java.util.Iterator;

import java.util.List;

 

/**

* 解析搜狗实验室新闻xml文件为txt文件---->项目数据源

* @author Tangzhi mail:tangzhi8023@gmail.com

* Created on 2018年11月12日

*/

public class MyXMLReader2JDOM {

    public static void main(String[] args) {

        // 获取xml文件读取流

        SAXReader reader = new SAXReader();

        // 设置字符集编码方式

        reader.setEncoding("utf-8");

        Document document;

        Element rootElement;

        List<Element> docList;

        Iterator<Element> iterator;

        // 用于存放节点数据以便后面的写入之news.log

        ArrayList<News> list = new ArrayList<News>();

        // 开始进行读取

        try {

            document = reader.read(new File("D:\\Downloads\\大数据数据源\\news_tensite_xml.smarty.dat"));

            // 得到根节点元素 <docs>...</docs>

            rootElement = document.getRootElement();

            //<doc>...<doc>

            docList = rootElement.elements("doc");

         /*

          * 得到xml具体配置文件信息

          */

            iterator = docList.iterator();

            for (Element e : docList) {

                News news = new News();

                /**

                 * 遍历子节点将具体新闻信息写入txt文件

                 */

                if (e.element("url") != null && !" ".equals(e.element("url"))) {

                    news.setUrl(e.element("url").getStringValue().trim());

                }

                if (e.element("docno") != null && !" ".equals(e.element("docno"))) {

                    news.setDocno(e.element("docno").getStringValue().trim());

                }

                if (e.element("contenttitle") != null && !" ".equals(e.element("contenttitle"))) {

                    news.setContenttitle(e.element("contenttitle").getStringValue().trim());

                }

                if (e.element("content") != null && !" ".equals(e.element("content"))) {

                    news.setContent(e.element("content").getStringValue().trim());

                }

                list.add(news);

            }

            /**

             * 进行写入txt文件

             */

            writwToFile(list);

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

    /**

     * 写入txt文件(后期当源数据文件过大时进行分片处理)

     * @throws IOException

     */

    public static void writwToFile(List<News> list) throws IOException {

        File file = new File("D:\\Downloads\\大数据数据源\\news2.log");

        BufferedWriter bw = new BufferedWriter(new FileWriter(file));

        if (!file.exists()) {

            try {

                file.createNewFile();

            } catch (IOException e) {

                e.printStackTrace();

            }

        } else {

            for (News news : list) {

                Date date = new Date();

                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

                String dateStr = sdf.format(date);

                bw.write("datetime"+"="+dateStr+"|");

                bw.write("url"+"="+news.getUrl()+"|");

                bw.write("docno"+"="+news.getDocno()+"|");

                bw.write("contenttitle"+"="+news.getContenttitle()+"|");

                bw.write("content"+"="+news.getContent());

                bw.write("\n");

                bw.flush();

            }

        }

    }

}

----------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------

package cn.yusys.hotnews.datasource;

/**

*xml解析时新闻实体类

*/

public class News implements Serializable{

     // 实现序列化接口以便多台机器同时解析

   public News () {

       

   }

   

   public News(String url, String docno, String contenttitle, String content) {

    super();

    this.url = url;

    this.docno = docno;

    this.contenttitle = contenttitle;

    this.content = content;

}

 

String url;

   String docno;

   String contenttitle;

   String content;

public String getUrl() {

    return url;

}

public void setUrl(String url) {

    this.url = url;

}

public String getDocno() {

    return docno;

}

public void setDocno(String docno) {

    this.docno = docno;

}

public String getContenttitle() {

    return contenttitle;

}

public void setContenttitle(String contenttitle) {

    this.contenttitle = contenttitle;

}

public String getContent() {

    return content;

}

public void setContent(String content) {

    this.content = content;

}

   

}

-----------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------

运行在Liunx上模拟日志产生并通过flume采集

package cn.yusys.hotnews.datasource;

import java.io.*;

/**

* 模拟日志服务器产生日(从news.log/news1.log中随机切换文件读取数据然后写入日志文件-----》然后使用进行flume采集)

* @author Tangzhi mail:tangzhi8023@gmail.com

* @date 2018年11月12日<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值