13-数据采集项目1

1、项目的性质

以内容输出为基础的一个互联网项目,大概可以理解为今日头条,腾讯新闻等类型的。

IT行业也就分两种:
1、你们公司是互联网公司吗?就是你们公司的产品是自己研发,向外推广的,比如:淘宝网、京东、共享单车
2、做业务的(做税务的、做银行业务、做三大运营商业务等)
3、即将发生的,已经发生的  -- IT行业,必定要和实体行业挂钩(富士康、比亚迪、宇通客车)、蜜雪冰城(微信小程序)

只要是火爆的行业,必定是热钱比较多的行业。--互联网金融

2、数据的分类

按照来源来源来分:数据库数据(业务数据)、埋点数据(埋在网页以及埋在app里面)、第三方数据

移动互联网时代:App ( Android--Java语言 IOS-- Object-C ) 塞班(诺基亚),黑莓,WindowPhone

有可能你们公司开发的app是一个假的(Html5 网页版-- 通过软件套一个Android的壳)

数据采集:真正的app和网页版的网站 采集数据的方式不一样。

3、日志的分类

1、行为日志

一般是存储在磁盘,格式一般都是json。假如一个用户点击了app,进行了启动,进行记录。

{
    "client_time":12312312312,
    "event_name":"StartAPP",
    "properties":{
        "os":"Andriod",
        "imei":"127389127937129312",
        "model":"HUAWEI Mate40 Pro",
        "wifi":true,
        ...
    },
}

各种app都是竞争对手:淘宝 和 抖音 零碎化的时间太多了--番茄时钟

2、内容日志

今日头条

跟产品挂钩,比如你是一个新闻资讯类的App, 一条新闻就是一个内容日志。可能是用户产生(UGC)的,也可能是由专业团队(PGC)产生的。

3、业务日志

登录,注册,上传一个商品等

可以理解为项目要想正常的运行,需要的数据,业务数据。从互联网行业的大数据来看,我们整个数据就是以上的三种类型,其中行为日志是由客户端产生,也叫做客户端日志。内容日志和业务日志都是由服务端产生的,也叫做服务端日志。

4、日志如何收集

我们这个项目可以通过一个服务器(这个服务器是别人的服务器),不断的给我们每一个人的电脑上发送请求,发送给Nginx,
Nginx通过Lua脚本,将数据进行格式转换,放到磁盘上。

1、需要安装带有Lua脚本的Nginx
2、需要开启内网穿透

项目架构图:

需要用到的技术以及版本:

最终的获取日志的手段:

新闻数据通过推的方式推到我们这里,我们使用Flume的Http Source来采集到HDFS。我们业务数据使用Sqoop将广告数据表中的数据迁移到Hive中。

5、准备一台全新的虚拟机

安装步骤:

先准备一台全新的CentOS,来做这个项目

安装CentOS

修改映射关系:

vi /etc/hosts

192.168.52.129 caiji

关闭防火墙:
systemctl stop firewalld
systemctl disable firewalld

 假如你想修改你的ip信息:

vi /etc/sysconfig/network-scripts/ifcfg-ens33

重启网卡:
systemctl restart network

6、内网穿透工具的介绍

做好的一个网站,只能在内网访问,不能外网访问,原因是没有公网IP,公网IP是需要购买的。
我们穷,但是我们有技术--穷屌丝
内网穿透工具-- natapp、花生壳等软件  花生壳是当前最正规的内网穿透工具
natapp网站地址:https://natapp.cn/
需要有一个网站,可以拿tomcat的官方页面当这个网站。
找到tomcat,解压,点击bin/startup.bat  启动。
访问网站IP : http://localhost:8080
内网穿透工具的使用(可以帮助理解端口映射)
内网穿透工具:frpc、natapp(小众)、花生壳(比较有名)
演示:natapp的使用
目的是:假如本地有一个Tomcat服务器,如何让远在非洲的女朋友访问到呢?
企业中:上线(购买一个服务器,这个服务器有公网IP,这个线是买的)
自己搞:将本地的电脑,映射成公网IP即可。
https://natapp.cn/

一个电脑有65000多个端口,一个应用最低占用你一个端口。

在本机启动一个Tomcat,充当应用。

下载natapp软件,解压,在同级目录下,创建一个文件

config.ini

