Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >如何在集群外节点跨网段向HDFS写数据

如何在集群外节点跨网段向HDFS写数据

作者头像
Fayson
修改于 2018-04-01 12:51:43
修改于 2018-04-01 12:51:43
2.8K0
举报
文章被收录于专栏:Hadoop实操Hadoop实操

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。 Fayson的github:https://github.com/fayson/cdhproject 提示:代码块部分可以左右滑动查看噢

1.文档编写目的


最近后台有位兄弟向Fayson提了一个问题,原文如下:

“就是我的hdfs机器配置两个ip,一个外部可以访问,一个内部互联的地址,机器的hostname都是配置内网地址,现在有一个集群外的机器要写hdfs文件,发现namenode分配的datanode的地址是内网地址,不能访问到,这个不知道怎么去配置了。”

Fayson想了想这个问题其实在各个环境是都可能碰到的,于是在这篇文章给大家系统介绍一下。

在做Hadoop应用开发时有多种方式访问HDFS文件系统(如:FileSystem、WebHdfsFileSystem),Fayson前面的文章《如何使用Java代码访问HDFS.docx》已讲过使用FileSystem访问HDFS。另外一种基于REST的API实现,分为两种一种是Hortonworks提供的WebHDFS默认的与Hadoop集成,一种是Cloudera 提供的HttpFS需要安装独立的HttpFS服务。本篇文章主要介绍如何使用WebHdfs和HttpFS方式访问HDFS。两种方式具体架构如下图:

  • 内容概述

1.WebHDFS和HttpFS访问HDFS

2.常见问题

3.总结

  • 测试环境

1.CM和CDH版本为5.13.1

2.采用root用户操作

前置条件

1.HDFS已安装HttpFS服务

2.集群已启用高可用

3.集群未启用Kerberos

2.HDFS NameNode状态


3.WebHDFS访问HDFS


1.java代码实现如下,提示:代码块部分可以左右滑动查看噢

代码语言:txt
AI代码解释
复制
package com.cloudera.hdfs.nonekerberos;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hdfs.web.WebHdfsFileSystem;
import java.io.IOException;
import java.net.URI;
/**
 * package: com.cloudera.hdfs.nonekerberos
 * describe: 使用WebHDFSFileystem的方式访问Hadoop集群的文件系统
 * creat_user: Fayson
 * email: htechinfo@163.com
 * creat_date: 2017/12/21
 * creat_time: 下午11:51
 * 公众号:Hadoop实操
 */
