应用于:对于不同用户创建的表目录,进行文件的下载,程序中执行hadoop cat命令 下载文件到本地,随后通过ftp传至目标服务器,并将hdfs文件目录的修改时间存入mysql中。每次修改前将mysql中记录的数据,与本批次下载的HDFS文件路径修改时间对比,如果改变,则决定是否下载文件:

入口:

 package edm.spark.download.edm.spark.download;

 import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.List;
import org.apache.hadoop.fs.Path; import edm.spark.download.edm.spark.util.HdfsFileProcessor;
import edm.spark.download.edm.spark.util.JdbcDirectUtils; public class FileDownload { public static void main(String[] args) throws Exception {
String local_path = args[0];//"/home/hdfs/ysy/";
String hdfs_path = args[1];//"hdfs://hdp/user/";
;
HdfsFileProcessor fileProcessor = new HdfsFileProcessor();
List<String> userLists = fileProcessor.getUserUnderFolder(hdfs_path);
List<Path> listPath = fileProcessor.getFileUnderFolder(userLists);
if (null != listPath && listPath.size() > 0) {
for (Path path : listPath) {
String pathName = path.toString();
String[] nameList = pathName.split("/");
String time = JdbcDirectUtils.DateTimeFormat(new Date());
String tableName = nameList[nameList.length - 1] + "_" + time
+ ".txt";
String userName = nameList[nameList.length - 3];
Process ps = null;
try {
// 提交本地进程
ps = Runtime.getRuntime().exec(
local_path + "download.sh " + pathName + " "
+ tableName + " " + userName);
System.out.println(local_path + "download.sh " + pathName
+ " " + tableName);
// 更新mysql中记录的时间
JdbcDirectUtils jdbcForTime = new JdbcDirectUtils();
long dateTime = jdbcForTime
.queryDate("select modify_time,path from download_time where path="
+ "'" + path.toString() + "'");
long insertTime = fileProcessor.getModifycationTime(path);
if (dateTime != 0) {
jdbcForTime.updateDateTime(insertTime, pathName);
} else {
// 第一次插入写入当前文件目录时间
jdbcForTime.insertDate(insertTime, path.toString());
}
jdbcForTime.destroy();
} catch (Exception e) {
e.printStackTrace();
}
BufferedReader br = new BufferedReader(new InputStreamReader(
ps.getInputStream()));
String line;
StringBuffer sb = new StringBuffer();
while ((line = br.readLine()) != null) {
sb.append(line).append("\n");
}
String result = sb.toString();
System.out.println(result);
ps.destroy();
}
} else {
System.out.println("no file to download"); }
// submit download cmd
}
}

HdfsFileProcessor:

 package edm.spark.download.edm.spark.util;

 import java.io.IOException;
import java.sql.SQLException;
import java.util.List; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.ipc.RemoteException;
import org.apache.hadoop.security.AccessControlException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.google.common.collect.Lists; public class HdfsFileProcessor { static final Logger logger = LoggerFactory.getLogger(HdfsFileProcessor.class); protected FileSystem fileSystem; private Configuration conf; public HdfsFileProcessor(){
init();
} public void init(){
conf = new Configuration();
conf.addResource("resources/hdfs-site.xml");
conf.addResource("resources/core-site.xml");
try {
fileSystem = FileSystem.get(conf);
} catch (IOException e) {
logger.error("init error.......",e);
e.printStackTrace();
}
} public final boolean checkFile(String filePath){
boolean exists = false;
try{
Path path = new Path(filePath);
exists = fileSystem.exists(path);
}catch(IOException e){
logger.error("",e);
}catch(Exception e){
logger.error("",e);
}
return exists;
} public List<Path> getFileUnderFolder(List<String> names) throws IOException, SQLException{
JdbcDirectUtils jdbcForTime = new JdbcDirectUtils();
List<Path> paths = Lists.newArrayList();
for(String name : names){
Path folderPath = new Path("hdfs://hdp/user/" + name +"/");
if(fileSystem.exists(folderPath)){
try{
FileStatus[] fileStatus = fileSystem.listStatus(folderPath);
for(int i = 0; i< fileStatus.length;i++){
FileStatus fileStatu = fileStatus[i];
Path path = fileStatu.getPath();
if(path.toString().contains("tosas")){
FileStatus[] tableStatus = fileSystem.listStatus(path);
for(int j = 0; j < tableStatus.length;j++){
FileStatus tableStatu = tableStatus[i];
Path tablePath = tableStatu.getPath();
long modifycationTime = fileSystem.getFileStatus(tablePath).getModificationTime();
long dataTime = jdbcForTime.queryDate("select modify_time,path from download_time where path="
+"'"
+tablePath.toString()
+"'");
if(modifycationTime > dataTime){
paths.add(tablePath);
}
}
}
}
}catch(RemoteException e){
logger.error("",e);
}catch(AccessControlException e){
logger.error("",e);
}
}
} return paths;
} /**
* 查找文件目录属于哪个用户
* @param path
* @return
* @throws IOException
*/
public long getModifycationTime(Path path) throws IOException{
long modifycationTime = fileSystem.getFileStatus(path).getModificationTime();
return modifycationTime;
} public List<String> getUserUnderFolder(String Path) throws Exception{
List<String> userList = Lists.newArrayList();
Path userPath = new Path(Path);
if(fileSystem.exists(userPath)){
FileStatus[] fileStatus = fileSystem.listStatus(userPath);
for(int i = 0 ;i< fileStatus.length;i++){
FileStatus fileStatu = fileStatus[i];
String path = fileStatu.getPath().toString();
String pathes[] = path.split("/");
if(pathes.length > 4){
userList.add(pathes[4]);
}
}
}
return userList; } public void destory() throws IOException{
if(fileSystem != null){
fileSystem.close();
}
fileSystem = null;
}
}

