个人随笔
目录
通过FileSystem API 从hdfs文件系统读取文件内容
2019-11-16 23:43:52

下面写一个例子通过FileSystem API 从hdfs文件系统读取文件内容输出到控制台。

一、项目准备

新建一个maven项目,添加如下依赖即可:

  1. <dependency>
  2. <groupId>org.apache.hadoop</groupId>
  3. <artifactId>hadoop-client</artifactId>
  4. <version>2.8.5</version>
  5. </dependency>

二、编写实例

  1. package util;
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.IOException;
  4. import java.net.URI;
  5. import org.apache.commons.lang.StringUtils;
  6. import org.apache.hadoop.conf.Configuration;
  7. import org.apache.hadoop.fs.FSDataInputStream;
  8. import org.apache.hadoop.fs.FileSystem;
  9. import org.apache.hadoop.fs.Path;
  10. import org.apache.hadoop.io.IOUtils;
  11. import org.apache.log4j.Logger;
  12. /**
  13. * 通过FileSystem API 从hdfs文件系统读取文件内容
  14. * @author 随笔博客
  15. *
  16. */
  17. public class HdfsFileOperationUtil {
  18. private static Logger log = Logger.getLogger(HdfsFileOperationUtil.class);
  19. //Configuration 负责HDFS系统的配置文件的加载或者更改配置文件的工具类,将配置文件加载到内存中
  20. private static Configuration conf = new Configuration();
  21. public static String getStringByHSFSPath(String path) {
  22. if(StringUtils.isBlank(path)) {
  23. log.error("请指定hdfs文件系统中的文件路径");
  24. return "";
  25. }
  26. try {
  27. //FileSystem 对HDFS系统的引用,操作HDFS的根类,所有HDFS文件操作均以此类为源头发起
  28. //URI.create(path):通过给定的uri方案和权限来确定要使用的文件系统
  29. //Path HDFS文件的抽象,与Java IO流中的File对象对等
  30. FileSystem fs = FileSystem.get(URI.create(path),conf);
  31. //FSDataInputStream HDFS系统的文件字节输入流,类似于Java IO中的InputStream类,实现对HDFS文件的读取
  32. //FSDataOutputStream HDFS系统的文件字节输出流,类似于Java IO中的OutputStream类,实现对HDFS文件的写入
  33. FSDataInputStream in = null;
  34. ByteArrayOutputStream out = null;
  35. try {
  36. out = new ByteArrayOutputStream();
  37. in = fs.open(new Path(path));
  38. //hadoop的工具类 把输入流的字节全部到输出流
  39. IOUtils.copyBytes(in, out, 4096, false);
  40. //转为字符串返回
  41. return new String(out.toByteArray());
  42. }finally {
  43. //关闭IO流
  44. IOUtils.closeStream(in);
  45. }
  46. } catch (IOException e) {
  47. log.error(e.getMessage());
  48. }
  49. return "";
  50. }
  51. public static void main(String[] args) throws IOException {
  52. if(args.length>0) {
  53. log.info("结果:"+getStringByHSFSPath(args[0]));
  54. }
  55. }
  56. }

三、打包为可执行jar上传到adoop集群

打包的话pom.xml添加如下内容,这里有点多,但是按我的经验添加完下面的内容后直接maven install 是可以执行成功的,要修改的就是名称和main所在类:

  1. <build>
  2. <finalName>hadoop-core</finalName>
  3. <plugins>
  4. <plugin>
  5. <artifactId>maven-compiler-plugin</artifactId>
  6. <configuration>
  7. <source>1.6</source>
  8. <target>1.6</target>
  9. </configuration>
  10. </plugin>
  11. <plugin>
  12. <groupId>org.apache.maven.plugins</groupId>
  13. <artifactId>maven-shade-plugin</artifactId>
  14. <version>1.4</version>
  15. <configuration>
  16. <createDependencyReducedPom>false</createDependencyReducedPom>
  17. </configuration>
  18. <executions>
  19. <execution>
  20. <!-- 执行package的phase -->
  21. <phase>package</phase>
  22. <!-- 为这个phase绑定goal -->
  23. <goals>
  24. <goal>shade</goal>
  25. </goals>
  26. <configuration>
  27. <!-- 过滤掉以下文件,不打包 :解决包重复引用导致的打包错误-->
  28. <filters>
  29. <filter>
  30. <artifact>*:*</artifact>
  31. <excludes>
  32. <exclude>META-INF/*.SF</exclude>
  33. <exclude>META-INF/*.DSA</exclude>
  34. <exclude>META-INF/*.RSA</exclude>
  35. </excludes>
  36. </filter>
  37. </filters>
  38. <transformers>
  39. <transformer
  40. implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
  41. <resource>META-INF/spring.handlers</resource>
  42. </transformer>
  43. <!-- 打成可执行的jar包 的主方法入口-->
  44. <transformer
  45. implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
  46. <mainClass>util.HdfsFileOperationUtil</mainClass>
  47. </transformer>
  48. <transformer
  49. implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
  50. <resource>META-INF/spring.schemas</resource>
  51. </transformer>
  52. </transformers>
  53. </configuration>
  54. </execution>
  55. </executions>
  56. </plugin>
  57. </plugins>
  58. </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了。

 1379

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2