ETL项目2:大数据清洗,处理:使用MapReduce进行离线数据分析并报表显示完整项目

ETL项目2:大数据清洗,处理:使用MapReduce进行离线数据分析并报表显示完整项目

思路同我之前的博客的思路 https://www.cnblogs.com/symkmk123/p/10197467.html

但是数据是从web访问的数据

avro第一次过滤

观察数据的格式,我们主要分析第四个字段的数据.发现有.css , .jpg .png等等等无效的数据.

通过观察数据发现有效数据都不带 . , 所以第一次过滤写入avro总表里的数据一次过滤后的有效数据,不包含 .css , .jpg , .png 这样的数据

同时count持久化到mysql

orc1:海牛的topics 最受欢迎的top10

通过观察发现这个需求的有效url是 /topics/数字的 所以在第一次过滤的数据的基础上的正则就是

这种保留下来的也只是/topics/数字这种格式,方便用 hql统计结果

上代码

//Text2Avro
package mrrun.hainiuetl;

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

import org.apache.avro.Schema;
import org.apache.avro.generic.GenericData;
import org.apache.avro.generic.GenericRecord;
import org.apache.avro.mapred.AvroKey;
import org.apache.avro.mapreduce.AvroJob;
import org.apache.avro.mapreduce.AvroKeyOutputFormat;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Counter;
import org.apache.hadoop.mapreduce.CounterGroup;
import org.apache.hadoop.mapreduce.Counters;
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;

import mrrun.base.BaseMR;

public class Text2Avro extends BaseMR
{
    public static Schema schema = null;

    public static Schema.Parser parse = new Schema.Parser();

public static class Text2AvroMapper extends Mapper<LongWritable, Text, AvroKey<GenericRecord>, NullWritable>
{

        @Override
        protected void setup(Mapper<LongWritable, Text, AvroKey<GenericRecord>, NullWritable>.Context context)
                throws IOException, InterruptedException {
            //根据user_install_status.avro文件内的格式,生成指定格式的schema对象
            schema = parse.parse(Text2Avro.class.getResourceAsStream("/hainiu.avro"));

        }
        @Override
        protected void map(LongWritable key, Text value,Context context)
                throws IOException, InterruptedException {
            String line = value.toString();

            String[] splits = line.split("\001");
            if(splits == null || splits.length != 10){
                System.out.println("==============");
                System.out.println(value.toString());
                context.getCounter("etl_err", "bad line num").increment(1L);
                return;
            }

//            System.out.println(util.getIpArea("202.8.77.12"));
            String uip1 = splits[0];
            String uip =IPUtil.getip(uip1);

            String datetime = splits[2];
            StringBuilder sb=new StringBuilder(datetime);

            SimpleDateFormat sdf=new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss",Locale.ENGLISH);
            String sy=sb.toString();
            Date myDate = null;
            try
            {
                myDate = sdf.parse(sy);
            } catch (ParseException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            SimpleDateFormat sdf2=new SimpleDateFormat("yyyyMMddHHmmss");
            //System.out.println(myDate);
            String format = sdf2.format(myDate);
            //GET /categories/8?filter=recent&page=12 HTTP/1.1
            String url1 = splits[3];
            StringBuilder sb2=new StringBuilder(url1);

            String url = sb2.toString();
            String method="";
            String top="";
            String top1="";
            String http="";
            if(url!=null)
            {
                String[] s = url.split(" ");
                if(s.length==3)
                {
                    method=s[0];
                    http=s[2];

                    top1=s[1];
                    if(top1.contains("."))
                    {
                        context.getCounter("etl_err", "no line num").increment(1L);
                        return;
                    }
                    else
                    {
                        top=top1;
                    }
                }
            }

            String status1 = splits[4];
            String status2 = splits[5];
            String post = splits[6];
            String from = splits[7];
            String usagent1 = splits[8];
            StringBuilder sb3=new StringBuilder(usagent1);

            String usagent = sb3.toString();

            //根据创建的Schema对象,创建一行的对象
            GenericRecord record = new GenericData.Record(Text2Avro.schema);
            record.put("uip", uip);
            record.put("datetime", format);
            record.put("method", method);
            record.put("http", http);
            record.put("top", top);
            record.put("from", from);
            record.put("status1", status1);
            record.put("status2", status2);
            record.put("post", post);
            record.put("usagent", usagent);

            context.getCounter("etl_good", "good line num").increment(1L);
            System.out.println(uip+"    "+format+"    "+top+"    "+from+"    "+post+"    "+usagent+"    "+status1+"    "+status2+"    "+http);

            context.write(new AvroKey<GenericRecord>(record), NullWritable.get());

        }
    }

