Hadoop通常运行在Linux上,而开发程序通常是Windows,执行代码时,为了看到更多的日志信息,需要添加log4j.properties或log4j2的log4j2.xml。
通过查看hadoop-client-3.2.2依赖可知,系统中已经包含了log4j 1.2的日志组件,如图2-11所示。
图2-11
此时只需要添加一个log4j与slf4j整合的依赖即可,所以添加以下依赖:
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.26</version> </dependency>
同时添加日志文件。直接在classpath下创建log4j.properties文件,即在项目的main/resources目录下添加log4j.properties文件即可:
log4j.rootLogger = debug,stdout log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target = System.out log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm: ss,SSS} method:%l%n%m%n
再次运行上面访问HDFS的代码,将出现以下问题:
java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset
意思为HADOOP_HOME和hadoop.home.dir没有设置。虽然出现上述问题,但程序仍然可以执行成功。出现上述问题的原因是本地没有Hadoop的程序。
此时,我们需要在本地,即Windows上解压一个相同的Hadoop版本,并配置HADOOP_HOME环境变量,如笔者将Hadoop 3.2.2也同时解压到Windows系统的D:/program目录下,则配置环境变量为:
HADOOP_HOME=D:\program\hadoop-3.2.2 hadoop.home.dir=D:\program\hadoop-3.2.2
如果不想配置环境变量,也可以在上述的Java代码中,添加上述变量到System中,如下所示:
System.setProperty("HADOOP_HOME", "D:/program/hadoop-3.2.2"); System.setProperty("hadoop.home.dir", "D:/program/hadoop-3.2.2");
同时还需要添加winutils,可以从GitHub或Gitee网站上找到相关版本的winutils。将下载的文件放到D:\program\hadoop-3.2.2\bin中即可。再次运行,就没有任何警告信息了。从本书的附带资源中也可以找到相关资源,其位置为chapter02/软件/wintuils。