ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

本地IDEA访问ECS服务器HDFS

2020-07-05 11:03:14  阅读:317  来源: 互联网

标签:HDFS IP 端口 IDEA hadoop ECS 3.1 apache org


原本是配置了阿里云ECS服务器,但是用终端vim修改调试代码,总是会不方便。
后面想到有两种解决办法:

  • 用本地IDEA调试代码,然后直接连接服务器的HDFS等端口,直接调试
  • 用本地IDEA调试代码,然后打包,发到服务器上进行运行(伟敬想的)

下面是IDEA访问服务器hadoop的一个测试,以及遇到的问题和解决方法。

Maven添加Hadoop依赖

通过调查,没有使用MapReduce的话,只要添加hadoop-common,hadoop-client和hadoop-hdfs这三个。由于我服务器上的Hadoop是3.1.3版本的,Maven依赖如下:
大家可以到这个网址找需要的Jar包的Maven依赖
https://mvnrepository.com/tags/hadoop

<dependencies>
        <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>3.1.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>3.1.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>3.1.3</version>
        </dependency>
    </dependencies>

这里没有添加hadoop-core,版本最新是1.2.1,这是因为Hadoop2.x后就没有使用这个包了,而是以其他一些依赖包来代替其功能。

依赖下载失败

如果有报java.lang.NoClassDefFoundError: com/ctc/wstx/io/InputBootstrapper是依赖包不全的原因,需要更换仓库下载依赖包。

使用IDEA下载这些依赖,一直是红色,没下载下来。后面通过添加别的仓库来解决这个问题,在pom.xml上添加以下字段:

<repositories>
    <repository>
        <id>alimaven</id>
        <name>Maven Aliyun Mirror</name>
        <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

如果有使用到MapReduce

通过调查,如果使用了MapReduce,要添加以下依赖:

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-mapreduce-client-core</artifactId>
    <version>3.1.3</version>
</dependency>
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-mapreduce-client-common</artifactId>
    <version>3.1.3</version>
</dependency>
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-mapreduce-client-jobclient</artifactId>
    <version>3.1.3</version>
</dependency>

如果有使用到Yarn

<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-yarn-api -->
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-yarn-api</artifactId>
    <version>3.1.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-yarn-common -->
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-yarn-common</artifactId>
    <version>3.1.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-yarn-client -->
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-yarn-client</artifactId>
    <version>3.1.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-yarn-server-common -->
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-yarn-server-common</artifactId>
    <version>3.1.3</version>
</dependency>

查看HDFS上是否存在test.txt文件

需要修改hadoop的core-site.xml

在hadoop/etc/hadoop/下有一个core-site.xml文件。这里我原本设置的是localhost:9000,本地单机。但这就造成了我访问失败。出现以下错误信息。

java.net.ConnectException: Call From xxx to 公网ip:9000 failed on connection exception: java.net.ConnectException: Connection refused

这里是连接不上,就很奇怪。调查后,发现需要修改core.site文件。

将hdfs://localhost:9000改为hdfs://内网ip:9000
或者
将hdfs://localhost:9000改为hdfs://0.0.0.0:9000

https://blog.csdn.net/k393393/article/details/91869501

0.0.0.0表示当前局域网的所有地址。这里修改后,访问成功,自己也产生了一个疑问。在随笔最后面,希望您能看一下。

代码

这里的filename是文件所在路径及文件名,fs.defaultFS设置的是服务器ip:端口。运行即可访问。

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class fileexist {
    public static void main(String[] args) {
        try {
            String filename = "/user/hadoop/test.txt";

            Configuration conf = new Configuration();
            conf.set("fs.defaultFS","hdfs://121.199.54.82:9000");
            conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
            FileSystem fs = FileSystem.get(conf);
            if(fs.exists(new Path(filename))){
                System.out.println("文件存在");
            }else{
                System.out.println("文件不存在");
            }
            fs.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

关于阿里云公网、私网、端口的一个问题

欢迎您指教,指出我不对的地方或者没有考虑到的地方。

问题

我在IDEA访问的是公网IP:端口,也就是访问阿里云给我面向外部的网络。而我却通过公网IP:端口访问到了私网IP:端口。

这里我就疑惑了,因为我没有在阿里云设置公网IP和私网IP之间的端口映射。我理解私网为公网的一个局域网,通过NAT协议(这里可能理解错误)。可以通过公网IP访问私网IP,但是为什么公网IP:9000就是私网IP的9000端口呢?

如果这个局域网中有多个IP,那岂不是会造成端口冲突?我是觉得应该是有一个设置,来修改公网IP端口和私网IP端口的映射。或者说这个局域网就一个私网IP,就不会有端口冲突,那这又造成了IP地址的浪费,越想越觉得自己网络学的差劲,需要重新翻书了。

我在调查中发现了以下几篇文章,但没能很好解决自己的疑问。
https://blog.csdn.net/wangxiaai/article/details/104885013
https://ask.csdn.net/questions/1058767?sort=id

标签:HDFS,IP,端口,IDEA,hadoop,ECS,3.1,apache,org
来源: https://www.cnblogs.com/chenshaowei/p/13238132.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有