使用hdfs进行数据定时采集
逻辑过程:
- 这是个定时任务,使用timer进行定时任务的进行。新建collectdata类并继承Timer类,在collectdata类中进行run方法的重写。
- 将待采集数据移动到toupload目录中,然后连接hdfs客户端,在hdfs客户端中利用日期新建目录,将toupload中的带采集数据上传到相应的目录中,然后将toupload中的数据移动到backup目录。
- 在上述过程中,如果对应目录不存在,则会相应的创建目录。
在实现代码过程中,有部分java知识需要学习巩固:
- 输出格式化的日期:
//使用SimpleDateFormat类进行格式设定
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH");
//再使用format方法对日期进行格式应用。
sdf.format(new Date());
- 筛选文件方法
//首先需要一个File,其拥有listFiles()方法能够以数组形式返回当前文件目录下的文件对象
File srcDir = new File("e:/logs");
File[] listFiles = srcDir.listFiles(new FilenameFilter(){
@Override
public boolean accept(File dir,String name){
if(name.endsWith("access.log")){
return true;
}
return false;
}
});
//在上述listFiles()方法中添加筛选器,对筛选器的accept()方法进行重写,即可实现筛选功能。返回true的文件即被筛选出来。
- FileUtils类可以很方便的实现文件的移动,并且设置是否自动创建文件夹。此外,它还有其它对文件进行操作。
FileUtils.moveFileToDirectory(srcDir,dstDir,createDstDir);
重写datacollect部分代码如下:
其中由于log4j日志部分无法使用,使用系统输出直接输出到控制台。
package datacollect;
import java.io.File;
import java.io.FilenameFilter;
import java.net.URI;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimerTask;
import java.util.UUID;
import org.apache.commons.io.FileUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.log4j.Logger;
public class CollectTask extends TimerTask{
@Override
public void run(){
try {
Logger logger = Logger.getLogger("logRollingFile");
FileUtils.move
//设置采集日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH");
String day = sdf.format(new Date());
File srcDir = new File("e:/logs/accesslog/");
File[] listFiles = srcDir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
if(name.endsWith("access.log")){
return true;
}
return false;
}
});
System.out.println("要采集的文件:"+listFiles.toString());
//记录日志
// logger.info("探测到如下文件需要采集:"+Arrays.toString(listFiles));
//将要采集的文件移动到待上传目录中
File toUploadDir = new File("e:/logs/toUpload/");
// if(!toUploadDir.exists()){
// toUploadDir.mkdirs();
// System.out.println("创建待上传目录成功");
// }
for(File file:listFiles){
FileUtils.moveFileToDirectory(file, toUploadDir, true);;
System.out.println("移动到待上传目录:"+toUploadDir.getAbsolutePath());
}
// logger.info("上述文件移动到了待上传目录"+toUploadDir.getAbsolutePath());
//构造HDFS客户端对象
FileSystem fs = FileSystem.get(new URI("hdfs://192.168.111.130:9000"), new Configuration(), "root");
File[] toUploadFiles = toUploadDir.listFiles();
//检查HDFS客户端中的目录是否存在,不存在则创建
Path hdfsDstPath = new Path("/logs"+day);
if(!fs.exists(hdfsDstPath)){
fs.mkdirs(hdfsDstPath);
}
System.out.println("HDFS客户端构造成功!");
//检查本地备份目录是否存在,不存在则创建
File backupDir = new File("e:/logs/backupDir/"+day+"/") ;
// if(!backupDir.exists()){
// backupDir.mkdirs();
// System.out.println("本地备份目录创建成功");
// }
for(File file:toUploadFiles){
Path dstPath = new Path(hdfsDstPath+"/access_log_"+UUID.randomUUID()+".log");
fs.copyFromLocalFile(new Path(file.getAbsolutePath().toString()),dstPath);
// logger.info("文件传输到HDFS完成:"+file.getAbsolutePath()+"--->"+dstPath);
System.out.println("文件传输到HDFS完成:"+file.getAbsolutePath()+"--->"+dstPath);
FileUtils.moveFileToDirectory(file, backupDir, true);
// logger.info("文件备份成功:"+file.getAbsolutePath()+"--->"+backupDir);
System.out.println("文件备份成功:"+file.getAbsolutePath()+"--->"+backupDir);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}