default]
authtoken=7995f701db2d3d22                      #对应一条隧道的authtoken
clienttoken=                    #对应客户端的clienttoken,将会忽略authtoken,若无请留空,
log=none                        #log 日志文件,可指定本地文件, none=不做记录,stdout=直接屏幕输出 ,默认为none
loglevel=ERROR                  #日志等级 DEBUG, INFO, WARNING, ERROR 默认为 DEBUG
http_proxy=                     #代理设置 如 http://10.123.10.10:3128 非代理上网用户请务必留空

image.png

想要一个网站:先编写代码,代码开发完,本地测试
购买服务器(公网IP ,比如 10.234.18.123)
去购买一个域名 www.kengni.com  这个域名要备案  将域名和公网IP进行映射,顺带知道你是谁。
冷知识:一个人的备案数量是有限的。

内网穿透工具:是一个将内网变外网的一个软件。

7、OpenRestry

1)理论介绍
 Nginx 是一个战斗民族开发的一个小型的软件,Nginx可以当做Web服务器(就是将图片,网页,音乐放入到对应的文件夹就可以通过域名访问),可以做负载均衡(利用它搭建集群【tomcat集群】),并发量特别大,大约单台可以达到5W。
    tomcat可以达到500,实际100多开始卡。
    Nginx作为web服务器,只能存储静态的数据(图片、html、音乐、文档)。
    OpenRestry是一个Nginx集成工具,除了拥有Nginx的功能之外,还继承了其他的内容,支持Lua。
中文网站:http://openresty.org/cn/
2)安装openresty
准备工作
yum -y install yum-utils
添加yum源(openresty),因为直接安装的话,找不到openresty
yum-config-manager --add-repo http://openresty.org/package/centos/openresty.repo
使用yum安装openresty工具
yum -y install openresty

如果在yum安装过程中出现了如下错误:

这个时候可以通过同步时间的方式解决:

# 下载ntpdate 软件
yum install -y ntpdate
#  通过ntpdate 命令 同步互联网时间
ntpdate 0.asia.pool.ntp.org

另一种同步时间的方法:
systemctl restart chronyd

安装完成后进行启动:

启动命令:
openresty

停止命令:
openresty -s stop

修改yum源为aliyun(阿里云)
修改阿里云的镜像文件:
1、cd /etc/yum.repos.d/ 
2、备份⼀下:cp CentOS-Base.repo CentOS-Base.repo.bak
3、下载阿⾥云镜像到本地:
 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
4、清除yum的缓存
   yum clean all
   yum makecache
5、yum install -y ntpdate

3)Nginx的使用
1、Ngnix可以当做web服务器
举例,可以在Nginx下面,传递一个图片,就可以直接访问了
openresty默认安装在了/usr/local 下。
 

cd /usr/local/openresty/nginx/html

将1.png 拉入进去,通过浏览器访问图片资源:

为什么 访问  http://192.168.52.129/1.png 会出现图片呢?
因为在 nginx的conf文件夹下,有nginx的核心配置文件,叫做nginx.conf

 

2、Nginx中可以编写Lua脚本

重新的拷贝一个conf 文件过来,/usr/local/openresty/conf
玩耍一下
mkdir conf
cp /usr/local/openresty/nginx/conf/nginx.conf ./conf/

 将 conf 文件夹下的玩耍的nginx.conf 进行修改:

worker_processes  4;

events {
    worker_connections  1024;
}

http {
    # 表示的是nginx的web服务器相关的配置
    server {
        listen       9000;
        location / {
                default_type text/html;
                content_by_lua '
                        ngx.say("Hello World!")
                ';
        }

    }
}

启动openresty:

停止:
openresty -s stop
启动:
openresty

可以查看进程:

通过如下命令查看语法是否正确:

openresty -p /usr/local/openresty -t

启动:

启动的时候一定要指定配置文件的位置,否则 就会加载 默认的那个nginx.conf 文件了。

openresty -p /usr/local/openresty

如果遇到这个错误,直接创建一个logs文件夹即可。

停止运行:

openresty -p /usr/local/openresty -s stop

8、frpc 内网穿透工具的使用

一个公网IP的服务器,向给一个局域网的电脑发送请求,这个局域网内的电脑必须有公网IP,没有的话可以使用内网穿透工具。

 