JdbcDirectUtils:

 package edm.spark.download.edm.spark.util;

 import java.io.IOException;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map; import com.google.common.collect.Maps;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement; public class JdbcDirectUtils { private static Connection conn ; private Statement stmt; private String file_dir = "/template/download_mysql.txt"; private Map<String,String> jdbcConfMap = Maps.newHashMap(); private LoadHdfsConf mysqlConf; public JdbcDirectUtils(){
initDriver();
} public void initDriver(){
try{
if(conn == null){
mysqlConf = new LoadHdfsConf();
jdbcConfMap = mysqlConf.readHdfsFile(file_dir);
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://" + jdbcConfMap.get("url") + ":"
+ jdbcConfMap.get("port") + "/"
+ jdbcConfMap.get("schema") + "?user="
+ jdbcConfMap.get("user") + "@password="
+ jdbcConfMap.get("password")
+ "&useUnicode=true&characterEncoding="
+ jdbcConfMap.get("characterEncoding");
conn = (Connection) DriverManager.getConnection(url); }
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}catch(SQLException e){
e.printStackTrace();
}
} /**
* 查询最新更新记录
* @param date
* @param path
* @throws SQLException
*/
public void updateDateTime(long date,String path) throws SQLException{
stmt.executeUpdate("update download_time set modify_time=" + date + "where path="+"'" + path + "'");
} public long queryDate(String sql) throws SQLException{
ResultSet rs = stmt.executeQuery(sql);
long dateTime = 0;
while(rs.next()){
dateTime = rs.getLong("modify_time");
}
return dateTime;
} public void insertDate(Long date,String path) throws SQLException{
stmt.executeUpdate("insert into download_time(path,modify_time) values " + "('" + path + "'" + "," + date + ")");
} /**
* String格式转Long
* @param date
* @return
*/
public long convert2Long(String date){
long time = 0;
String format = "yyyyMMdd";
SimpleDateFormat sf = new SimpleDateFormat(format);
try{
time = sf.parse(date).getTime();
}catch(java.text.ParseException e){
e.printStackTrace();
}
return time;
} public static String DateTimeFormat(Date date){
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String time = sdf.format(date);
return time;
} public void destroy() throws SQLException{
if(conn != null){
conn.close();
}
conn = null;
}
}

LoadHdfsConf:

package edm.spark.download.edm.spark.util;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map; import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.google.common.collect.Maps; public class LoadHdfsConf {
static final Logger logger = LoggerFactory.getLogger(LoadHdfsConf.class); protected FileSystem fileSystem; public final boolean checkFile(String filePath){
boolean exists = false;
try{
Path path = new Path(filePath);
exists = fileSystem.equals(path);
}catch(Exception e){
logger.error("",e);
}
return exists;
} public Map<String,String> readHdfsFile(String hdfsPath) throws IOException{
Configuration conf = new Configuration();
conf.addResource("resources/hdfs-site.xml");
conf.addResource("resources/core-site.xml");
fileSystem = FileSystem.get(conf);
Path path = new Path(hdfsPath);
InputStream in = fileSystem.open(path);
List<String> lines = IOUtils.readLines(in);
if(null == lines || lines.isEmpty()){
return null;
}
Map<String,String> map = Maps.newHashMap();
int rowNum = 0;
for(String line : lines){
rowNum++;
String[] content = line.split("=");
String code = content[0];
String value = content[1];
if(StringUtils.isEmpty(line) || StringUtils.isEmpty(value)){
logger.error("{}",rowNum,line);
continue;
}
map.put(code, value);
}
return map;
} }