    @Override
    public Job getJob(Configuration conf) throws IOException {
//        // 开启reduce输出压缩
//        conf.set(FileOutputFormat.COMPRESS, "true");
//        // 设置reduce输出压缩格式
//        conf.set(FileOutputFormat.COMPRESS_CODEC, SnappyCodec.class.getName());

        Job job = Job.getInstance(conf, getJobNameWithTaskId());

        job.setJarByClass(Text2Avro.class);

        job.setMapperClass(Text2AvroMapper.class);

        job.setMapOutputKeyClass(AvroKey.class);
        job.setMapOutputValueClass(NullWritable.class);

//        无reduce
        job.setNumReduceTasks(0);

        //设置输出的format
        job.setOutputFormatClass(AvroKeyOutputFormat.class);

        //根据user_install_status.avro文件内的格式,生成指定格式的schema对象
        schema = parse.parse(Text2Avro.class.getResourceAsStream("/hainiu.avro"));

        //设置avro文件的输出
        AvroJob.setOutputKeySchema(job, schema);

        FileInputFormat.addInputPath(job, getFirstJobInputPath());

        FileOutputFormat.setOutputPath(job, getJobOutputPath(getJobNameWithTaskId()));

        return job;

    }

    @Override
    public String getJobName() {

        return "etltext2avro";

    }

}
//Avro2Orc_topic10
package mrrun.hainiuetl;

import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.avro.Schema;
import org.apache.avro.generic.GenericRecord;
import org.apache.avro.mapred.AvroKey;
import org.apache.avro.mapreduce.AvroJob;
import org.apache.avro.mapreduce.AvroKeyInputFormat;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hive.ql.io.orc.CompressionKind;
import org.apache.hadoop.hive.ql.io.orc.OrcNewOutputFormat;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Writable;
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;

import mrrun.base.BaseMR;
import mrrun.util.OrcFormat;
import mrrun.util.OrcUtil;

public class Avro2Orc_topic10 extends BaseMR {
    public static Schema schema = null;

    public static Schema.Parser parse = new Schema.Parser();

    public static class Avro2OrcMapper extends Mapper<AvroKey<GenericRecord>, NullWritable, NullWritable, Writable>{
        OrcUtil orcUtil = new OrcUtil();

        @Override
        protected void setup(Context context)
                throws IOException, InterruptedException {
            orcUtil.setWriteOrcInspector(OrcFormat.etlorcSchema_topic10);

        }

        @Override
        protected void map(AvroKey<GenericRecord> key, NullWritable value,Context context)
                throws IOException, InterruptedException {
            //得到一行的对象
            GenericRecord datum = key.datum();

            String uip = (String) datum.get("uip");
            String datetime = (String) datum.get("datetime");
            //String method = (String) datum.get("method");
            //String http = (String) datum.get("http");
            String top1 = (String) datum.get("top");
            String top="";
            String regex="/topics/\\d+";
            Pattern pattern=Pattern.compile(regex);
            Matcher matcher=pattern.matcher(top1);
            if(matcher.find())
            {
                 top=matcher.group();
            }
            else
            {
                context.getCounter("etl_err", "notopics line num").increment(1L);
                return;
            }

            //orcUtil.addAttr(uip,datetime,method,http,uid,country,status1,status2,usagent);
            orcUtil.addAttr(uip,datetime,top);

            Writable w = orcUtil.serialize();
            context.getCounter("etl_good", "good line num").increment(1L);
            System.out.println(uip+"    "+top);

            context.write(NullWritable.get(), w);

        }

    }