安装步骤:

1)上传解压

上传到 /opt/modules
mkdir -p /opt/modules
mkdir -p /opt/installs

先创建一个文件夹

mkdir /opt/installs/frpc
tar -zxvf frpc_0.33.linux_adm64.tgz -C /opt/installs/frpc/

进入/opt/installs/frpc/  查看一下是否存在

2)如何使用?

在别人的服务器上注册frpc账号:

不要粘贴,这是一个模板:

curl -XPOST http://meta.frp.qfbigdata.com:8112/api/v1/meta/register \
-F data_url=http://[username].frp.qfbigdata.com:8002/data/v1?project=news \
-F type=1 \
-F name=[username]

这个也不要粘贴,这是我的:
 

curl -XPOST http://meta.frp.qfbigdata.com:8112/api/v1/meta/register \
-F data_url=http://yanlaoshi.frp.qfbigdata.com:8002/data/v1?project=news \
-F type=1 \
-F name=yanlaoshi

切记:一个名字被注册两次会提示错误。

开启内网穿透:

进入到 frpc的解压目录下

./frpc http --sd yanlaoshi -l 8802 -s frp.qfbigdata.com:7001 -u yanlaoshi

下面的红色说明本地没有8802端口:

原因是Nginx 虽然启动了,但是无法提供 8802端口的服务。

看这个日志:

现在的问题是使用Nginx配置一个Server,这个Server 它的端口必须是 8802

接收来自另一台服务器发送的消息,并且把这个消息,格式进行解析,转换为base64编码的数据,保存到本地。

先创建一堆的文件夹,用于放置配置文件,以及日志信息:

##1. 创建一个用于存放采集配置的目录
mkdir -p /opt/apps/collect-app

##2. 创建配套的目录
[root@caiji apps]# mkdir /opt/apps/collect-app/conf
[root@caiji apps]# mkdir /opt/apps/collect-app/logs
[root@caiji apps]# mkdir /opt/apps/collect-app/conf/vhosts

[root@caiji apps]# cp /usr/local/openresty/nginx/conf/mime.types /opt/apps/collect-app/conf/
[root@caiji apps]# cp /usr/local/openresty/nginx/conf/nginx.conf /opt/apps/collect-app/conf/

先配置主配置文件:在/opt/apps/collect-app/conf/nginx.conf 配置如下:

user  root root;
worker_processes  4;
pid        logs/nginx.pid;