hdfs文件按修改时间下载的更多相关文章

  1. touch修改文件的修改时间和访问时间,ls --full-time显示文件详细,stat命令

    1. 同时修改文件的修改时间和访问时间 touch -d "2010-05-31 08:10:30" test.doc 2. 只修改文件的修改时间 touch -m -d &quo ...

  2. png文件格式详解,获取文件的修改时间,创作时间

    http://dev.gameres.com/Program/Visual/Other/PNGFormat.htmhttp://www.360doc.com/content/11/0428/12/10 ...

  3. python 获取文件的修改时间

    os.path.getmtime(name) #获取文件的修改时间 os.stat(path).st_mtime#获取文件的修改时间 os.stat(path).st_ctime #获取文件修改时间 ...

  4. Powershell按文件最后修改时间删除多余文件

    Powershell按文件最后修改时间删除多余文件 1. 删除目录内多余文件,目录文件个数大于$count后,按最后修改时间倒序排列,删除最旧的文件. Sort-Object -Property La ...

  5. C# 读取文件的修改时间、访问时间、创建时间

    C# 获取文件的各个时间如下: 表2<ccid_nobr> 属性 功能和用途 Attributes 返回和文件相关的属性值,运用了FileAttributes枚举类型值 CreationT ...

  6. C#实现对指定文件夹中文件按修改时间排序

    string path = "~/Document/Introduction/团队管理制度/";            DirectoryInfo dirinfo = new Di ...

  7. C++ 设置文件最近修改时间

    利用VS开发C++项目,经常发现修改系统时间后,每次编译过程会变得很慢,其原因就是当你把系统时间调到未来的一个时间点,然后有意或者无意编辑过一些代码文件,那么这些文件的时间戳就停留在未来. 当你把系统 ...

  8. C#获取ftp文件最后修改时间

    public static DateTime GetFileModifyDateTime(string ftpServerIP,string ftpFolder,string ftpUserID,st ...

  9. Java对文件夹中的文件按修改时间排序

    import java.io.File; import java.util.Arrays; import java.util.Comparator; import java.util.Date; pu ...

随机推荐

  1. Oracle_多行函数

      Oracle_多行函数   多行函数min(),max(),count(),sum(),avg() --1.1统计公司的最高工资,最低工资和总人数 --对于null值直接略过,不做运算 --max ...

  2. 逢三退一(boolean数组的使用)

    package com.hanqi.count; // 逢三退一 输出留到最后值的索引; public class Count1 { //主方法 public static void main(Str ...

  3. 常用sql语句整理:mysql

    ## 常用sql语句整理:mysql1. 增- 增加一张表```CREATE TABLE `table_name`(  ...  )ENGINE=InnoDB DEFAULT CHARSET=utf8 ...

  4. Centos6.9安装部署nginx服务器

    (一)依赖包安装 首先,gcc,pcre,zlib,openssl安装一边(可以用非-devel,但是嫌麻烦....用非-devel的看这个链接) yum  -y install gcc ------ ...

  5. CCF系列之Z字形扫描(201412-2)

    试题编号:201412-2试题名称:Z字形扫描时间限制: 2.0s内存限制: 256.0MB 问题描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan).给定一个n ...

  6. CCF系列之画图(201409-2)

    试题编号: 201409-2试题名称: 画图时间限制: 1.0s内存限制: 256.0MB问题描述: 问题描述 在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形指将横坐标范围从 ...

  7. Django中的F和Q函数

    内容简介: 介绍Django中的F和Q作用以及使用方法 一.F介绍 作用:操作数据表中的某列值,F()允许Django在未实际链接数据的情况下具有对数据库字段的值的引用,不用获取对象放在内存中再对字段 ...

  8. crontab执行带参数的php脚本,并取得参数[转]

    现在越来越喜欢用linux了,程序当中也去掉了很多触发性判断,改用了借用linux的crontab的特性来进行,这样程序效率确实是高了很多. 比如我们每月1号清空月点击,比如每天凌晨统计上一天的访问报 ...

  9. 1_mysql_认识

    什么是数据库? -- 数据                 -- 处理+存储 信息 -- 数据库              -- 存取数据 软件 本质是对文件系统的上层封装,通过软件去管理文件,管理数 ...

  10. centos7 安装jdk 1.8

    1.下载jdk1.8  for linux的安装包 jdk-8u11-linux-x64.tar.gz,下载地址:http://download.oracle.com/otn-pub/java/jdk ...