HDFS
实施前的准备
- 安装nginx
- 安装flume
- 安装kafka
一、项目的环境准备
1.打jar包
- 双击package即可打成jar包
- 在此处可以看到打成jar包的地址
2.将jar包运行在虚拟机上
- 我准备了四台虚拟机
- 我将jar包放在了root/apps,Java -jar 加项目名,即可在虚拟机中启动项目
- 出现如下即表示启动成功,接下来我们可以在网页验证一下
3.测试项目及nginx反向代理功能
- 输入虚拟机名字加项目端口号出现登录界面表示运行成功,接下来我们在测试一下nginx的反向代理
- 我将nginx配置文件中反向给hdp-1,所以当我输入hdp-1的时候也能出现如下界面即表示成功
二、将flume采集的数据通过kafka下沉到hive表的具体操作流程
1.集群启动顺序(这里面大多数集群我都已经配置好shell脚本文件)
2.监测flume采集的数据
3. 启动kafka消费者将采集的数据传到本机
4.创建一个hive外部表,并将本机采集的数据下沉到hive表里**
-启动zookeeper集群(启动kafka集群之前必须启动zookeeper集群)
- 启动kafka集群(将数据采集到的kafka的话必须先启动kafka集群)
- 启动flume
启动命令:flume-ng agent -C …/conf/ -f …/tail-kafka.conf -n a1 -Dflume.root.logger=INFO,console
出现如下表示成功
- 测试是否检测到数据
当刷新界面时,nginx下logs/log.frame.access.log日志会出现新数据即表示监听成功
- 这里会多一条日志信息
- 接下来我们见一个消费者
```java
package com.zpark.kafkatest.one;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.log4j.Logger;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Collections;
import java.util.Properties;
public class ConsumerLocal {
public static void main(String[] args) {
//调用接收消息的方法
receiveMsg();
}
/**
* 获取kafka topic(test)上的数据
*/
private static void receiveMsg() {
// Logger logger = Logger.getLogger(ConsumerLocal.class);
Properties properties = new Properties();
properties.put("bootstrap.servers", "hdp-2: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();
//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("F:/tmp.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 =record.value()+"\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();
}
}
}
- 当启动消费者后,本地即可多一个F:/tmp.log(代码里有,此路径随便给一个,没有的话会自动生成)
- 接下来创建一个hive外部表
create external table flumetable (ip string) row format delimited location '/usr/';
- 创建一个类上传数据到hive表
package com.zpark.kafkatest.one;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.Configuration;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.TimerTask;
public class toHDFS extends TimerTask {
public void run(){
URI uri = null;
try {
uri =new URI("hdfs://hdp-1:9000");
}catch (URISyntaxException e){
e.printStackTrace();
}
Configuration conf = new Configuration();
conf.set("dfs.replication","1");
conf.set("dfs.blocksize","64m");
String user = "root";
FileSystem fs =null;
try{
fs = FileSystem.get(uri,conf,user);
}catch (IOException e){
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
Path src = new Path("D:\\tmp.log");
Path dst = new Path("/user/hive/warehouse/zpark.db");
try{
fs.copyFromLocalFile(src,dst);
}catch (IOException e){
e.printStackTrace();
}
try{
fs.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
- 检查是否上传成功
1.网页进入hdp-1:50070 ,出现a.txt文件即表示上传成功
2.查看flumetable表有数据即表示下沉成功