下面写一个例子通过FileSystem API 从hdfs文件系统读取文件内容输出到控制台。
一、项目准备
新建一个maven项目,添加如下依赖即可:
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.8.5</version>
</dependency>
二、编写实例
package util;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.URI;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.log4j.Logger;
/**
* 通过FileSystem API 从hdfs文件系统读取文件内容
* @author 随笔博客
*
*/
public class HdfsFileOperationUtil {
private static Logger log = Logger.getLogger(HdfsFileOperationUtil.class);
//Configuration 负责HDFS系统的配置文件的加载或者更改配置文件的工具类,将配置文件加载到内存中
private static Configuration conf = new Configuration();
public static String getStringByHSFSPath(String path) {
if(StringUtils.isBlank(path)) {
log.error("请指定hdfs文件系统中的文件路径");
return "";
}
try {
//FileSystem 对HDFS系统的引用,操作HDFS的根类,所有HDFS文件操作均以此类为源头发起
//URI.create(path):通过给定的uri方案和权限来确定要使用的文件系统
//Path HDFS文件的抽象,与Java IO流中的File对象对等
FileSystem fs = FileSystem.get(URI.create(path),conf);
//FSDataInputStream HDFS系统的文件字节输入流,类似于Java IO中的InputStream类,实现对HDFS文件的读取
//FSDataOutputStream HDFS系统的文件字节输出流,类似于Java IO中的OutputStream类,实现对HDFS文件的写入
FSDataInputStream in = null;
ByteArrayOutputStream out = null;
try {
out = new ByteArrayOutputStream();
in = fs.open(new Path(path));
//hadoop的工具类 把输入流的字节全部到输出流
IOUtils.copyBytes(in, out, 4096, false);
//转为字符串返回
return new String(out.toByteArray());
}finally {
//关闭IO流
IOUtils.closeStream(in);
}
} catch (IOException e) {
log.error(e.getMessage());
}
return "";
}
public static void main(String[] args) throws IOException {
if(args.length>0) {
log.info("结果:"+getStringByHSFSPath(args[0]));
}
}
}
三、打包为可执行jar上传到adoop集群
打包的话pom.xml添加如下内容,这里有点多,但是按我的经验添加完下面的内容后直接maven install 是可以执行成功的,要修改的就是名称和main所在类:
<build>
<finalName>hadoop-core</finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.4</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<!-- 执行package的phase -->
<phase>package</phase>
<!-- 为这个phase绑定goal -->
<goals>
<goal>shade</goal>
</goals>
<configuration>
<!-- 过滤掉以下文件,不打包 :解决包重复引用导致的打包错误-->
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<!-- 打成可执行的jar包 的主方法入口-->
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>util.HdfsFileOperationUtil</mainClass>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
四、启动集群
start-dfs.sh
start-yarn.sh
yarn-daemon.sh start resourcemanager
mr-jobhistory-daemon.sh start historyserver # 开启历史服务器才能在Web中查看任务运行情况
五、运行测试
yarn jar hadoop-core.jar /input/core-site.xml
成功输出内容
当然执行hadoop jar
也是一样的,这里因为启动了yarn就直接用yarn jar
了。