    @Override
    public Job getJob(Configuration conf) throws IOException {

        //关闭map的推测执行,使得一个map处理 一个region的数据
        conf.set("mapreduce.map.spedulative", "false");
        //设置orc文件snappy压缩
        conf.set("orc.compress", CompressionKind.SNAPPY.name());
        //设置orc文件 有索引
        conf.set("orc.create.index", "true");

        Job job = Job.getInstance(conf, getJobNameWithTaskId());

        job.setJarByClass(Avro2Orc_topic10.class);

        job.setMapperClass(Avro2OrcMapper.class);

        job.setMapOutputKeyClass(NullWritable.class);
        job.setMapOutputValueClass(Writable.class);

//        无reduce
        job.setNumReduceTasks(0);

        job.setInputFormatClass(AvroKeyInputFormat.class);

        //根据user_install_status.avro文件内的格式,生成指定格式的schema对象
        schema = parse.parse(Avro2Orc_topic10.class.getResourceAsStream("/hainiu.avro"));

        AvroJob.setInputKeySchema(job, schema);

        job.setOutputFormatClass(OrcNewOutputFormat.class);

        FileInputFormat.addInputPath(job, getFirstJobInputPath());

        FileOutputFormat.setOutputPath(job, getJobOutputPath(getJobNameWithTaskId()));
        return job;

    }

    @Override
    public String getJobName() {

        return "etlAvro2Orc_topic10";

    }

}
//Text2AvroJob
package mrrun.hainiuetl;

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

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.mapreduce.Counter;
import org.apache.hadoop.mapreduce.CounterGroup;
import org.apache.hadoop.mapreduce.Counters;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.jobcontrol.ControlledJob;
import org.apache.hadoop.mapreduce.lib.jobcontrol.JobControl;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

import mrrun.util.JobRunResult;
import mrrun.util.JobRunUtil;

public class Text2AvroJob extends Configured implements Tool{

    @Override
    public int run(String[] args) throws Exception {
        //获取Configuration对象
        Configuration conf = getConf();

        //创建任务链对象
        JobControl jobc = new JobControl("etltext2avro");

        Text2Avro avro = new Text2Avro();

        //只需要赋值一次就行
        avro.setConf(conf);

        ControlledJob orcCJob = avro.getControlledJob();

        Job job = orcCJob.getJob();
        job.waitForCompletion(true);

        JobRunResult result = JobRunUtil.run(jobc);
        result.setCounters("etl1", orcCJob.getJob().getCounters());

        result.print(true);

        Counters counterMap = result.getCounterMap("etl1");
         CounterGroup group1 = counterMap.getGroup("etl_good");
         CounterGroup group2 = counterMap.getGroup("etl_err");

         Counter good = group1.findCounter("good line num");
         Counter bad = group2.findCounter("bad line num");
        System.out.println("\t\t"+good.getDisplayName()+"  =  "+good.getValue());
        System.out.println("\t\t"+bad.getDisplayName()+"  =  "+bad.getValue());
        System.out.println("=======+++++++++====");

        Date date=new Date();
        SimpleDateFormat sdf3=new SimpleDateFormat("yyyyMMdd");
        String format2 = sdf3.format(date);
        Results results=new Results();
        long bad_num = bad.getValue();
        long good_num = good.getValue();

        long total_num=bad_num+good_num;
        results.setBad_num(bad_num);
        results.setGood_num(good_num);

        results.setTotal_num(total_num);
        results.setDay(format2);
        double d=bad_num*1.0/total_num*1.0;

        results.setBad_rate(d);

        System.out.println((double)((double)bad_num/(double)total_num));

        DAO dao=new DAO();
        if(dao.getday(format2)!=null)
        {
            Results getday = dao.getday(format2);
            Long bad_num2 = getday.getBad_num();
            Long good_num2 = getday.getGood_num();
            Long total_num2 = getday.getTotal_num();
            getday.setDay(format2);
            getday.setBad_num(bad_num2+bad_num);
            getday.setGood_num(good_num2+good_num);

            getday.setTotal_num(total_num2+total_num);
            double badrate=(bad_num2+bad_num)*1.0/(total_num2+total_num)*1.0;

            getday.setBad_rate(badrate);

            dao.update(getday);
        }
        else
        {
            dao.insert(results);
        }

        jobc.addJob(orcCJob);

        return 0;

    }

