hadoop 文件 复制 移动 FileUtil.copy

本文展示了如何使用Java的FileSystem API批量复制文件并创建目标目录,详细介绍了相关代码实现及逻辑。

FileSystem fs = FileSystem.get(conf);
Path pattern = new Path(resultViewPath + "phone*");
Path dir = new Path(dest);
if (!fs.exists(dir)) {      // 目标目录
fs.mkdirs(dir);
}
FileStatus[] status = fs.globStatus(pattern);   //  匹配正则表达式的文件集合
Path[] paths = FileUtil.stat2Paths(status);      //  转换为Path数组
for (Path i : paths) {                                  //   复制每个文件
FileUtil.copy(fs, i, fs, dir, false, conf);   // false 表示移动的时候不删除原路径文件
System.out.println(i);
}

 

转载于:https://www.cnblogs.com/agileblog/p/4720680.html

<think>好的,我现在需要帮助用户解决他们提到的两个问题:log4j警告和HDFS文件不存在异常。首先,我应该分别分析这两个问题的可能原因,并给出相应的解决方案。 关于log4j的警告:“no appenders could be found for logger (hadoop metrics2)”。这个警告通常是因为log4j的配置文件没有被正确加载,导致日志系统无法找到合适的Appender。根据引用[1]中的内容,用户之前处理过Spark的日志问题,通过重命名模板文件并修改配置。但Hadoop可能使用的是自己的log4j配置文件,我需要确认Hadoop的配置路径,通常是$HADOOP_HOME/etc/hadoop/log4j.properties。用户可能需要检查该文件是否存在,并确保有正确的Appender配置,比如ConsoleAppender或FileAppender。如果文件不存在,可能需要从模板创建,并添加必要的配置。此外,检查系统属性是否指定了正确的配置文件路径,或者类路径是否包含配置文件的位置。 然后是HDFS文件不存在异常:“java.io.FileNotFoundException”。这可能有几个原因:文件路径不正确、权限不足、HDFS服务未启动,或者客户端配置错误。用户需要确认他们使用的HDFS路径是否存在,可以使用hadoop fs -ls命令检查。另外,检查代码中的路径是否正确,比如是否包含正确的HDFS协议和端口,如hdfs://namenode:9000/path。权限方面,用户可能需要使用hadoop fs -chmod修改权限,或者在代码中设置合适的用户身份。如果是配置问题,比如core-site.xml或hdfs-site.xml中的配置错误,需要检查这些文件是否正确设置了namenode的地址和端口。另外,用户代码中使用的HDFS客户端是否正确初始化,比如在获取FileSystem实例时是否传入了正确的配置,或者是否使用了正确的API,如FileSystem.get(conf)可能需要处理HA配置。 此外,引用[4]提到了listFiles方法,这可能在文件遍历时有用,但当前的问题更可能是路径错误或权限问题。用户应该先确认文件路径是否存在,再检查权限和配置。代码示例中,用户使用了绝对路径hdfs://192.168.1.108:9000/hadoop-2.10.0.tar.gz,需要确保该IP和端口正确,并且HDFS服务在该地址上可用。可能还需要检查防火墙设置,确保客户端能够访问HDFS的端口。 综合来看,我需要分步骤指导用户检查log4j配置和HDFS相关问题,同时提供代码示例和命令示例,确保他们能够逐步排查问题。需要提醒用户注意路径的正确性、配置文件的存在与内容、权限设置以及服务状态等关键点。</think>针对Log4j警告和HDFS文件不存在异常问题,以下是分步解决方案: ### 一、Log4j警告:No appenders found for logger #### 问题原因 Hadoop框架未加载到有效的log4j配置文件,导致日志系统无法初始化[^1] #### 解决方案 1. **定位配置文件** ```bash cd $HADOOP_HOME/etc/hadoop ls -l log4j.properties ``` 2. **创建/修改配置文件** - 若不存在则创建: ```bash cp log4j.properties.template log4j.properties ``` - 添加基础配置: ```properties log4j.rootLogger=INFO, console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d{ISO8601} [%p] %c: %m%n ``` 3. **验证配置有效性** ```java // Java代码中添加验证 PropertyConfigurator.configure("hadoop/conf/log4j.properties"); ``` ### 二、HDFS文件不存在异常 #### 问题原因 文件路径错误(客户端路径与HDFS路径混淆)、权限不足或NameNode未响应[^4] #### 解决方案 1. **路径验证** ```bash hadoop fs -ls hdfs://namenode:8020/path/to/file ``` 2. **代码层验证(Java示例)** ```java Path hdfsPath = new Path("hdfs://namenode:8020/test.txt"); if (!fs.exists(hdfsPath)) { throw new IOException("文件路径不存在: " + hdfsPath.toString()); } ``` 3. **权限修复** ```bash hadoop fs -chmod 755 /user/yourname ``` 4. **核心配置检查** - 验证`core-site.xml`: ```xml <property> <name>fs.defaultFS</name> <value>hdfs://namenode:8020</value> </property> ``` ### 三、综合验证步骤 1. **服务状态检查** ```bash jps | grep -E 'NameNode|DataNode|ResourceManager' ``` 2. **网络连通性测试** ```bash telnet namenode 8020 ``` 3. **客户端调试模式** ```bash export HADOOP_ROOT_LOGGER=DEBUG,console ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值