一:
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
结果如下·