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 非代理上网用户请务必留空
想要一个网站:先编写代码,代码开发完,本地测试
购买服务器(公网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 ~]#