应用于:对于不同用户创建的表目录,进行文件的下载,程序中执行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. 我在vs文本编辑中常用的快捷键----常更新

    1. Ctrl+向上键----文本向上滚动  Ctrl+向下键----文本向下滚动  Ctrl+Enter-----向下增加一行  Ctrl+Shift+Enter-------向上增加一行 2. 避 ...

  2. 2017-06-30(ps pstree top kill w killall pkill)

    ps(查看系统下所有进程) -a 显示一个终端的所有进程,除了会话引线 -u 显示进程的归属用户以及内存的使用情况 -x 显示没有控制终端的进程 -l 长格式显示,更加详细的信息 -e 显示所有的进程 ...

  3. java.lang.IllegalArgumentException: Document base D:\Project\workspace\space\.metadata\.plugins\org.eclipse.wst.server.core\tmp7\wtpwebapps\Blog

    java.lang.IllegalArgumentException: Document base D:\Project\workspace\space\.metadata\.plugins\org. ...

  4. 流API--流的收集

    前面的一系列博客中,我们都是从一个集合中拿到一个流,但是有时候需要执行反操作,就是从流中获得集合.实际编码中,当我们处理完流后,我们通常想查看下结果,而不是将他们聚合成一个值.我们可以调用iterat ...

  5. json_encode详解

    <?php $json = Array ( "a" => "php" , "b" => "mysql" ...

  6. android onSaveInstanceState应用实例

    //activity销毁之前调用,把状态值存储上 @Override protected void onSaveInstanceState(Bundle outState) { outState.pu ...

  7. 【Shell脚本学习指南笔记】重定向文件描述符 2>&1

    如: make > results 2>&1 重定向 > results让文件描述符1(标准输出)作为文件results,接下来的重定向2>&1有两个部分.2& ...

  8. Redis的部署

    笔者Q:972581034 交流群:605799367 欢迎加群交流 官方网站 redis.io 下载 cd /usr/local/src wget http://download.redis.io/ ...

  9. 探索ArrayList自动改变size真相

    探索ArrayList自动改变size真相 ArrayList的列表对象实质上是存储在一个引用型数组里的,有人认为该数组有“自动增长机制”可以自动改变size大小.正式地说,该数组是无法改变 大小的, ...

  10. 百度网盘不限速下载软件 Pan Download

    百度网盘不限速下载软件 Pan Download Pan Download下载软件是一款电脑端的快速下载器软件,您可以通过Pan Download直接下载百度网盘中的资源,此款软件下载速度快,下载压缩 ...