    public static void main(String[] args) throws Exception {
//        -Dtask.id=1226 -Dtask.input.dir=/tmp/avro/input_hainiuetl -Dtask.base.dir=/tmp/avro
        System.exit(ToolRunner.run(new Text2AvroJob(), args));
    }

}

放一个

自动化脚本思路同第一个ETL项目

直接放代码

yitiaolong.sh

#!/bin/bash
source /etc/profile
mmdd=`date -d 1‘ days ago‘ +%m%d`
yymm=`date -d 1‘ days ago‘ +%Y%m`
dd=`date -d 1‘ days ago‘ +%d`
/usr/local/hive/bin/hive -e "use suyuan09;alter table etlavrosy add IF NOT EXISTS partition(month=‘${yymm}‘,day=‘${dd}‘);"
/usr/local/hive/bin/hive -e "use suyuan09;alter table hainiuetltopics10_orc add IF NOT EXISTS partition(month=‘${yymm}‘,day=‘${dd}‘);"
/usr/local/hive/bin/hive -e "use suyuan09;alter table hainiuetlcategories10_orc add IF NOT EXISTS partition(month=‘${yymm}‘,day=‘${dd}‘);"
/usr/local/hive/bin/hive -e "use suyuan09;alter table hainiuetlspider_orc add IF NOT EXISTS partition(month=‘${yymm}‘,day=‘${dd}‘);"
/usr/local/hive/bin/hive -e "use suyuan09;alter table hainiuetlip_orc add IF NOT EXISTS partition(month=‘${yymm}‘,day=‘${dd}‘);"
/usr/local/hive/bin/hive -e "use suyuan09;alter table hainiuetlindex5_orc add IF NOT EXISTS partition(month=‘${yymm}‘,day=‘${dd}‘);"

#3-4运行mr
hdfs_path1=/user/hainiu/data/hainiuetl/input/${yymm}/${dd}
avro_path1=/user/suyuan09/hainiuetl/hainiuavro/${yymm}/${dd}
`/usr/local/hadoop/bin/hadoop  jar /home/suyuan09/etl/hainiu/jar/181210_hbase-1.0.0-symkmk123.jar etltext2avro -Dtask.id=${mmdd} -Dtask.input.dir=${hdfs_path1} -Dtask.base.dir=${avro_path1}`

#orctopics10mr.sh

avro_path2=/user/suyuan09/hainiuetl/hainiuavro/${yymm}/${dd}/etltext2avro_${mmdd}/part-*.avro
orc_path2=/user/suyuan09/hainiuetl/orctopics10/${yymm}/${dd}
`/usr/local/hadoop/bin/hadoop  jar /home/suyuan09/etl/hainiu/jar/181210_hbase-1.0.0-symkmk123.jar etlavro2orc_topic10 -Dtask.id=${mmdd} -Dtask.input.dir=${avro_path2} -Dtask.base.dir=${orc_path2}`

#orccategories10mr.sh

avro_path3=/user/suyuan09/hainiuetl/hainiuavro/${yymm}/${dd}/etltext2avro_${mmdd}/part-*.avro
orc_path3=/user/suyuan09/hainiuetl/orccategories10/${yymm}/${dd}
`/usr/local/hadoop/bin/hadoop  jar /home/suyuan09/etl/hainiu/jar/181210_hbase-1.0.0-symkmk123.jar etlavro2orc_categories10 -Dtask.id=${mmdd} -Dtask.input.dir=${avro_path3} -Dtask.base.dir=${orc_path3}`

#orcspidermr.sh

avro_path4=/user/suyuan09/hainiuetl/hainiuavro/${yymm}/${dd}/etltext2avro_${mmdd}/part-*.avro
orc_path4=/user/suyuan09/hainiuetl/orcspider/${yymm}/${dd}
`/usr/local/hadoop/bin/hadoop  jar /home/suyuan09/etl/hainiu/jar/181210_hbase-1.0.0-symkmk123.jar etlavro2orc_spider -Dtask.id=${mmdd} -Dtask.input.dir=${avro_path4} -Dtask.base.dir=${orc_path4}`

#orcipmr.sh

avro_path5=/user/suyuan09/hainiuetl/hainiuavro/${yymm}/${dd}/etltext2avro_${mmdd}/part-*.avro
orc_path5=/user/suyuan09/hainiuetl/orcip/${yymm}/${dd}
`/usr/local/hadoop/bin/hadoop  jar /home/suyuan09/etl/hainiu/jar/181210_hbase-1.0.0-symkmk123.jar etlavro2orc_ip -Dtask.id=${mmdd} -Dtask.input.dir=${avro_path5} -Dtask.base.dir=${orc_path5}`

#orcindex5mr.sh

avro_path6=/user/suyuan09/hainiuetl/hainiuavro/${yymm}/${dd}/etltext2avro_${mmdd}/part-*.avro
orc_path6=/user/suyuan09/hainiuetl/orcindex5/${yymm}/${dd}
`/usr/local/hadoop/bin/hadoop  jar /home/suyuan09/etl/hainiu/jar/181210_hbase-1.0.0-symkmk123.jar etlavro2orc_index5 -Dtask.id=${mmdd} -Dtask.input.dir=${avro_path6} -Dtask.base.dir=${orc_path6}`

#把orc挪到分区目录
#orc2etl.sh

/usr/local/hadoop/bin/hadoop fs -cp hdfs://ns1/user/suyuan09/hainiuetl/orctopics10/${yymm}/${dd}/etlAvro2Orc_topic10_${mmdd}/part-*  hdfs://ns1/user/suyuan09/etlorc/hainiuetltopics10_orc/month=${yymm}/day=${dd}
/usr/local/hadoop/bin/hadoop fs -cp hdfs://ns1/user/suyuan09/hainiuetl/orccategories10/${yymm}/${dd}/etlAvro2Orc_categories10_${mmdd}/part-*  hdfs://ns1/user/suyuan09/etlorc/hainiuetlcategories10_orc/month=${yymm}/day=${dd}
/usr/local/hadoop/bin/hadoop fs -cp hdfs://ns1/user/suyuan09/hainiuetl/orcspider/${yymm}/${dd}/etlAvro2Orc_spider_${mmdd}/part-*  hdfs://ns1/user/suyuan09/etlorc/hainiuetlspider_orc/month=${yymm}/day=${dd}
/usr/local/hadoop/bin/hadoop fs -cp hdfs://ns1/user/suyuan09/hainiuetl/orcindex5/${yymm}/${dd}/etlAvro2Orc_index5_${mmdd}/part-*  hdfs://ns1/user/suyuan09/etlorc/hainiuetlindex5_orc/month=${yymm}/day=${dd}
/usr/local/hadoop/bin/hadoop fs -cp hdfs://ns1/user/suyuan09/hainiuetl/orcip/${yymm}/${dd}/etlAvro2Orc_ip_${mmdd}/part-*  hdfs://ns1/user/suyuan09/etlorc/hainiuetlip_orc/month=${yymm}/day=${dd}

#自动从hive到mysql脚本
#hive2data.sh

/usr/local/hive/bin/hive  -e "use suyuan09;select t.top,t.num from(select top,count(*) num from hainiuetlindex5_orc group by top) t  sort by t.num desc limit 5;" >  /home/suyuan09/etl/hainiu/orc2mysql/myindex5${yymmdd}
/usr/local/hive/bin/hive  -e "use suyuan09;select t.top,t.num from(select top,count(*) num from hainiuetltopics10_orc group by top) t    sort by t.num desc limit 10;" >    /home/suyuan09/etl/hainiu/orc2mysql/mytopics10${yymmdd}
/usr/local/hive/bin/hive  -e "use suyuan09;select t.top,t.num from(select top,count(*) num from hainiuetlcategories10_orc  group by top) t  sort by t.num desc limit 10;" >   /home/suyuan09/etl/hainiu/orc2mysql/mycategories10${yymmdd}
/usr/local/hive/bin/hive  -e "use suyuan09;select t.uip,t.num from(select uip,count(*) num from hainiuetlip_orc  group by uip) t  sort by t.num desc;" >   /home/suyuan09/etl/hainiu/orc2mysql/myip${yymmdd}
/usr/local/hive/bin/hive  -e "use suyuan09;select t.usagent,t.num from(select usagent,count(*) num  from hainiuetlspider_orc  group by usagent) t   sort by t.num desc;" >  /home/suyuan09/etl/hainiu/orc2mysql/myspider${yymmdd}

#data->mysql脚本
#data2mysql.sh

#mysql -h 172.33.101.123 -P 3306 -u tony -pYourPassword -D YourDbName <<EOF
/bin/mysql -h192.168.88.195 -p3306 -uhainiu -p12345678 -Dhainiutest <<EOF

LOAD DATA LOCAL INFILE "/home/suyuan09/etl/hainiu/orc2mysql/mytopics10${yymmdd}" INTO TABLE suyuan09_etl_orctopics10mysql FIELDS TERMINATED BY ‘\t‘;
LOAD DATA LOCAL INFILE "/home/suyuan09/etl/hainiu/orc2mysql/mycategories10${yymmdd}" INTO TABLE suyuan09_etl_orccategories10mysql FIELDS TERMINATED BY ‘\t‘;
LOAD DATA LOCAL INFILE "/home/suyuan09/etl/hainiu/orc2mysql/myindex5${yymmdd}" INTO TABLE suyuan09_etl_orcindex5mysql FIELDS TERMINATED BY ‘\t‘;
LOAD DATA LOCAL INFILE "/home/suyuan09/etl/hainiu/orc2mysql/myspider${yymmdd}" INTO TABLE suyuan09_etl_orcspidermysql FIELDS TERMINATED BY ‘\t‘;
LOAD DATA LOCAL INFILE "/home/suyuan09/etl/hainiu/orc2mysql/myip${yymmdd}" INTO TABLE suyuan09_etl_orcipmysql FIELDS TERMINATED BY ‘\t‘;

EOF

报表展示

其中 mysql没有自带排序函数,自己写一个

热力图参考之前我之前的博客 https://www.cnblogs.com/symkmk123/p/9309322.html

图表也参考我之前的博客 https://www.cnblogs.com/symkmk123/p/9010514.html

原文地址:https://www.cnblogs.com/symkmk123/p/10197633.html

时间: 2024-11-03 03:32:13

ETL项目2:大数据清洗,处理:使用MapReduce进行离线数据分析并报表显示完整项目的相关文章

大数据采集、清洗、处理:使用MapReduce进行离线数据分析完整案例

[TOC] 1 大数据处理的常用方法 大数据处理目前比较流行的是两种方法,一种是离线处理,一种是在线处理,基本处理架构如下: 在互联网应用中,不管是哪一种处理方式,其基本的数据来源都是日志数据,例如对于web应用来说,则可能是用户的访问日志.用户的点击日志等. 如果对于数据的分析结果在时间上有比较严格的要求,则可以采用在线处理的方式来对数据进行分析,如使用Spark.Storm等进行处理.比较贴切的一个例子是天猫双十一的成交额,在其展板上,我们看到交易额是实时动态进行更新的,对于这种情况,则需要

大数据-实时推荐系统最主流推荐系统itemCF和userCF视频教程(项目实战)

38套大数据,云计算,架构,数据分析师,Hadoop,Spark,Storm,Kafka,人工智能,机器学习,深度学习,项目实战视频教程 视频课程包含: 38套大数据和人工智能精品高级课包含:大数据,云计算,架构,数据挖掘实战,实时推荐系统实战,电视收视率项目实战,实时流统计项目实战,离线电商分析项目实战,Spark大型项目实战用户分析,智能客户系统项目实战,Linux基础,Hadoop,Spark,Storm,Docker,Mapreduce,Kafka,Flume,OpenStack,Hiv

大数据运算模型 MapReduce 原理

大数据运算模型 MapReduce 原理 2016-01-24 杜亦舒 MapReduce 是一个大数据集合的并行运算模型,由google提出,现在流行的hadoop中也使用了MapReduce作为计算模型 MapReduce 通俗解释 图书馆要清点图书数量,有10个书架,管理员为了加快统计速度,找来了10个同学,每个同学负责统计一个书架的图书数量 张同学 统计 书架1王同学 统计 书架2刘同学 统计 书架3...... 过了一会儿,10个同学陆续到管理员这汇报自己的统计数字,管理员把各个数字加

DIOCP开源项目-DIOCP3 大文件的传输DEMO&lt;断点续传&gt;

首先该DEMO在StreamCoder上面做的改动,期间导致StreamCoderDEMO经常出现问题,导致大家运行的时候,频频出现问题,表示道歉. 以下是测试的结果,从服务器下载传输了一个3G左右的文件(Win7.iso).传输后用Hash工具做了个测试,是一样的.后面贴出了两个文件的贴图. 下面是客户端接受到文件的hash截图 下面是服务端源文件的hash截图 协议和功能 该DEMO由客户端请求服务端位与Files下面的文件,第一次请求文件信息(文件大小),请求到文件后,请求下载文件数据,收

小项目创意大集合

每个程序员都可以入手的小项目创意大集合 我经常看有人发帖问关于软件项目创意点子的事,也看到了很多回帖,我自己也回了一些常见的软件项目创意.不过我觉得只列出三两个是远远不够的,因此就收集并这个软件项目创意列表,大家要找简单的编程软件项目创意学习练手的话,可以收藏并扩散本文.这些软件项目创意并不是论文级别的,只是想抛砖引玉让大家能从中受些启发. 下面你们会看到 120 多个个软件项目创意想法,都是我通过头脑风暴得来的.我将其根据主题分成了10 个分类,但有些软件项目创意其实涵盖了不止一个主题. 更新

hadoop学习;block数据块;mapreduce实现例子;UnsupportedClassVersionError异常;关联项目源码

Football on Table 题意:一些杆上有人,人有一个宽度,然后现在有一个球射过去,要求出球不会碰到任何人的概率 思路:计算出每根杆的概率,之后累乘,计算杆的概率的时候,可以先把每块人的区间长度再移动过程中会覆盖多少长度累加出来,然后(1?总和/可移动距离)就是不会碰到的概率 代码: #include <stdio.h> #include <string.h> #include <math.h> const double eps = 1e-8; int t,

大数据技术之MapReduce中多表合并案例

大数据技术之MapReduce中多表合并案例 1)需求: 订单数据表t_order: id pid amount 1001 01 1 1002 02 2 1003 03 3 订单数据order.txt 1001 01 1 1002 02 2 1003 03 3 1004 01 4 1005 02 5 1006 03 6 商品信息表t_product pid pname 01 小米 02 华为 03 格力 商品数据pd.txt 01 小米 02 华为 03 格力 将商品信息表中数据根据商品pid合