public class WebHDFSTest {
    public static void main(String[] args) {
        Configuration configuration = new Configuration();
        WebHdfsFileSystem webHdfsFileSystem = new WebHdfsFileSystem();
        try {
            webHdfsFileSystem.initialize(new URI("http://13.250.102.77:50070"), configuration);
            System.out.println(webHdfsFileSystem.getUri());
            //向HDFS Put文件
            webHdfsFileSystem.copyFromLocalFile(new Path("/Users/fayson/Desktop/run-kafka"), new Path("/fayson1"));
            //列出HDFS根目录下的所有文件
            FileStatus[] fileStatuses =  webHdfsFileSystem.listStatus(new Path("/"));
            for (FileStatus fileStatus : fileStatuses) {
                System.out.println(fileStatus.getPath().getName());
            }
            webHdfsFileSystem.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

本段代码主要写了使用WebHdfs提供的API接口访问HDFS,向HDFS的/fayson1目录下put文件,并列出HDFS根目录下所有文件。

2.本地目录待上传文件

3.执行代码前HDFS根目录

4.在Intellij中运行代码,执行结果如下

5.查看HDFS的数据目录

与代码执行返回结果一致。查看put的数据文件

6.将代码里面访问的webhdfs修改为另外一个NameNode的Ip地址测试

选择另外一个Standby状态的NameNode不能够正常访问HDFS,需要指定Active状态的NameNode,API接口才能正常调用。

4.HttpFS访问HDFS


我们使用同样的webhdfs访问HDFS的代码,这里只需要将访问地址修改为HttpFS服务所在的服务器ip及端口即可。

1.HttpFs服务

由于Fayson使用的是AWS服务器,所以ip-172-31-6-148.fayson.com对应的公网IP地址为:52.221.198.3,HttpFS服务的端口号为14000。我们将代码里面的访问地址修改为http://52.221.198.3:14000

2.java代码实现如下,提示:代码块部分可以左右滑动查看噢

代码语言:txt
AI代码解释
复制
package com.cloudera.hdfs.nonekerberos;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hdfs.web.WebHdfsFileSystem;
import org.apache.hadoop.security.UserGroupInformation;
import java.net.URI;
/**
 * package: com.cloudera.hdfs.nonekerberos
 * describe: 使用Cloudera HttpFS提供的API接口访问HDFS
 * creat_user: Fayson
 * email: htechinfo@163.com
 * creat_date: 2017/12/23
 * creat_time: 下午11:06
 * 公众号:Hadoop实操
 */
public class HttpFSDemo {
    public static void main(String[] args) {
        Configuration configuration = new Configuration();
        UserGroupInformation.createRemoteUser("fayson");
        WebHdfsFileSystem webHdfsFileSystem = new WebHdfsFileSystem();
        try {
            webHdfsFileSystem.initialize(new URI("http://52.221.198.3:14000"), configuration);
            System.out.println(webHdfsFileSystem.getUri());
            //向HDFS Put文件
            webHdfsFileSystem.copyFromLocalFile(new Path("/Users/fayson/Desktop/run-kafka/"), new Path("/fayson1-httpfs"));
            //列出HDFS根目录下的所有文件
            FileStatus[] fileStatuses =  webHdfsFileSystem.listStatus(new Path("/"));
            for (FileStatus fileStatus : fileStatuses) {
                System.out.println(fileStatus.getPath().getName());
            }
            webHdfsFileSystem.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

代码中实现的逻辑与webhdfs代码一样,将本地run-kafka目录下的所有问题put到HDFS的/fayson1-httpfs目录下,并列出HDFS根目录下的所有文件。

3.将本地hosts配置集群的信息注释掉

4.在Intellij中运行代码,执行结果如下:

5.查看HDFS根目录

HDFS的根目录信息与代码执行结果一致

6.查看/fayson1-httpfs目录文件

/fayson1-httpfs目录文件与本地run-kafka目录内容一致。

5.常见问题


1.使用webhdfs向HDFS put数据时异常,提示:代码块部分可以左右滑动查看噢

代码语言:txt
AI代码解释
复制
log4j:WARN No appenders could be found for logger (org.apache.hadoop.util.Shell).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
http://13.250.102.77:50070
java.net.UnknownHostException: cdh04.fayson.com:50075: cdh04.fayson.com
   at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
   at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
   at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
   at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
   at org.apache.hadoop.hdfs.web.WebHdfsFileSystem$AbstractRunner.runWithRetry(WebHdfsFileSystem.java:693)
   at org.apache.hadoop.hdfs.web.WebHdfsFileSystem$AbstractRunner.access$100(WebHdfsFileSystem.java:519)
   at org.apache.hadoop.hdfs.web.WebHdfsFileSystem$AbstractRunner$1.run(WebHdfsFileSystem.java:549)
   at java.security.AccessController.doPrivileged(Native Method)
   at javax.security.auth.Subject.doAs(Subject.java:422)
   at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1920)
   at org.apache.hadoop.hdfs.web.WebHdfsFileSystem$AbstractRunner.run(WebHdfsFileSystem.java:545)
   at org.apache.hadoop.hdfs.web.WebHdfsFileSystem.create(WebHdfsFileSystem.java:1252)
   at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:925)
   at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:906)
   at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:803)
   at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:368)
   at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:359)
   at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:341)
   at org.apache.hadoop.fs.FileSystem.copyFromLocalFile(FileSystem.java:2057)
   at org.apache.hadoop.fs.FileSystem.copyFromLocalFile(FileSystem.java:2025)
   at org.apache.hadoop.fs.FileSystem.copyFromLocalFile(FileSystem.java:1990)
   at com.cloudera.hdfs.nonekerberos.WebHDFSTest.main(WebHDFSTest.java:31)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
   at java.lang.reflect.Method.invoke(Method.java:483)
   at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

