大数据初步项目(统计点击ip次数)

                                               

一:

1:首先把工程打成jar包

点工程package打成jar包,把jar包放入linux中,Alt+p拖入.

2在虚拟机中运行jar包,我是在hdp-3中运行的.

命令:java –jar jar包名字

运行结果如下图

 

测试是否运行成功:hdp-3:8822

 

二:

1:启动nginx

路径为; cd /usr/local/nginx/sbin

命令为:./nginx

启动nginx 目的是为了产生日志,还有负载均衡和反向代理以后更新,重点是配置文件

2:配置文件路径为;

cd  /usr/local/nginx/conf/nginx.conf

我这里nginx装在hdp-1中,java在hdp-3里运行

 

 

 

    upstream frame-tomcat {

          server hdp-4:8181;

##指明nginx转发地址

    }

    server {

        listen       80;

        server_name  hdp-8;

##nginx的服务地址

        #charset koi8-r;

 

        access_log  logs/log.frame.access.log  main;

##输出生成的日志文件的路径和格式

        location / {

            # root   html;

            # index  index.html index.htm;

            proxy_pass http://frame-tomcat;

##代理传递(转发)

3:可以访问页面 hdp-1:80(默认端口是80)

1:flume采集nginx产生的日志文件到kafka,重点是配置文件

配置文件路径为;

cd apps/ flume-1.6.0/

tail-kafka.conf:

 

 

 

四:.启动kafka,注意启动之前要启动zookeeper,在kafka的消费者中收到数据产生临时文件

1:首先kafka的配置文件

cd apps/kafka_2.12-2.2.0/config/

server.properties

将hdp-1、hdp-2和hdp-3的broker.id分别修改为1、2、3(只要保证不冲突就可以)

2).修改log配置文件 /root/kafkadata/kafka-logs

3).修改zookeeper的连接地址,多个地址使用逗号分开。

4).在socket server setting中修改listeners=PLAINTEXT://hdp-1:9092

 

2:启动zookeeper

使用脚本命令:

./zkmanager.sh start

如果没有授权应该先授权

chmod 777 zkmanager.sh

3:启动kafka

应为我早hdp-1里写了一个脚本文件,

 

可以直接使用脚本命令:./kafka.sh start 来启动

或者在kafka的bin目录下启动kafka

命令为:./kafka-server-start.sh  ../config/server.properties

注意一定要在后面加上kafka的配置文件

 

4

创建主题

命令为:./kafka-topics.sh --create --zookeeper hdp-1:9092,hdp-2:9092,hdp-3:9092 --replication-factor 1 --partitions 1 --topic test

创建一个消费者消息,会把flume采集到的日志显示在消费者的控制台中

 

./kafka-console-consumer.sh --bootstrap-server hdp-1:9092,hdp-2:9092,hdp-3:9092 --topic test --from-beginning

五:

1:启动flume

路径为; cd apps/flume-1.6.0/

命令为:bin/flume-ng agent -c conf/ -f tail-kafka.conf -n a1 -Dflume.root.logger=INFO,console

 

开始采集采集数据:

 

日志显示在消费者的控制台中:如

 

 

现在已经将日志文件下沉到kafka中了.

六:上传文件到hdfs上,也就是上传到hive表中.

 

日志文件太多,说以我们采用log4j的方法,在采集的时候,产生一个临时的滚动文件,在把这个文件上传到Hdfs上

Log4j的配置文件:

 

log4j.appender.test1.MaxFileSize = 32KB

//在文件达到32kb的时候产生一个新的滚动文件

log4j.appender.test1.File = d:/testlog/access.log

//产生临时滚动文件的目录

log4j.appender.test1.layout.ConversionPattern =%m%n

//数据的格式类型

 

 

具体实现代码:

public class ConsumerDemo1 {

    public static void main(String[] args) {

        receiveMsg();

    }



    /**

     * 获取kafka topic(animal)上的数据

     */

    private static void receiveMsg() {

        Logger logger = Logger.getLogger("logRollingFile");

        Properties properties = new Properties();

        properties.put("bootstrap.servers", "hdp-3:9092");

        properties.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

        properties.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

        properties.put("group.id","aaaa");

        properties.put("enable.auto.commit", true);

        //一个方法

        KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(properties);

        consumer.subscribe(Collections.singleton("test"));

        URI uri = null;

        Configuration conf = null;

        String user = "root";

        try {

            uri = new URI("hdfs://hdp-1:9000");

            conf = new Configuration();

            conf = new Configuration();

            //dfs.replication:分布式文件系统副本的数量

            conf.set("dfs.replication", "2");

            //dfs.blocksize:分布式文件系统的块的大小   100M   64+36

            conf.set("dfs.blocksize", "64m");



        } catch (URISyntaxException e) {

            e.printStackTrace();

        }

        try {

            FileOutputStream fos = new FileOutputStream("D:/shuju.log");

            OutputStreamWriter osw = new OutputStreamWriter(fos);





//            FileSystem fs = FileSystem.get(uri, conf, user);

//            FSDataOutputStream fdos = fs.create(new Path("/cf.txt"));

            while(true) {



                /**

                 * 获取kafka

                 */

                ConsumerRecords<String, String> records = consumer.poll(100);

                for(ConsumerRecord<String, String> record: records) {

                    String msg = "key:" + record.key()+ ",value:" + record.value() + ",offset:" + record.offset()+",topic:" + record.topic()+"\r\n";

                    System.out.printf("key=%s,value=%s,offet=%s,topic=%s",record.key() , record.value() , record.offset(), record.topic());

                    logger.debug(record.value());

//                    BufferedWriter bw = new BufferedWriter(osw);

//                    bw.write(msg);

//                    bw.flush();



                }

            }

        }catch (Exception e) {

            e.printStackTrace();

        } finally {

            consumer.close();

        }

    }

}

重点代码

Logger logger = Logger.getLogger("logRollingFile");
logger.debug(record.value());

 

把本地目录中的临时滚动文件上传到hdfs中的hive表里:

首先在hive中创建一个外部表

create external table flumetable3 (ip string ) row format delimited location '/usr1/';

 

上传代码如下:

public class hdfstest1 {

    public static void main(String[] args) {

        URI uri = null;

        Configuration conf = null;

        String user = "root";

        FileSystem fs = null;

        try {

            uri = new URI("hdfs://hdp-1:9000");

            conf = new Configuration();

            //dfs.replication:分布式文件系统副本的数量

            conf.set("dfs.replication", "2");

            //dfs.blocksize:分布式文件系统的块的大小   100M   64+36

            conf.set("dfs.blocksize", "64m");

            fs = FileSystem.get(uri, conf, user);

            fs.copyFromLocalFile(new Path("d:/testlog/access.log"), new Path("/usr1/b.txt"));

            fs.close();

        } catch (URISyntaxException e) {

            e.printStackTrace();

        } catch (InterruptedException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        } finally   } }、
重点代码:
fs.copyFromLocalFile(new Path("d:/testlog/access.log"), new Path("/usr1/b.txt"));
 
现在hive表里就会有数据了
 
分析数据:
select count(*) from flumetable3;统计访问总pv
结果如下·
 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值