Hadoop HDFS Wrong FS: hdfs:/ expected file:///

HDFS是一个分布式文件系统,然而对于程序员来说,HDFS就是一个普通文件系统,Hadoop进行的底层封装,程序员按照相应的API来对HDFS上的文件操作,和对本地磁盘文件操作没有太多区别。但是最初接触时可能还是会碰到这样那样的问题。

例如:获取FileSystem实例时会出现

java.lang.NullPointerException
    at org.apache.hadoop.conf.Configuration.get(Configuration.java:382)
    at org.apache.hadoop.conf.Configuration.getBoolean(Configuration.java:570)
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:192)
    at hadoop.test.URLCat.copyFileToAnotherFile(URLCat.java:38) //这个是我写的一个方法,报错了
    at hadoop.test.URLCat.main(URLCat.java:83)

代码:

package hadoop.test;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hdfs.DistributedFileSystem;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;

public class URLCat extends Configured {
   
    /×static{
        Configuration.addDefaultResource("hdfs-default.xml");
        Configuration.addDefaultResource("hdfs-site.xml");
        Configuration.addDefaultResource("mapred-default.xml");
        Configuration.addDefaultResource("mapred-site.xml");
    } ×/没有这个static块时就会报上面对错误


    public  void copyFileToAnotherFile(String[] args)
    {
        InputStream in = null;
        OutputStream out = null;
        try {
            String sourceFile = args[0];
            String targetFile = args[1];
            in = new BufferedInputStream(new FileInputStream(sourceFile));
           
            Configuration conf = new Configuration();
            System.out.println(conf);
            System.out.println(URI.create(targetFile)==null);
            System.out.println(conf==null);
            System.out.println(FileSystem.get(URI.create(targetFile),conf)==null);
           
            FileSystem fs = DistributedFileSystem.get(URI.create(targetFile),conf);
            System.out.println(fs);
            out = fs.create(new Path(targetFile),new Progressable(){
                public void progress(){System.out.print(".");}
            });
            IOUtils.copyBytes(in, out, 4096,true);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally
        {
            IOUtils.closeStream(in);
            IOUtils.closeStream(out);
        }
    }
   
    static {
        URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
    }

    public static void displayFile(String[] args)
    {
        InputStream in = null;
            try {
                in = new URL(args[0]).openStream();
                IOUtils.copyBytes(in, System.out, 4096,false);
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally
            {
                IOUtils.closeStream(in);
            }
    }
    /**
    * @param args
    */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new URLCat().copyFileToAnotherFile(args);
        //URLCat.displayFile(args);
        //
    }

}

 

原因:Configuration似乎只会加载基本的两个文件,所以需要将其它配置文件手动导入

 Configuration类:  defaultResources.add("hadoop-default.xml");
                                finalResources.add("hadoop-site.xml");

 

 

下面把整个代码到执行过程叙述一下,希望对刚接触hadoop编程的人有帮助:

 

1.需要配置好java环境主要是JAVA_HOME和CLASS_PATH,两个必须要设置

export JAVA_HOME=/usr/lib/jvm/java-6-sun
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:/usr/lib/jvm/java-6-sun/lib

 

2在本地编写代码,当然可以用Eclipse工具

 

3设置HADOOP_CLASSPATH

 HADOOP_CLASSPATH指向class文件的根目录,例如包hadoop.test的根目录上/home/hadoop/EclipseWorkspace/TestProject/bin

 

4执行命令hadoop hadoop.test.URLCat /home/hadoop/Documents/test.txt hdfs://192.186.54.1:8020/user/hadoop/test.txt

又出错了:java.lang.IllegalArgumentException: Wrong FS: hdfs://192.186.54.1:8020/user/hadoop/test.txt, expected: hdfs://hadoop1
    at org.apache.hadoop.fs.FileSystem.checkPath(FileSystem.java:310)
    at org.apache.hadoop.hdfs.DistributedFileSystem.checkPath(DistributedFileSystem.java:99)
    at org.apache.hadoop.hdfs.DistributedFileSystem.getPathName(DistributedFileSystem.java:155)
    at org.apache.hadoop.hdfs.DistributedFileSystem.create(DistributedFileSystem.java:195)
    at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:484)
    at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:384)
    at hadoop.test.URLCat.copyFileToAnotherFile(URLCat.java:46)
    at hadoop.test.URLCat.main(URLCat.java:86)
 原因,命令hdfs不能说IP,需要hostname,执行以下命令

 

 hadoop hadoop.test.URLCat /home/hadoop/Documents/test.txt hdfs://hadoop1:8020/user/hadoop/test.txt

 一切OK。

我的配置文件是ip,而不是hostname,因为没有DNS server帮助解析,但是执行命令仍然得用hostname。

综上:2个地方需要注意。Configuration和hdfs://hostname:port/user/pathtofile/file

2019-03-28 13:14