异常原因:由于跨网段向集群put数据,在访问wehdfs接口时重定向到具体DataNode节点时返回的是<hostname>:<port>,本地不能识别DataNode的hostname。

解决方法:将集群所有节点的hostname和外网ip配置到访问节点的hosts文件中

6.总结


  • WebHdfs和HttpFS提供的API接口都可以在集群外的任意节点访问HDFS向集群Put文件及其它操作且不需要加载集群的配置信息(如hdfs-site.xml、core-site.xml等)。
  • WebHdfs访问的限制有集群启用了高可用则必须访问Active状态的NameNode才可以访问HDFS。
  • WebHdfs使用的是重定向的方式,访问具体的数据目录或其它操作时会重定向到集群的一个数据节点,这时就需要确保执行访问的节点和集群中所有的数据节点外网IP及端口是放通的,且需要配置本地hosts文件。比如Fayson在本文中使用的是AWS中DataNode的外网IP和hostname配置在本地。
  • HttpFS提供的是一个独立的服务,在访问HDFS时只需要确保执行访问的节点和HttpFS服务所在节点的网络和端口是通的即可。
  • 使用HttpFS访问HDFS时不需要考虑集群是否是高可用状态。

关于更多webhdfs的操作可以参考官网文档:http://hadoop.apache.org/docs/r1.0.4/webhdfs.html#CREATE

github地址:

https://github.com/fayson/cdhproject/blob/master/hdfsdemo/src/main/java/com/cloudera/hdfs/nonekerberos/HttpFSDemo.java

https://github.com/fayson/cdhproject/blob/master/hdfsdemo/src/main/java/com/cloudera/hdfs/nonekerberos/WebHDFSTest.java