实习三个月的地一个完整项目总结

今天做完了实习开始到现在的唯一一个我独立完成的系统,仅仅是一个登录验证以及权限控制的权限管理系统. 总结一些我的这十天开发的路程. 就在上上周的周四,cto有事回家了,回家之前告诉我说,让我完成公司的后台管理系统的权限控制部分和权限分配系统,我就当时觉得这可能是我在公司项目上的一个巨大而有很快乐的挑战. 周五,昆大神和我整理了一下架构,告诉我说,不要着急写代码,必须要把每一步想清楚了,在写代码, 由于当时没有文档,于是几个开发就大概根据之前的工作经验,拼出了一份"麻雀随小,五脏俱全"的

大数据开发之常见九种数据分析方法

今天给大家分享一篇关于大数据开发常见的9种数据分析方法,首先数据分析是从数据中提取有价值信息的过程,过程中需要对数据进行各种处理和归类,只有掌握了正确的数据分类方法和数据处理模式,才能起到事半功倍的效果,以下是数据分析员必备的9种数据分析思维模式: 1.分类 分类是一种基本的数据分析方式,数据根据其特点,可将数据对象划分为不同的部分和类型,再进一步分析,能够进一步挖掘事物的本质. .在入门学习大数据的过程当中有遇见学习,行业,缺乏系统学习路线,系统学习规划,欢迎你加入我的大数据学习交流裙:529