zoukankan      html  css  js  c++  java
  • 大数据学习——java代码实现对HDFS文件的read、append、write操作

    在之前的环节进行了HDFS 的搭建过程,接下来学习的内容是通过java代码实现对HDFS中文件进行操作。

    这部分学习是为了之后在使用到的MapRedce对HDFS 文件进行操作。

    在eclipse上编写java代码对HDFS上的文件进行操作首先要在项目中进行jar包导入。这里我们通过建立maven项目,方便jar包的导入。

    需要注意的是在使用mave时导入本地不存在的jar包需要在有网的环境下进行

    这里我们导入的jar包有以下几部分,在pom.xml中配置以下几个部分,会自动下载相关jar包

    <dependencies>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-common</artifactId>
                <version>2.7.3</version>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-client</artifactId>
                <version>2.7.3</version>
            </dependency>
            <dependency>
                <groupId>jdk.tools</groupId>
                <artifactId>jdk.tools</artifactId>
                <version>1.8</version>
                <scope>system</scope>
                <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
            </dependency>
        </dependencies>

     建立HDFSClient类,进行操作其中:

    write:写入操作,文件不存在时自动创建文件并写入数据

    append:追加写入操作,写入文件需存在

    read:读取文件操作

    代码如下:

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FSDataInputStream;
    import org.apache.hadoop.fs.FSDataOutputStream;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    
    public class HDFSClient {
        public static void main(String[] args) {
            
            write();
             //append(); 
             read();
        }
        //主加写入文件,必须是已有文件
        public static void append(){
            Configuration conf=new Configuration();
            conf.set("fs.defaultFS", "hdfs://192.168.98.141:9000");
            conf.set("dfs.support.append", "true");
            conf.set("dfs.client.block.write.replace-datanode-on-failure.policy", "NEVER");//配置权限
            conf.set("dfs.client.block.write.replace-datanode-on-failure.enable", "true");//配置权限
            try {
                FileSystem fs=FileSystem.get(conf);
                FSDataOutputStream outpustream = fs.append(new Path("/hp/abc.txt"));//FSDataOutputStream文件输出流 //追加文件
                outpustream.writeBytes("xxxxxx");//追加内容
                outpustream.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        //写入文件
        public static void write(){
            Configuration conf=new Configuration();
            conf.set("fs.defaultFS", "hdfs://192.168.98.141:9000");
            try {
                FileSystem fs=FileSystem.get(conf);
                FSDataOutputStream outputStream = fs.create(new Path("/hp/abc.txt"));
                outputStream.writeBytes("abcde");
                outputStream.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        public static void read(){
            // 配置对象
            Configuration conf=new Configuration();
            // 在配置对象中设置 namenode
            conf.set("fs.defaultFS", "hdfs://192.168.98.141:9000");
            try {
                // 创建 FileSystem 
                FileSystem fs=FileSystem.get(conf) ;
                // 穿件输入流
                FSDataInputStream inputstream = fs.open(new Path("/hp/abc.txt"));
                // 字节流转字符流
                InputStreamReader isr=new InputStreamReader(inputstream);
                BufferedReader br=new BufferedReader(isr);
                String str=br.readLine();
                while(str!=null){
                    System.out.println(str);
                    str=br.readLine();
                }
                br.close();
                isr.close();
                inputstream.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    注:这里不能write append方法同时使用会报出错误,具体如何解决和原因我也没有弄清楚

  • 相关阅读:
    hdu-6435
    Wannafly挑战赛22-A/B/C
    POJ-3041-建图/二分图匹配/网络流
    nyoj-1015-二分图判定
    hdu-6406-dp+ST表
    2017.3.27 集成modeler后的一些主要路径(持续更新)
    2016.3.23 集成新版activiti-modeler(5.17+)到项目中
    2017.3.14 activiti实战--第二十章--REST服务
    2017.2.28 activiti实战--第七章--Spring容器集成应用实例(五)普通表单
    2017.2.28 activiti实战--第六章--任务表单(二)外置表单
  • 原文地址:https://www.cnblogs.com/yuezhihao/p/9308458.html
Copyright © 2011-2022 走看看