博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hadoop URL中读取数据出错:unknown protocol: hdfs
阅读量:6884 次
发布时间:2019-06-27

本文共 2574 字,大约阅读时间需要 8 分钟。

  hot3.png

今天在学习如何从hadoop中读取数据时,写了一个简单的方法,测试时,却报以下错误:

154835_1JUC_1434710.png

以下是读取hadoop中文件并写入本地磁盘的代码:

package hdfs;import java.io.BufferedReader;import java.io.FileWriter;import java.io.InputStream;import java.io.InputStreamReader;import java.net.URL;import org.apache.hadoop.io.IOUtils;public class HDFS {		public static void main(String[] args) throws Exception {		InputStream inputStream = null;		FileWriter writer = null;		try {			URL url = new URL("hdfs://localhost:9000/input.txt");			inputStream = url.openStream();			writer = new FileWriter("/home/wxl/桌面/tmp.txt");			InputStreamReader reader = new InputStreamReader(inputStream);			BufferedReader bufferedReader = new BufferedReader(reader);			String line = null;			while((line = bufferedReader.readLine()) != null) {				writer.write(line);			}		} finally {			IOUtils.closeStream(inputStream);			if(writer != null) {				writer.close();			}		}	}}

几经周折,在《Hadoop权威指南》中找到这样的结果:

    "There’s a little bit more work required to make Java recognize Hadoop’s hdfs URL scheme. This is achieved by calling the setURLStreamHandlerFactory method on URL with an instance of FsUrlStreamHandlerFactory . This method can be called only once per JVM, so it is typically executed in a static block."

    意即:“让Java程序能够识别Hadoop的hdfs URL方案还需要一些额外的工作,这里采用的方法是通过FsUrlStreamHandlerFactory实例调用URL中的setURLStreamHandlerFactory方法。由于Java虚拟机只能调用一次上述方法,因此通常在静态方法中调用上述方法。”

    于是,在类中加入静态执行块:

static {	// This method can be called at most once in a given JVM.	URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());}

    因此代码变成了下面这样:

package hdfs;import java.io.BufferedReader;import java.io.FileWriter;import java.io.InputStream;import java.io.InputStreamReader;import java.net.URL;import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;import org.apache.hadoop.io.IOUtils;public class HDFS {		static {		// This method can be called at most once in a given JVM.		URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory(););	}		public static void main(String[] args) throws Exception {		InputStream inputStream = null;		FileWriter writer = null;		try {			URL url = new URL("hdfs://localhost:9000/input.txt");			inputStream = url.openStream();			writer = new FileWriter("/home/wxl/桌面/tmp.txt");			InputStreamReader reader = new InputStreamReader(inputStream);			BufferedReader bufferedReader = new BufferedReader(reader);			String line = null;			while((line = bufferedReader.readLine()) != null) {				writer.write(line);			}		} finally {			IOUtils.closeStream(inputStream);			if(writer != null) {				writer.close();			}		}	}}

    OK,不再报错,成功运行。

转载于:https://my.oschina.net/itblog/blog/337235

你可能感兴趣的文章
VMware虚拟机克隆CentOS6.4网卡无法正常启动解决案例
查看>>
龙芯pmon初探
查看>>
MongoDB和pymongo入门
查看>>
Service IP 原理 - 每天5分钟玩转 Docker 容器技术(137)
查看>>
手写数字识别系统之数字提取
查看>>
位运算符 209
查看>>
python之列表使用方法总结
查看>>
6.代理模式
查看>>
Linux下安装Hadoop(2.7.1)详解及WordCount运行
查看>>
MSSQL 2005降低权限运行的方法
查看>>
OpenCV3与深度学习实例-使用GoogLeNet模型进行图片分类识别
查看>>
8月第2周国内IT类网站/频道:太平洋降至第二
查看>>
2013年中国域名商报告:西部数码净增7.6万域名
查看>>
我们是如何将一个项目做烂的
查看>>
7月第1周全球域名商TOP15:万网与DNSPOD增势稳定
查看>>
SaltStack数据系统
查看>>
网站http改https Let’s Encrypt 安装 续期教程 免费ssl证书Let’s Encrypt使用教程Certbot...
查看>>
我的友情链接
查看>>
如何在一分钟内实现微服务系统下的架构可视化
查看>>
教育业信息化应用
查看>>