下面写一个例子通过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><transformerimplementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/spring.handlers</resource></transformer><!-- 打成可执行的jar包 的主方法入口--><transformerimplementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass>util.HdfsFileOperationUtil</mainClass></transformer><transformerimplementation="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了。

