设为首页 收藏本站
查看: 796|回复: 0

[经验分享] Hadoop日记Day9---HDFS的java访问接口

[复制链接]

尚未签到

发表于 2015-7-11 11:26:15 | 显示全部楼层 |阅读模式
一、搭建Hadoop 开发环境
  我们在工作中写完的各种代码是在服务器中运行的,HDFS 的操作代码也不例外。在开发阶段,我们使用windows 下的eclipse 作为开发环境,访问运行在虚拟机中的HDFS。也就是通过在本地的eclipse 中的java 代码访问远程linux 中的hdfs。
要使用宿主机中的java 代码访问客户机中的hdfs,需要保证以下几点:
(1)确保宿主机与客户机的网络是互通的
(2)确保宿主机和客户机的防火墙都关闭,因为很多端口需要通过,为了减少防火墙配置,直接关闭.
(3)确保宿主机与客户机使用的jdk 版本一致。如果客户机为jdk6,宿主机为jdk7,那么代码运行时会报不支持的版本的错误。
(4)宿主机的登录用户名必须与客户机的用户名一直。比如我们linux 使用的是root 用户,那么windows 也要使用root 用户,否则会报权限异常
在eclipse 项目中覆盖hadoop 的org.apache.hadoop.fs.FileUtil 类的checkReturnValue 方法,如图1.1,目的是为了避免权限错误。
DSC0000.gif

图1.1

  如果读者在开发过程中出现权限等问题,请按照本节的提示检查自己的环境。

二、使用FileSystem api 读写数据

  在hadoop 的HDFS 操作中,有个非常重要的api,是org.apache.hadoop.fs.FileSystem,这是我们用户代码操作HDFS 的直接入口,该类含有操作HDFS 的各种方法,类似于jdbc 中操作数据库的直接入口是Connection 类。
  那我们怎么获得一个FileSystem 对象


DSC0001.gif DSC0002.png


1   String uri = "hdfs://10.1.14.24:9000/";
2             Configuration conf = new Configuration();
3             FileSystem fs = FileSystem.get(URI.create(uri), conf);
View Code  以上代码中,要注意调用的是FileSystem 的静态方法get,传递两个值给形式参数,第一个访问的HDFS 地址,该地址的协议是hdfs,ip 是10.1.14.24,端口是9000。这个地址的完整信息是在配置文件core-site.xml 中指定的,读者可以使用自己环境的配置文件中的设置。第二个参数是一个配置对象。

1. 创建文件夹
  使用HDFS 的shell 命令查看一下根目录下的文件情况,如图2.1所示。
DSC0003.png

图2.1

  我们在HDFS 的根目录下创建文件夹,代码如下
  ------------------------------------------------------------------------------------------------------
  final String pathString = "/d1";
            boolean exists = fs.exists(new Path(pathString));
            if(!exists){
            boolean result = fs.mkdirs(new Path(pathString));
            System.out.println(result);
            }
  
------------------------------------------------------------------------------------------------------
  以上代码中要放在Main函数中,


  • 第一行决定创建的文件夹完整路径是“/d1”。
  • 第二行代码是使用方法exitst判断文件夹是否存在;如果不存在,执行创建操作。
  • 第三行创建文件夹,调用的是mkdirs 方法,返回值是布尔值,如果是true,表示创建成功;如果是false,表示创建失败。
  现在查看一下是否成功了,如图3.2,3.3可见创建成功了。
DSC0004.png
图3.2

DSC0005.png

图 3.3


2. 写文件
  我们可以向HDFS 写入文件,代码如下:
  
-----------------------------------------------------------------------------------------------------
  final String pathString = "/d1/f1";
final FSDataOutputStream fsDataOutputStream = fs.create(new Path(pathString));//写出去
IOUtils.copyBytes(new ByteArrayInputStream("my name is Sunddenly".getBytes()),
fsDataOutputStream, conf, true);
  
------------------------------------------------------------------------------------------------------
第一行代码表示创建的文件是在刚才创建的d1 文件夹下的文件f1;
第二行是调用create 方法创建一个通向HDFS 的输出流;
第三行是通过调用hadoop 的一个工具类IOUtils 的静态方法copyBytes 把一个字符串发送给输出流中。
  该静态方法有四个参数:


  • 第一个参数输入流。
  • 第二个参数是输出流。
  • 第三个参数是配置对象。
  • 第四个参数是布尔值,如果是true 表示数据传输完毕后关闭流。
  现在看一下是否创建成功了,如图3.4所示。
DSC0006.png

图3.4


3. 读文件
  现在我们把刚才写入到HDFS 的文件“/d1/f1”读出来,代码如下:
  ------------------------------------------------------------------------------------------------------
    final String pathString = "/d1/f1";
    final FSDataInputStream fsDataInputStream = fs.open(new Path(pathString));//读进来
    IOUtils.copyBytes(fsDataInputStream, System.out, conf, true);
  -------------------------------------------------------------------------------------------------------


  • 第一行指定所读文件的路径。
  • 第二行表示调用方法open 打开一个指定的文件,返回值是一个通向该文件的输入流;
  • 第三行还是调用IOUtils.copyBytes 方法,输出的目的地是控制台。
  见图3.5
DSC0007.png
图3.5


4. 查看目录列表和文件详细信息
  我们可以把根目录下的所有文件和目录显示出来,代码如下
  --------------------------------------------------------------------------------------------------------
    final String pathString = "/";
    final FileStatus[] listStatus = fs.listStatus(new Path(pathString));
    for (FileStatus fileStatus : listStatus) {
      final String type = fileStatus.isDir()?"目录":"文件";
      final short replication = fileStatus.getReplication();
      final String permission = fileStatus.getPermission() .toString();
      final long len = fileStatus.getLen();
      final Path path = fileStatus.getPath();
      System.out.println(type+"\t"+permission+"\t"+replication+"\t"+len+"\t"+path);
    }
  -----------------------------------------------------------------------------------------------------------
  调用listStatus方法会得到一个指定路径下的所有文件和文件夹,每一个用FileStatus表示。我们使用for循环显示每一个FileStatus对象。FileStatus对象表示文件的详细信息,里面含有类型、副本数、权限、长度、路径等很多信息,我们只是显示了一部分。结果如图3.6所示。

图 3.6


5. 删除文件或目录
  我们可以删除某个文件或者路径,代码如下
  -----------------------------------------------------------------------------------------------------
    final String pathString = "/d1/f1";
    //fs.delete(new Path("/d1"), true);
    fs.deleteOnExit(new Path(pathString));
  -----------------------------------------------------------------------------------------------------
  第三行代码表示删除文件“/d1/f1”,注释掉的第二行代码表示递归删除目录“/d1”及下面的所有内容。除了上面列出的fs 的方法外,还有很多方法,请读者自己查阅api。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-85506-1-1.html 上篇帖子: Hadoop源码学习笔记(3) ——初览DataNode及学习线程 下篇帖子: Hadoop项目开发笔录
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表