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
知识点
相关教程
更多【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实现方案