知识点

相关教程

更多

【HDFS】HADOOP DISTRIBUTED FILE SYSTEM

【HDFS】Hadoop DISTRIBUTED FILE SYSTEM THE CAST CLIENT:人们都坐在客户端前,向客户端输入/输出数据 NAMENODE:服务端只有一个,负责协调HDFS存储系统,例如数据分配情况,备份策略,故障诊断等 DATANODE:用于存储数据的集合,结构为一个cluster包含诺干个racks,一个racks包含诺干个datanode,datanode也就相当

Hadoop FS Shell命令大全

调用文件系统(FS)Shell命令应使用 bin/Hadoop fs <args>的形式。 所有的的FS shell命令使用URI路径作为参数。URI格式是scheme://authority/path。对HDFS文件系统,scheme是hdfs,对本地文件系统,scheme是file。其中scheme和authority参数都是可选的,如果未加指定,就会使用配置中指定的默认schem

Hadoop HDFS源码学习笔记(二)

Hadoop文件系统中有一个抽象的文件系统类,HDFS只是其中的一个实现。java抽象类org.apache.hadoop.fs.FileSystem 定义了Hadoop中一个文件系统接口,并且该抽象类有几个具体的实现,例如LocalFileSystem,hdfs.DistributeFileSystem等 虽然我们关注的是HDFS的DistributedFileSystem但还是应该集成File

HDFS的JavaAPI操作

HDFS的JavaAPI操作:     packagehdfs; importstaticorg.junit.Assert.fail; importjava.util.Arrays; importorg.apache.Hadoop.conf.Configuration; importorg.apache.hadoop.fs.BlockLocation; importorg.apache.hadoo

扩展Hadoop HDFS,实现WebDav协议,将hdfs mount为Linux本地文件系统