events {
    use epoll;
    worker_connections  65535;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;

    
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;

    ## 自定义一个日志格式
    log_format  collect-app  '$cad';
    open_log_file_cache max=1000 inactive=60s;
    keepalive_timeout 0;
    client_max_body_size 20m;

    ## 包含其他配置文件
    include /opt/apps/collect-app/conf/vhosts/*.conf;
}

核心语句解析:

再拷贝一个文件给vhosts文件夹【作用是配置日志格式和8802端口服务】

cp /usr/local/openresty/nginx/conf/nginx.conf /opt/apps/collect-app/conf/vhosts/
cd /opt/apps/collect-app/conf/vhosts/
mv nginx.conf collect-app.conf

修改collect-app.conf


server {
        listen       8802 default_server;
        client_max_body_size 5m;
        client_body_buffer_size 20m;

        location /data/v1 {
                set $cad '';
                content_by_lua_block {
			   		-- 加载openresty自带的cjson
			   		local cjson = require "cjson"
			   		-- 读取请求体
			   		ngx.req.read_body()
			   		-- 获取到请求体中的数据:frpc传过来的json
			   		local body_data = ngx.req.get_body_data()
			   		-- 判断
			   		if body_data == nil then
			   			ngx.say([[{"code":500, "msg":"req body is nil"}]])
			   			return
			   		end
			   		-- 获取当前的时间
			   		local current_time = ngx.now() * 1000
			   		-- 获取到项目名:通过参数传递过来
			   		local project = ngx.var.arg_project
			   		-- 定义hashtable用于存放最终的结果
			   		local data = {}
			   		data["project"] = project
			   		data["ctime"] = current_time
			   		
			   		-- 判断这条url访问,是直接访问的本站,还是通过其他请求转发的
			   		if ngx.var.http_x_forwarded_for == nil then
			   			data["ip"] = ngx.var.remote_addr
			   		else
			   			data["ip"] = ngx.var.http_x_forwarded_for
			   		end
			   		
			   		-- 将hashtable转换成为json
			   		local meta = cjson.encode(data)
			   		
			   		-- 将meta数据经过base64编码和body_data进行拼接
			   		local res = ngx.encode_base64(meta) .. "-" .. ngx.unescape_uri(body_data)
			   		
			   		-- 返回给cad
			   		ngx.var.cad = res
			   		
			   		-- 提示
			   		ngx.say([[{"code":200, "msg":"success"}]])
                }
        }
        access_log  logs/collect-app-access.log  collect-app;
    }

开启openresty 收集日志:
 

检查配置文件
openresty -p /opt/apps/collect-app/ -t

nginx: the configuration file /opt/apps/collect-app/conf/nginx.conf syntax is ok
nginx: configuration file /opt/apps/collect-app/conf/nginx.conf test is successful

启动:
openresty -p /opt/apps/collect-app/

通过进程查看nginx的启动情况:
ps -ef|grep nginx

root      48307      1  0 10:59 ?        00:00:00 nginx: master process openresty -p /opt/apps/collect-app/
root      48308  48307  0 10:59 ?        00:00:00 nginx: worker process
root      48309  48307  0 10:59 ?        00:00:00 nginx: worker process
root      48310  48307  0 10:59 ?        00:00:00 nginx: worker process
root      48311  48307  0 10:59 ?        00:00:00 nginx: worker process

配置环境变量,方便以后启动:

vi /etc/profile
添加两句话:
export FRPC_HOME=/opt/installs/frpc
export PATH=$PATH:$FRPC_HOME

刷新环境变量
source /etc/profile

启动内网穿透工具,收集日志:
 

frpc http --sd yanlaoshi -l 8802 -s frp.qfbigdata.com:7001 -u yanlaoshi

查看收集的日志:
 

/opt/apps/collect-app/logs 文件夹下  collect-app-access.log 这个里面就是收集到的日志
eyJjdGltZSI6MTY2NDQ0NDQ1NjUxNiwicHJvamVjdCI6Im5ld3MiLCJpcCI6IjM5LjEwNy45Ny4xNTQifQ==-eyJjb250ZW50Ijp7InV1aWQiOiJlOWRmOGFjYi0zYzRmLTQ5Y2QtOWJhMy02MGM1OWM5MDQxMTEiLCJkaXN0aW5jdF9pZCI6IjAiLCJwcm9wZXJ0aWVzIjp7Im1vYmlsZSI6Iig4NikxNDcxNDc5NzU0NSIsImVtYWlsIjoiSmFkZW5fU2Nob2VuMjkxM0AxNjMuY29tIiwibmlja19uYW1lIjoi5YyF5reR5YWwU2NobWVsZXJfMTIyNSIsIm5hbWUiOiLmiJDlu7rlvrciLCJnZW5kZXIiOiLnlLciLCJhZ2UiOiI0OCIsInNpZ251cF90aW1lIjoxNjY0NDQ0NDE2MDAwfSwidHlwZSI6InByb2ZpbGVfc2V0In19

另一个消息:
eyJwcm9qZWN0IjoibmV3cyIsImN0aW1lIjoxNjk0NTAzODMyMTI2LCJpcCI6IjM5LjEwNy45Ny4xNTQifQ==-eyJjb250ZW50Ijp7InV1aWQiOiJiMDA0Mzc5OS01NjBjLTQ4MDgtODMyNC1hYjc4ODMwZjc0NTkiLCJkaXN0aW5jdF9pZCI6IjMyNTUiLCJldmVudCI6IkFwcFBhZ2VWaWV3IiwicHJvcGVydGllcyI6eyJtb2RlbCI6IiIsIm5ldHdvcmtfdHlwZSI6IjJHIiwiaXNfY2hhcmdpbmciOiIiLCJhcHBfdmVyc2lvbiI6IjEuMyIsImVsZW1lbnRfbmFtZSI6IiIsImVsZW1lbnRfcGFnZSI6IuWGheWuueivpuaDhemhtSIsImNhcnJpZXIiOiLkuK3lm73nlLXkv6EiLCJvcyI6IiIsImltZWkiOiIwMTAwNzA2MTU0NzAiLCJiYXR0ZXJ5X2xldmVsIjoiMTkiLCJzY3JlZW5fd2lkdGgiOiI2NDAiLCJzY3JlZW5faGVpZ2h0IjoiNzY4IiwiZGV2aWNlX2lkIjoiRklCRVJIT01FRjIzQTE2NzUzMkE3IiwiY2xpZW50X3RpbWUiOiIyMDIzLTA5LTEyIDE1OjMwOjE3IiwiaXAiOiIxODIuODIuMTc1LjIyNiIsIm1hbnVmYWN0dXJlciI6InhpYW9taSIsImFydGljbGVfaWQiOiI1OTE3IiwiYWN0aW9uX3R5cGUiOiIifSwidHlwZSI6InRyYWNrIn19

学习base64编码的使用:


[root@caiji ~]# echo "wangwushan大数据" | base64
d2FuZ3d1c2hhbuWkp+aVsOaNrgo=
[root@caiji ~]# echo "d2FuZ3d1c2hhbuWkp+aVsOaNrgo=" | base64 -d
wangwushan大数据
[root@caiji ~]# echo "bigdata2202zhenshuai" | base64
YmlnZGF0YTIyMDJ6aGVuc2h1YWkK

[root@caiji ~]# echo "YmlnZGF0YTIyMDJ6aGVuc2h1YWkK" | base64 -d
bigdata2202zhenshuai

[root@spark01 ~]# echo "eyJjdGltZSI6MTY2NDQ0NDQ1NjUxNiwicHJvamVjdCI6Im5ld3MiLCJpcCI6IjM5LjEwNy45Ny4xNTQifQ==-eyJjb250ZW50Ijp7InV1aWQiOiJlOWRmOGFjYi0zYzRmLTQ5Y2QtOWJhMy02MGM1OWM5MDQxMTEiLCJkaXN0aW5jdF9pZCI6IjAiLCJwcm9wZXJ0aWVzIjp7Im1vYmlsZSI6Iig4NikxNDcxNDc5NzU0NSIsImVtYWlsIjoiSmFkZW5fU2Nob2VuMjkxM0AxNjMuY29tIiwibmlja19uYW1lIjoi5YyF5reR5YWwU2NobWVsZXJfMTIyNSIsIm5hbWUiOiLmiJDlu7rlvrciLCJnZW5kZXIiOiLnlLciLCJhZ2UiOiI0OCIsInNpZ251cF90aW1lIjoxNjY0NDQ0NDE2MDAwfSwidHlwZSI6InByb2ZpbGVfc2V0In19" | base64 -d
{"ctime":1664444456516,"project":"news","ip":"39.107.97.154"}base64: 输入无效

为什么无效?因为中间有不是base64编码的数据,就是这个 -

[root@spark01 ~]# echo "eyJjdGltZSI6MTY2NDQ0NDQ1NjUxNiwicHJvamVjdCI6Im5ld3MiLCJpcCI6IjM5LjEwNy45Ny4xNTQifQ==" | base64 -d
{"ctime":1664444456516,"project":"news","ip":"39.107.97.154"}[root@spark01 ~]# echo "eyJjb250ZW50Ijp7InV1aN0aW5jdF9pZCI6IjAiLCJwcm9wZXJ0aWVzIjp7Im1vYmlsZSI6Iig4NikxNDcxNDc5NzU0NSIsImVtYWlsIjoiSmFkZW5fU2Nob2VuMjkxM0AxNjMuY29tIiwibmlja19uYW1lIjoi5YyF5reR5YWwU2NobWVsZXJfMTIyNSIsIm5hbWUiOiLmiJDlu7rlvrciLCJnZW5kZXIiOiLnlLciLCJhZ2UiOiI0OCIsInNpZ251cF90aW1lIjoxNjY0NDQ0NDE2MDAwfSwidHlwZSI6InByb2ZpbGVfc2V0In19" | base64 -d
{"content":{"uuid":"e9df8acb-3c4f-49cd-9ba3-60c59c904111","distinct_id":"0","properties":{"mobile":"(86)14714797545","email":"Jaden_Schoen2913@163.com","nick_name":"包淑兰Schmeler_1225","name":"成建德","gender":"男","age":"48","signup_time":1664444416000},"type":"profile_set"}}[root@spark01 ~]# 

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YuPangZa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值