为天地立心,为生民立命,为往圣继绝学,为万世开太平。

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-12-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Hadoop实操 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
0692-5.16.1-外部客户端跨网段访问Hadoop集群方式(续)
在生产环境的CDH集群中,为了分开集群对网络的使用会为集群配备两套网络(管理网段和数据网段),数据网段主要用于集群内部数据交换,一般使用万兆网络以确保集群内数据传输性能,管理网段主要用于集群管理,一般使用千兆网络。一般情况下在集群外进行集群管理和数据传输的都是通过千兆网络进行交互,在集群外是无法直接访问集群内的万兆网络。
Fayson
2019/08/28
2.5K0
0692-5.16.1-外部客户端跨网段访问Hadoop集群方式(续)
如何使用Java代码访问HDFS.docx
在开发Hadoop应用时,需要用到hadoop-client API来访问HDFS并进行本地调试。本篇文章则主要讲述如何使用Java代码访问Kerberos和非Kerberos环境下HDFS服务。
Fayson
2018/03/29
1.9K0
如何使用Java代码访问HDFS.docx
《HDFS的使用教程》---大数据系列
HDFS即Hadoop分布式文件系统(Hadoop Distributed Filesystem),以流式数据访问模式来存储超大文件,运行于商用硬件集群上,是管理网络中跨多台计算机存储的文件系统。
用户3467126
2019/07/03
1.2K0
如何为HttpFS服务配置SSL
前面Fayson也介绍过《如何在集群外节点跨网段向HDFS写数据》和《如何使用Java代码访问HDFS》。在非Kerberos的环境中,使用HttpFS是不需要输入用户密码的,为了集群数据安全考虑可以考虑配置HttpFS的SSL。本篇文章主要介绍如何为HttpFS服务配置SSL。但Fayson依旧建议在开启HttpFS服务的集群里必须开启Kerberos。
Fayson
2018/03/29
1.3K0
Java操作HDFS开发环境搭建以及HDFS的读写流程
在之前我们已经介绍了如何在Linux上进行HDFS伪分布式环境的搭建,也介绍了hdfs中一些常用的命令。但是要如何在代码层面进行操作呢?这是本节将要介绍的内容:
端碗吹水
2020/09/23
2.1K0
Java操作HDFS开发环境搭建以及HDFS的读写流程
大数据-HDFS的API操作
由于 Hadoop 擅长存储大文件,因为大文件的元数据信息比较少,如果 Hadoop集群当中有大量的小文件,那么每个小文件都需要维护一份元数据信息,会大大的增加集群管理元数据的内存压力,所以在实际工作当中,如果有必要一定要将小文件合并成大文件进行一起处理
cwl_java
2019/12/25
4710
如何使用Scala代码访问Kerberos环境的HDFS
前面Fayson介绍了《如何使用Java API访问HDFS为目录设置配额》,随着开发语言的多样性,也有基于Scala语言进行开发,本篇文章主要介绍如何使用Scala代码访问Kerberos环境的HDFS。
Fayson
2018/11/16
2K0
如何使用Java API访问HDFS为目录设置配额
温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。 Fayson的github: https://github.com/fayson/cdhproject 提示:代码块部分可以左右滑动查看噢 1.文档编写目的 ---- 在开发应用使用Hadoop提供的hadoop-client API来访问HDFS并进行本地调试,本篇文章Fayson主要介绍如何使用Java API访问Kerberos环境下的HDFS并为目录设置配额。 内容概述 1.环境准备 2.Kerberos环境为HDFS目录设置配额 3.
Fayson
2018/07/12
3.7K0
【快速入门大数据】hadoop和它的hdfs、yarn、mapreduce
技术架构挑战 量大,无法用结构化数据库,关系型数据库 经典数据库没有考虑数据多类别 比如json 实时性的技术挑战 网络架构、数据中心、运维挑战
瑞新
2021/12/06
9100
【快速入门大数据】hadoop和它的hdfs、yarn、mapreduce
如何在CDH实现HDFS透明加密
在前面文章Fayson介绍过《什么是HDFS透明加密》,要实现HDFS的透明加密,首先你需要一个KMS,KMS可以用CDH自带的Java KeyStore KMS也可以使用企业版工具Navigator。这里我们首先演示基础的Java KeyStore KMS,Fayson会在后面的文章介绍Navigator KMS以及Key Trustee Server。Java KeyStore KMS保存秘钥文件到本地,提供简单的密码保护。Cloudera不建议生产系统使用Java KeyStore KMS。
Fayson
2018/03/29
1.9K0
如何在CDH实现HDFS透明加密
Hadoop(八)Java程序访问HDFS集群中数据块与查看文件系统
前言   我们知道HDFS集群中,所有的文件都是存放在DN的数据块中的。那我们该怎么去查看数据块的相关属性的呢?这就是我今天分享的内容了 一、HDFS中数据块概述 1.1、HDFS集群中数据块存放位置   我们知道hadoop集群遵循的是主/从的架构,namenode很多时候都不作为文件的读写操作,只负责任务的调度和掌握数据块在哪些datanode的分布,   保存的是一些数据结构,是namespace或者类似索引之类的东西,真正的数据存储和对数据的读写是发生在datanode里的。   找到${HADOO
用户1195962
2018/01/18
1.2K0
Hadoop(八)Java程序访问HDFS集群中数据块与查看文件系统
Spark2Streaming读Kerberos环境的Kafka并写数据到HDFS
在前面的文章Fayson介绍了一些关于Spark2Streaming的示例如《Spark2Streaming读Kerberos环境的Kafka并写数据到HBase》、《Spark2Streaming读Kerberos环境的Kafka并写数据到Kudu》及《Spark2Streaming读Kerberos环境的Kafka并写数据到Hive》,本篇文章Fayson主要介绍如何使用Spark2Streaming访问Kerberos环境的Kafka并将接收到的Kafka数据逐条写入HDFS。
Fayson
2018/08/03
1.4K0
Spark2Streaming读Kerberos环境的Kafka并写数据到HDFS
HDFS分布式文件系统01-HDFS JAVA操作与联邦机制
使学生了解文件系统的分类,能够描述不同文件系统的特点 使学生熟悉HDFS架构,能够描述HDFS架构的主要组件及其作用 使学生了解HDFS的特点,能够简述HDFS的特点 使学生掌握HDFS的文件读写原理,能够叙述HDFS读写文件的流程 使学生熟悉HDFS的健壮性,能够叙述HDFS心跳机制、副本机制和负载均衡等策略 使学生掌握HDFS的Shell操作,能够灵活运用HDFS Shell命令操作HDFS 使学生掌握HDFS的Java API操作,能够灵活使用Java API编写应用程序操作HDFS 使学生熟悉Federation机制,能够描述Federation机制的结构、特点并实现Federation机制。 使学生了解Erasure Coding,能够简述Erasure Coding节省存储空间的原理
用户2225445
2024/09/25
2120
HDFS分布式文件系统01-HDFS JAVA操作与联邦机制
0554-6.1.0-同一java进程中同时访问认证和非认证集群的问题(续)
Fayson在前面的文章《0553-6.1.0-如何使用Java代码同时访问安全和非安全CDH集群》,本篇文章介绍在同一Java进程中,通过多线程同时访问Kerberos认证集群和非认证集群时出现的一些异常及解决方法。
Fayson
2019/11/28
2.2K0
HDFS的javaAPI操作(10)
在之前的博客《HDFS的shell常用命令大全》中,小菌为大家分享的是在linux系统的命令行上通过shell命令操作HDFS。而本篇博客,小菌为大家带来的则是在java的环境下,用JavaAPI操作HDFS!学过Java的小伙伴们是不是感觉很nice(`・ω・´)~
大数据梦想家
2021/01/22
5170
HDFS的javaAPI操作(10)
【HDFS】Java_API使用
首先完成Java开发环境准备,创建工程并导入开发所需的Jar包。之后在准备好的工程中完成以下步骤。
十里桃花舞丶
2021/09/10
4660
如何使用Oozie API接口向Kerberos环境的CDH集群提交Spark2作业
前面Fayson介绍了多种方式在CDH集群外的节点向集群提交Spark作业,文章中均采用Spark1来做为示例,本篇文章主要介绍如何是用Oozie API向Kerberos环境的CDH集群提交Spark2作业。
Fayson
2018/03/30
3.4K0
2021年大数据Hadoop(十二):HDFS的API操作
HDFS在生产应用中主要是客户端的开发,其核心步骤是从HDFS提供的api中构造一个HDFS的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS上的文件。
Lansonli
2021/10/11
1.2K0
如何使用Oozie API接口向非Kerberos环境的CDH集群提交Java作业
前面Fayson介绍了《如何使用Oozie API接口向非Kerberos环境的CDH集群提交Spark作业》,本篇文章主要介绍如何使用Oozie Client API向非Kerberos环境的CDH集群提交Java作业。
Fayson
2018/03/30
1.1K0
如何使用Oozie API接口向非Kerberos环境的CDH集群提交Spark作业
在CDH集群外的节点向集群提交Spark作业的方式有多种,前面Fayson介绍了Livy相关的文章主要描述如何在集群外节点通过RESTful API接口向CDH集群提交Spark作业,本篇文章我们借助于oozie-client的API接口向非Kerberos集群提交Spark作业。
Fayson
2018/03/30
1.5K0
推荐阅读
相关推荐
0692-5.16.1-外部客户端跨网段访问Hadoop集群方式(续)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档