1,git (版本管理工具)
2,论坛日志分析系统BBS
Flume + Kafka + Java API + HBase + Hive + Sqoop + MySQL
3,面试经验的分享
====>主题:git (版本管理工具)
~~>版本管理工具:项目组中各个成员进行资源的共享,管理的平台。(资源仓库:代码,文档)
~~>常用的版本管理工具:
git:作者是linux os的作者。安装在局域网内或是外网,可以没有网络,操作分成两部分(commit,push),支持分布式的操作。(接近80%)
svn:版本管理工具,安装在局域网内,必须要有网络。
~~>百度指数:git,svn
~~>git版本管理工具操作:
前提:
①明确一些概念
git:分布式的版本管理工具。
github:全球开源的项目源码托管的网站(使用b/s结构操作远程的git服务器)。(码云)
gitblit: b/s结构的服务器,底层封装了git。在局域网上搭建好。公司中常用。
②安装
上传,修改配置文件,启动
分角色来操作:
项目经理(所指派的高级程序员):
a)创建仓库
b)给项目组中的各个成员分配账户(用户名/密码)
c)搭建好项目的轮廓
pom.xml
包结构
工具类
资源文件
d)将项目commit到本地仓库中,push到远程git服务器(有一个或是多个仓库)上
普通的程序员(必须能够实际操作):
a) 主动地向领导获得自己的账户信息
b) 登录,知晓资源的url
c)基于远程的git服务器仓库中的项目的轮廓建项目(clone到本地),在此基础上进行后续的开发
i)新建
ii)复用其他程序员写的源码
iii)冲突的解决
=====>主题: gitblit安装
步骤:
①上传
②修改配置文件(/gitblit/data/default.properties)
# 定制http协议的端口号(ip: 网络上终端设备的唯一标识 ; 端口:联网的终端设备上所安装的能够进行网络信息交互的应用的唯一标识)
server.httpPort = 80
# 屏蔽https协议
server.httpsPort = 0
③启动(以后台进程的方式启动gitblit服务器)
nohup java -jar gitblit.jar > /dev/null 2>&1 &
=====>主题: gitblit使用
~~>项目经理(所指派的高级程序员):
0)前提: 为了安全起见,用户第一次登录时,建议修改自己默认的密码。
a)创建仓库
b)给项目组中的各个成员分配账户(用户名/密码)
jack/123456
marry/123456
c)搭建好项目的轮廓
pom.xml
包结构 (包名:公司网址名的倒写,不要www)
大型项目:如,com.l000phone.git.session.biz
com.l000phone.git.page.biz
com.l000phone.git.util
com.l000phone.git.common
com.l000phone.项目名的简写.模块名.层次名
domain(entity,或是bean)
biz(service):业务逻辑层 ~> 调用dao (data access object)层 ~> db(rdbms, hbase,redis,es等等)
大型项目:如,com.l000phone.git.层次名
工具类
资源文件
d)将项目commit到本地仓库中,push到远程git服务器(有一个或是多个仓库)上
i)将当前项目纳入到git版本管理工具管理的范畴,并add一下
ii)提交到本地仓库中 (本地项目所在磁盘根目录下的一个名为.git的隐藏目录,如:H:\workspace-16\git-study\.git)
iii)将本地仓库中的资源推送(push)到远程git服务器的仓库中
前提:知晓远程仓库的url,如: http://admin@janson02/r/China.git
账户信息,admin/123456
为了演示多个用户,删除本地的凭据信息(本地已经保存起来了)
e)通知项目组的其他成员开始进行项目编码阶段的实施了
~~>普通的程序员(必须能够实际操作):
a) 主动地向领导获得自己的账户信息
jack/123456
b) 登录,知晓资源的url
http://jack@janson02/r/China.git
c)基于远程的git服务器仓库中的项目的轮廓建项目(clone到本地),在此基础上进行后续的开发
0)前提: 包丢失了特性,需要重新定制;空包没有clone下来,需要手动新建
i)新建
ii)复用其他程序员写的源码(pull)
从远程git仓库中下载最新的源码
iii)冲突的解决
多个程序员同时操作远程仓库中的一个资源时,冲突的解决方案有如下几种:
方案1:accept theirs , 服务器上的源码将你本地的覆盖了
方案2:accept yours, 你本地的将服务器上的源码覆盖了
方案3:merge, 将本地的源码与服务器上的进行合并 (推荐)
经验之谈:
i) 修改一个公共的源码之前,需要pull (更新本地的旧的源码),在此基础上进行修改
ii) 修改一个公共的源码后,立马commit,并push。(前提:编译通过,最好:单元测试通过)
~~>作业:
1,各组组长充当项目经理的角色
2,组员是普通程序员的角色
————————————————————————————————————————
=====>主题: 论坛日志分析系统BBS
Flume + Kafka + Java API + HBase + Hive + Sqoop + MySQL
说明:大数据的项目代码编写完毕后,首先使用样例数据跑一下(部分数据100多K),然后,慢慢增大数据量(全量数据)。
Flume:进行日志采集
Kafka:分布式的消息框架
Java API:从kafka中不断地读取数据,进行清洗,将清洗后的数据保存到HBase中
HBase: 存储清洗后的数据
Hive:新建一张hive表(前提:指定该hive表与hbase表的映射关系),使用hql语句分析表数据(筛选出vip用户),并将筛选后的数据保存到hive内部表中
sqoop: 将hive分析后的最终的结果表(内部表)中的数据export到rdbms中去(RDBMS:关系数据库管理系统;导入、导出默认的参照物是:hdfs)
MySQL: 最终的结果存储的地方
~~>项目分步骤实施:(前提: 启动Hadoop集群;启动kafka集群;启动HBase集群)
第一步:Flume采集数据到Kafka
1,在/opt/flume/conf/flume-kafka-bbs.properites资源文件,资源文件的内容如下
a1.sources = r1
a1.sinks = k1
a1.channels = c1
a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = /opt/flume/logs
a1.sources.r1.fileSuffix = .OK
a1.sources.r1.deletePolicy = never
a1.sources.r1.fileHeader = true
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.k1.topic = bbs
a1.sinks.k1.brokerList = JANSON01:9092,JANSON02:9092,JANSON03:9092
a1.sinks.k1.requiredAcks = 1
a1.sinks.k1.batchSize = 20
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
2,在kafka集群中新建一个名为bbs的主题
[root@JANSON01 conf]# kafka-topics.sh --create --topic bbs --zookeeper JANSON01:2181 --partitions 3 -replication-factor 3
Created topic "bbs".
[root@JANSON01 conf]# kafka-topics.sh --list --zookeeper JANSON01:2181
Hbase
Spark
__consumer_offsets
bbs
gamelogs
gamelogs-rt
hadoop
hive
spark
test
3,向Flume中source所指定的目录 /opt/flume/logs下放置一些样例日志文件
[root@JANSON01 logs]# pwd
/opt/flume/logs
[root@JANSON01 logs]# ll
total 680
-rw-r--r-- 1 root root 693828 Mar 28 14:53 access_simple-2.log
4,正式采集
[root@JANSON01 flume]# nohup flume-ng agent -n a1 -f conf/flume-kafka-bbs.properites > /dev/null 2>&1 &
[1] 6985
5,验证是否正常将日志文件中的数据采集到kafka集群中了
[root@JANSON03 ~]# kafka-console-consumer.sh --topic bbs --zookeeper JANSON01:2181 --from-beginning
...
110.52.206.129 - - [16/May/2018:17:45:29 +0800] "GET /home.php?mod=misc&ac=sendmail&rand=1369907128 HTTP/1.1" 200 -
110.52.206.129 - - [16/May/2018:17:45:29 +0800] "GET /home.php?mod=spacecp&ac=pm&op=checknewpm&rand=1369907128 HTTP/1.1" 200 -
110.52.206.129 - - [16/May/2018:17:45:32 +0800] "GET /favicon.ico HTTP/1.1" 200 9662
222.133.189.179 - - [16/May/2018:17:45:32 +0800] "GET /source/plugin/wsh_wx/img/wsh_zk.css HTTP/1.1" 304 -
Processed a total of 6214 messages
第二步:通过JavaAPI (消息的订阅方读取kafka集群中的数据),清洗后,存入到HBase中
0,前提:
在hbase中新建一张表
hbase(main):011:0> create 'bbs','cf'
0 row(s) in 2.3020 seconds
1,新建maven工程(pom.xml,工具类,包,资源文件等等)
2,核心的订阅方代码的书写
订阅,清洗,存储
3,在hbase shell终端scan指定的hbase表,观察清洗后的数据是否正常存入了
第三步:Hive
1,新建一张hive表,并指定该hive表与hbase表的映射关系 (bbs_hive.hql)
create external table if not exists bbs_hive(
key string comment '主键',
ip string comment 'ip地址',
accessTime string comment '访问时间',
url string comment 'url地址',
status int comment '状态码',
traffict int comment '数据流量'
)stored by "org.apache.hadoop.hive.hbase.HBaseStorageHandler" with serdeproperties (
"hbase.columns.mapping" = ":key,cf:ip,cf:accessTime,cf:url,cf:status,cf:traffict",
"hbase.table.name" = "bbs"
);
将hql语句底层的计算模型置换成(tez, spark;默认是mr)
hive on spark : 由hive官方主导,包含IBM,但是没有spark官方的参与。
spark on hive (Spark SQL): SparkSession.builder.enableHiveSupport.master()xxx ~> 在spark sql中可以直接访问hive表 (推荐使用)
2,使用hql语句分析表数据(筛选出vip用户)
3,并将筛选后的数据保存到hive内部表中
-- 书写在一行
create table if not exists vip_20190328 row format delimited fields terminated by ',' as select ip,accessTime,url,status,traffict from bbs_hive where instr(url,'handlekey=register')>0;
-- 格式化后
create table if not exists vip_20190328
row format delimited fields terminated by ','
as
select ip,accessTime,url,status,traffict
from bbs_hive
where instr(url,'handlekey=register')>0 ;
第四步:使用sqoop将筛选后的hive内部表中的数据导出到mysql目标表中
1,新建mysql目标表
DROP TABLE tb_bbs;
CREATE TABLE IF NOT EXISTS tb_bbs(
ip VARCHAR(50) ,
accessTime VARCHAR(50),
url VARCHAR(300),
`status` INT,
traffict INT
);
SELECT * FROM tb_bbs;
2, 导出
sqoop export --connect "jdbc:mysql://JANSON02:3306/bigdata?useUnicode=true&characterEncoding=utf-8" --username root --password 88888888 --table tb_bbs --export-dir /user/hive/warehouse/vip_20190328
~~>项目各个步骤综合:
背景:项目各个步骤完毕之后,需要将各步骤写入到一个shell脚本中,然后通过定时器,定时执行该shell脚本(在生产环境下必须如此)。
1, shell脚本的编写(bbs.sh):
# 将系统时间保存到变量CURRENT中
CURRENT=`/bin/date +%Y%m%d`
# 测试
# echo $CURRENT
# 打包运行
java -jar /opt/data/my-jars/bbs.jar com.l000phone.bbs.BBSApplication
# 建表,将hbase中当天的数据导入到分区表中 ( 带条件将hbase表中的数据导入到hive外部表相应的分区中)
hive -f "bbs_hive.hql"
# 将数据导入到表中指定分区中
hive -e "alter table bbs.uplbbs add partition (logdate='$CURRENT') location '/bbs/cleaned/$CURRENT'"
# 筛选,并将结果导入到新表中(新的内部表)
hive -e "create table bbs.vip_$CURRENT row format delimited fields terminated by ',' as select * from bbs.uplbbs where logdate='$CURRENT' and instr(url,'handlekey=register')>0;"
# 导出到mysql vip表中,采用的是追加模式
sqoop export --connect "jdbc:mysql://JANSON02:3306/bigdata?useUnicode=true&characterEncoding=utf-8" --username root --password 88888888 --table tb_bbs --export-dir "/user/hive/warehouse/bbs.db/vip_$CURRENT"
2,定时器 (azkaban,oozie来编辑定时器)
crontab -e
语法:
* * * * * command
minute hour day month week command
分 时 天 月 星期 命令
需求:希望每天0时0分执行定时执行上述的shell脚本
0 0 * * * sh /opt/xx/bbs.sh > /dev/null 2>&1 &