Hadoop的FileSystem 文件系统实现上传下载文件

2019-03-28 13:15|来源: 网络

Hadoop的FileSystem 文件系统实现上传下载:

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;

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.hadoop.util.Progressable;

public class UploadAndDown {

    public static void main(String[] args) {
        UploadAndDown uploadAndDown = new UploadAndDown();
        try {
            //将本地文件local.txt上传为HDFS上cloud.txt文件
            uploadAndDown.upLoadToCloud("local.txt", "cloud.txt");
            //将HDFS上的cloud.txt文件下载到本地cloudTolocal.txt文件
            uploadAndDown.downFromCloud("cloudTolocal.txt", "cloud.txt");
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    private void upLoadToCloud(String srcFileName, String cloudFileName)
            throws FileNotFoundException, IOException {
        // 本地文件存取的位置
        String LOCAL_SRC = "/home/linuxidc/hbase2/bin/" + srcFileName;
        // 存放到云端HDFS的位置
        String CLOUD_DEST = "hdfs://localhost:9000/user/linuxidc/" + cloudFileName;
        InputStream in = new BufferedInputStream(new FileInputStream(LOCAL_SRC));
        // 获取一个conf对象
        Configuration conf = new Configuration();
        // 文件系统
        FileSystem fs = FileSystem.get(URI.create(CLOUD_DEST), conf);
        // 输出流
        OutputStream out = fs.create(new Path(CLOUD_DEST), new Progressable() {
            @Override
            public void progress() {
                System.out.println("上传完成一个文件到HDFS");
            }
        });
        // 连接两个流,形成通道,使输入流向输出流传输数据
        IOUtils.copyBytes(in, out, 1024, true);
    }

    private void downFromCloud(String srcFileName, String cloudFileName) throws FileNotFoundException, IOException {
        // 云端HDFS上的文件
        String CLOUD_DESC = "hdfs://localhost:9000/user/linuxidc/"+cloudFileName;
        // down到本地的文件
        String LOCAL_SRC = "/home/linuxidc/hbase2/bin/"+srcFileName;
        // 获取conf配置
        Configuration conf = new Configuration();
        // 实例化一个文件系统
        FileSystem fs = FileSystem.get(URI.create(CLOUD_DESC), conf);
        // 读出流
        FSDataInputStream HDFS_IN = fs.open(new Path(CLOUD_DESC));
        // 写入流
        OutputStream OutToLOCAL = new FileOutputStream(LOCAL_SRC);
        // 将InputStrteam 中的内容通过IOUtils的copyBytes方法复制到OutToLOCAL中
        IOUtils.copyBytes(HDFS_IN, OutToLOCAL, 1024, true);
    }

}

在本地建立一个local.txt文件,运行个java程序,在eclipse下看到HDFS文件系统多了一个cloud.txt

同样也可以用hadoop的命令察看

linuxidc@Ubuntu:~/hadoop/bin$ hadoop fs -ls
Found 4 items
-rw-r--r--  3 linuxidc supergroup        11 2012-12-23 23:23 /user/linuxidc/Google.pdf
-rw-r--r--  3 linuxidc supergroup        61 2012-12-23 23:59 /user/linuxidc/cloud.txt
-rw-r--r--  3 linuxidc supergroup        13 2012-12-23 22:49 /user/linuxidc/demo.txt
drwxr-xr-x  - linuxidc supergroup          0 2012-11-18 15:17 /user/linuxidc/docs

同时在本地多了个cloudTolocal.txt文件:

linuxidc@ubuntu:~/hbase2/bin$ ls *.txt
cloudTolocal.txt  hadoop.txt  local.txt

相关问答

更多
  • 通常人们在架设FTP服务器时都为认为微软的IIS设置繁杂 ,其次是安全性较差。所以在这里将介绍使用功能强大的Serv-U来架设FTP服务器的过程 。Serv-U是一个非常实用的FTP服务器工具,体积虽然小但是大多数网站都是用该程序, 并且是共享软件,可以到软件类网站下载。 Serv-U的特征 1.支持多种用户接入 2.支持匿名用户,可随时限制用户数。 3.安全选项多 3.可基于目录或文件实现安全管理 4.支持虚拟多主目录IP站点登录 5.比例和带宽限制 6.作为系统服务运行 7.远程实施项目 8.通过FTP ...
  • 先安装JDK和JRE;然后Cygwin;再开启SSHD服务,之后便可以配置搭建Hadoop云平台。在云平台搭建好之后,安装Eclipse,并将Hadoop-eclipse开发插件包嵌入Eclipse。此后便可以通过eclipse连接Hadoop云平台,并实现其上的二次开发。具体的文件上传与下载都可以通过HDFS提供的API实现。
  • 请注意,您将copyFromLocalFile调用的第一个参数设置为true,这会导致本地文件被删除。 如果要保留本地文件,请将deleteSrc设置为false 。 以下是copyFromLocalFile方法的详细信息。 public void copyFromLocalFile(boolean delSrc, boolean overwrite, Path[] srcs, ...
  • 我通过调用“java -jar app.jar .... etc”来运行它。我应该使用“hadoop jar app.jar”。 当我正确运行它时按预期工作。 I was running this by calling "java -jar app.jar .... etc" I should have been using "hadoop jar app.jar". Worked as intended when I ran it correctly.
  • 简答 实际上它与IsolatedClientLoader有关,我们已经找到了根本原因并验证了修复。 我提交了https://issues.apache.org/jira/browse/SPARK-9206来跟踪这个问题,并通过简单的修复从我的fork成功构建了一个干净的Spark tarball: https : //github.com/apache/spark /拉/ 7549 有一些短期选择: 现在使用Spark 1.3.1。 在bdutil部署中,使用HDFS作为默认文件系统( - --defaul ...
  • 您可以从mapred-site.xml文件中删除fs.default.name值 - 这应该只在core-site.xml文件中。 如果要在本地文件系统上以伪模式运行,通常通过在所谓的本地模式下运行来实现 - 通过将core-site.xml中的fs.default.name值设置为file:///(您目前已将其配置为hdfs:// localhost:54310)。 您看到的堆栈跟踪是辅助名称节点启动时 - 在“本地模式”下运行时不需要这样,因为没有用于2NN的fsimage或编辑文件。 修复core-s ...
  • 如果您编写如上所述的命令,该文件将被复制到用户的HDFS主目录,即/ home / username 。 另请参见: HDFS主目录 。 如果要将文件写入其他位置,则可以像在Linux文件系统中一样使用绝对路径名(以“/”开头)。 If you write the command like above, the file gets copied to your user's HDFS home directory, which is /home/username. See also here: HDFS H ...
  • 如果您询问客户提供的加密密钥当前是否在Cloud Dataproc上可用,则答案是否定的。 以下是Google在其余时间加密的当前产品选项列表。 如果您只是想加密Spark写入的输出,您仍然可以使用Google的Cloud KMS在应用程序层加密。 这是在Google云端存储中执行此操作的代码库 (看起来就像您在上面的命令中所做的那样)。 请注意,默认情况下,客户内容在Google云平台上静态加密,因此这是另一层保护。 If you're asking if customer-supplied encryp ...
  • 如果找不到有效的hadoop配置,则会发生这种情况。 例如,如果你这样做: hadoop fs -ls 并且在默认位置没有找到配置,那么你将看到linux文件系统。 您可以通过在“hadoop”命令之后添加-conf选项来测试它,例如 hadoop -conf= fs -ls This will happen if a valid hadoop configuration is not found. e.g. if you do: hadoop fs -ls a ...
  • 查看Hadoop的bin/hadoop脚本,为了执行jar文件,它使用了这个条件 - elif [ "$COMMAND" = "jar" ] ; then CLASS=org.apache.hadoop.util.RunJar 这表示它使用RunJar类来执行jar。 如果你看到RunJar类,支持的参数是 - RunJar jarFile [mainClass] args... 其中,使用RunJar类中的以下代码访问jarFile-- int firstArg = 0; String fileN ...