使用Hadoop的shell命令进行hdfs的操作十分不方便,最好的办法当然是将hdfs映射为本地文件系统. 而通过实现WebDav Http协议, 结合WebDav的众多客户端,可以将hdfs映射为windows或是linux的本地文件系统.而使用api存储文件时,也将对应用透明,如使用本地文件系统一样使用hdfs. 1.Webdav协议介绍: WebDAV(Web-based Distribu

Hadoop集群(第8期)_HDFS初探之旅

相关系列目录:    Hadoop集群安装配置系列(目录) http://www.linuxidc.com/Linux/2012-12/76696.htm 1、HDFS简介      HDFS(Hadoop Distributed File System)是Hadoop项目的核心子项目,是分布式计算中数据存储管理的基础,是基于流数据模式访问和处理超大文件的需求而开发的,可以运行于廉价的商用服务器上

Hadoop 学习总结之一:HDFS简介

一、HDFS的基本概念    1.1、数据块(block)         HDFS(Hadoop Distributed File System)默认的最基本的存储单位是64M的数据块。  和普通文件系统相同的是,HDFS中的文件是被分成64M一块的数据块存储的。  不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间。     1.2、元数据节点(N

Hadoop 创建用户及HDFS权限,HDFS操作等常用Shell命令

sudo addgroup Hadoop#添加一个hadoop组 sudo usermod -a -G hadoop larry#将当前用户加入到hadoop组 sudo gedit etc/sudoers#将hadoop组加入到sudoer 在root ALL=(ALL) ALL后 hadoop ALL=(ALL) ALL 修改hadoop目录的权限 sudo chown -R larry:ha

Hadoop HDFS 编程

HDFS是一个分布式文件系统,然而对于程序员来说,HDFS就是一个普通文件系统,Hadoop进行的底层封装,程序员按照相应的API来对HDFS上的文件操作,和对本地磁盘文件操作没有太多区别。但是最初接触时可能还是会碰到这样那样的问题。 例如:获取FileSystem实例时会出现 java.lang.NullPointerException at org.apache.hadoop.conf.Con

Hadoop (HDFS)分布式文件系统基本操作

Hadoop HDFS提供了一组命令集来操作文件,它既可以操作Hadoop分布式文件系统,也可以操作本地文件系统。但是要加上theme(Hadoop文件系统用hdfs://,本地文件系统用file://) 1. 添加文件和目录 比如我们要在Hadoop 文件系统中创建一个目录叫 /user/hadoop-user ,则 hadoop fs -mkdir /user/hadoop-user 要查看我

Hadoop HDFS之SequenceFile和MapFile

Hadoop的HDFS和MapReduce子框架主要是针对大数据文件来设计的,在小文件的处理上不但效率低下,而且十分消耗磁盘空间(每一个小文件占用一个Block,HDFS默认block大小为64M)。解决办法通常是选择一个容器,将这些小文件组织起来统一存储。HDFS提供了两种类型的容器,分别是SequenceFile和MapFile。 一、SequenceFile    SequenceFile的

Spark连接Hadoop读取HDFS问题小结

Spark与Hadoop版本 我使用0.7.2的Spark版本,且是pre-built过的版本,支持的hadoop版本是hadoop1。在http://spark-project.org/files/上能下载的预编译过的spark版本里,凡是预编译cdh4的压缩包,下载后解压会中断,文件本身有问题。我在google论坛上发帖说明了这个问题:https://groups.google.com/for

Hadoop HDFS 配置

环境:        Jdk1.6         Hadoop-2.20.1         Fuse-2.8.1                Jdk1.6 下载地址        http://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/VerifyItem-Start/jdk-6u

从HDFS下载文件到本地

使用HDFS java api 下载文件到本地的代码如下:    String file="hdfs://localhost:9000/user/Administrator/fooo/j-spatial.zip";//hdfs文件 地址    Configuration config=new Configuration();    FileSystem fs=FileSyste

Hadoop源码分析 HDFS ClientProtocol——addBlock

addBlock()负责分配一个新的block以及该block备份存储的datanode。addBlock函数声明如下: publicLocatedBlockaddBlock(Stringsrc,StringclientName,DatanodeInfo[]excludedNodes) 其中src代表需要写入新block的文件;clientName代表写入该block的client、exclude

最新教程

更多

java线程状态详解(6种)

java线程类为:java.lang.Thread,其实现java.lang.Runnable接口。 线程在运行过程中有6种状态,分别如下: NEW:初始状态,线程被构建,但是还没有调用start()方法 RUNNABLE:运行状态,Java线程将操作系统中的就绪和运行两种状态统称为“运行状态” BLOCK:阻塞状态,表示线程阻塞

redis从库只读设置-redis集群管理

默认情况下redis数据库充当slave角色时是只读的不能进行写操作,如果写入,会提示以下错误:READONLY You can't write against a read only slave.  127.0.0.1:6382> set k3 111  (error) READONLY You can't write against a read only slave. 如果你要开启从库

Netty环境配置

netty是一个java事件驱动的网络通信框架,也就是一个jar包,只要在项目里引用即可。

Netty基于流的传输处理

​在TCP/IP的基于流的传输中,接收的数据被存储到套接字接收缓冲器中。不幸的是,基于流的传输的缓冲器不是分组的队列,而是字节的队列。 这意味着,即使将两个消息作为两个独立的数据包发送,操作系统也不会将它们视为两个消息,而只是一组字节(有点悲剧)。 因此,不能保证读的是您在远程定入的行数据

Netty入门实例-使用POJO代替ByteBuf

使用TIME协议的客户端和服务器示例,让它们使用POJO来代替原来的ByteBuf。

Netty入门实例-时间服务器

Netty中服务器和客户端之间最大的和唯一的区别是使用了不同的Bootstrap和Channel实现

Netty入门实例-编写服务器端程序

channelRead()处理程序方法实现如下

Netty开发环境配置

最新版本的Netty 4.x和JDK 1.6及更高版本

电商平台数据库设计

电商平台数据库表设计:商品分类表、商品信息表、品牌表、商品属性表、商品属性扩展表、规格表、规格扩展表

HttpClient 上传文件

我们使用MultipartEntityBuilder创建一个HttpEntity。 当创建构建器时,添加一个二进制体 - 包含将要上传的文件以及一个文本正文。 接下来,使用RequestBuilder创建一个HTTP请求,并分配先前创建的HttpEntity。

MongoDB常用命令

查看当前使用的数据库    > db    test  切换数据库   > use foobar    switched to db foobar  插入文档    > post={"title":"领悟书生","content":"这是一个分享教程的网站","date":new

快速了解MongoDB【基本概念与体系结构】

什么是MongoDB MongoDB is a general purpose, document-based, distributed database built for modern application developers and for the cloud era. MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

windows系统安装MongoDB

安装 下载MongoDB的安装包:mongodb-win32-x86_64-2008plus-ssl-3.2.10-signed.msi,按照提示步骤安装即可。 安装完成后,软件会安装在C:\Program Files\MongoDB 目录中 我们要启动的服务程序就是C:\Program Files\MongoDB\Server\3.2\bin目录下的mongod.exe,为了方便我们每次启动,我

Spring boot整合MyBatis-Plus 之二:增删改查

基于上一篇springboot整合MyBatis-Plus之后,实现简单的增删改查 创建实体类 添加表注解TableName和主键注解TableId import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baom

分布式ID生成器【snowflake雪花算法】

基于snowflake雪花算法分布式ID生成器 snowflake雪花算法分布式ID生成器几大特点: 41bit的时间戳可以支持该算法使用到2082年 10bit的工作机器id可以支持1024台机器 序列号支持1毫秒产生4096个自增序列id 整体上按照时间自增排序 整个分布式系统内不会产生ID碰撞 每秒能够产生26万ID左右 Twitter的 Snowflake分布式ID生成器的JAVA实现方案