使用hdfs进行数据采集学习记录

使用hdfs进行数据定时采集

逻辑过程

  • 这是个定时任务,使用timer进行定时任务的进行。新建collectdata类并继承Timer类,在collectdata类中进行run方法的重写。
  • 将待采集数据移动到toupload目录中,然后连接hdfs客户端,在hdfs客户端中利用日期新建目录,将toupload中的带采集数据上传到相应的目录中,然后将toupload中的数据移动到backup目录。
  • 在上述过程中,如果对应目录不存在,则会相应的创建目录。

在实现代码过程中,有部分java知识需要学习巩固:

  1. 输出格式化的日期:
//使用SimpleDateFormat类进行格式设定
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH");
//再使用format方法对日期进行格式应用。
sdf.format(new Date());
  1. 筛选文件方法
//首先需要一个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的文件即被筛选出来。
  1. 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();
		}
		
		
		
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值