Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【详解】Netty做集群channel共享方案

【详解】Netty做集群channel共享方案

原创
作者头像
大盘鸡拌面
发布于 2025-04-24 09:24:50
发布于 2025-04-24 09:24:50
21200
代码可运行
举报
运行总次数:0
代码可运行

Netty做集群Channel共享方案

在分布式系统中,服务之间的通信是一个非常重要的环节。Netty作为一款高性能的异步事件驱动的网络应用程序框架,被广泛应用于构建高性能的服务端应用。然而,在集群环境下,如何实现Channel的共享,确保消息能够正确地路由到目标节点,是开发者需要解决的一个关键问题。

本文将探讨如何在Netty集群中实现Channel的共享,并提供一个简单的示例来说明其实现方法。

1. 需求背景

在传统的单机应用中,客户端和服务端之间的连接通过Channel进行数据交换,这些Channel通常由服务端管理。但在集群环境中,由于服务可能部署在多个节点上,客户端的请求可能会被路由到不同的服务节点。这就要求服务端能够跨节点共享Channel信息,以便在后续的通信中能够准确地找到对应的客户端连接。

2. 方案设计

2.1 使用分布式缓存

为了在Netty集群中实现Channel的共享,可以利用分布式缓存(如Redis、Hazelcast等)来存储和管理Channel信息。每个服务节点在建立与客户端的连接时,都将Channel的相关信息(如ChannelId、远程地址等)注册到分布式缓存中。当需要向特定客户端发送消息时,可以通过查询分布式缓存获取到该客户端的Channel信息,从而实现消息的精准发送。

2.2 Channel信息结构

假设我们需要存储的Channel信息包括​​ChannelId​​、​​RemoteAddress​​和​​NodeAddress​​(表示当前处理该Channel的服务节点地址),可以定义如下结构:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ChannelInfo {
    private String channelId;
    private String remoteAddress;
    private String nodeAddress;

    // Getters and Setters
}
2.3 注册与查询
  • 注册:每当有新的客户端连接时,服务节点将Channel信息注册到分布式缓存。
  • 查询:当需要向某个客户端发送消息时,从分布式缓存中查询该客户端的Channel信息。

3. 实现步骤

3.1 引入依赖

首先,确保你的项目中引入了Netty和分布式缓存相关的依赖。例如,如果使用Redis作为分布式缓存,可以在Maven项目的​​pom.xml​​文件中添加以下依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependencies>
    <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-all</artifactId>
        <version>4.1.68.Final</version>
    </dependency>
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>3.7.0</version>
    </dependency>
</dependencies>
3.2 编写Channel注册逻辑

在Netty的服务端处理器中,重写​​channelActive​​方法,当一个新的客户端连接建立时,将Channel信息注册到Redis中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import redis.clients.jedis.Jedis;

public class MyServerHandler extends SimpleChannelInboundHandler<String> {

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        super.channelActive(ctx);
        String channelId = ctx.channel().id().asLongText();
        String remoteAddress = ctx.channel().remoteAddress().toString();
        String nodeAddress = "node1"; // 假设当前节点为node1

        try (Jedis jedis = new Jedis("localhost", 6379)) {
            ChannelInfo channelInfo = new ChannelInfo(channelId, remoteAddress, nodeAddress);
            jedis.set(channelId, channelInfo.toString());
        }
    }

    // 其他处理逻辑...
}
3.3 编写Channel查询逻辑

当需要向特定客户端发送消息时,可以从Redis中查询Channel信息,并通过Netty的Channel对象发送消息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void sendMessageToClient(String channelId, String message) {
    try (Jedis jedis = new Jedis("localhost", 6379)) {
        String channelInfoStr = jedis.get(channelId);
        if (channelInfoStr != null) {
            ChannelInfo channelInfo = ChannelInfo.fromString(channelInfoStr);
            // 假设已经有一个ChannelGroup管理所有活动的Channel
            ChannelGroup channelGroup = ...;
            channelGroup.find(channelId).writeAndFlush(message);
        }
    }
}

通过上述方案,我们可以在Netty集群中实现Channel的共享,确保消息能够正确地路由到目标节点。这种方法不仅提高了系统的可扩展性和可用性,还简化了跨节点通信的复杂度。当然,实际应用中还需要考虑更多的细节,比如Channel的生命周期管理、异常处理等。

技术栈
  • Netty:用于构建网络服务。
  • Redis:作为共享存储,用于存储和检索 Channel 信息。
  • JedisJava 客户端库,用于与 Redis 交互。
环境准备
  1. 安装 Redis:确保你已经安装并运行了 Redis 服务器
  2. 添加依赖:在你的项目中添加 Netty 和 Jedis 的依赖。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!-- Maven 依赖 -->
<dependencies>
    <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-all</artifactId>
        <version>4.1.68.Final</version>
    </dependency>
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>3.7.0</version>
    </dependency>
</dependencies>
示例代码
1. RedisUtil 类

用于与 Redis 进行交互,存储和检索 Channel 信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class RedisUtil {
    private static final JedisPool pool;

    static {
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(100);
        config.setMaxIdle(50);
        config.setMinIdle(10);
        pool = new JedisPool(config, "localhost", 6379);
    }

    public static Jedis getResource() {
        return pool.getResource();
    }

    public static void returnResource(Jedis jedis) {
        if (jedis != null) {
            jedis.close();
        }
    }

    public static void setChannel(String key, String value) {
        try (Jedis jedis = getResource()) {
            jedis.set(key, value);
        }
    }

    public static String getChannel(String key) {
        try (Jedis jedis = getResource()) {
            return jedis.get(key);
        }
    }
}
2. ChannelHandler 类

处理连接和消息的逻辑,并将 Channel 信息存储到 Redis 中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;

public class ChannelHandler extends SimpleChannelInboundHandler<FullHttpRequest> {

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, FullHttpRequest msg) throws Exception {
        // 处理请求
        System.out.println("Received request: " + msg.uri());

        // 将 Channel 信息存储到 Redis 中
        String channelId = ctx.channel().id().asLongText();
        RedisUtil.setChannel(channelId, ctx.channel().remoteAddress().toString());

        // 发送响应
        ctx.writeAndFlush(msg.createResponse(HttpResponseStatus.OK));
    }

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        // 当连接建立时,将 Channel 信息存储到 Redis 中
        String channelId = ctx.channel().id().asLongText();
        RedisUtil.setChannel(channelId, ctx.channel().remoteAddress().toString());
        System.out.println("Channel active: " + channelId);
    }

    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        // 当连接断开时,从 Redis 中删除 Channel 信息
        String channelId = ctx.channel().id().asLongText();
        RedisUtil.getChannel(channelId);
        System.out.println("Channel inactive: " + channelId);
    }
}
3. ServerBootstrap 配置

启动 Netty 服务器,并注册 ChannelHandler。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;

public class NettyServer {
    public static void main(String[] args) throws InterruptedException {
        EventLoopGroup bossGroup = new NioEventLoopGroup(1);
        EventLoopGroup workerGroup = new NioEventLoopGroup();

        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        public void initChannel(SocketChannel ch) throws Exception {
                            ch.pipeline().addLast(new HttpServerCodec());
                            ch.pipeline().addLast(new HttpObjectAggregator(65536));
                            ch.pipeline().addLast(new ChannelHandler());
                        }
                    });

            ChannelFuture f = b.bind(8080).sync();
            f.channel().closeFuture().sync();
        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
}
说明
  1. RedisUtil:提供与 Redis 交互的方法,用于存储和检索 Channel 信息。
  2. ChannelHandler:处理连接和消息的逻辑,并将 Channel 信息存储到 Redis 中。
  3. NettyServer:启动 Netty 服务器,并注册 ChannelHandler。

通过这种方式,你可以实现多个 Netty 服务实例之间的 Channel 共享,从而实现负载均衡和高可用性。Netty 是一个高性能的异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端。在实现集群中的 Channel 共享时,通常涉及到如何在多个节点之间同步和共享连接信息(如 Channel)。这种需求常见于负载均衡、会话保持等场景。

以下是一个基于 Netty 实现的简单集群 Channel 共享方案的示例,主要通过使用 Redis 作为消息队列来同步 Channel 信息。这个例子假设你已经有一个基本的 Netty 应用程序,并且想要在多个节点间共享 Channel。

1. 添加依赖

首先,在你的项目中添加必要的依赖,包括 Netty 和 Jedis(用于与 Redis 交互):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependencies>
    <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-all</artifactId>
        <version>4.1.68.Final</version>
    </dependency>
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>3.7.0</version>
    </dependency>
</dependencies>
2. 创建 Redis 客户端工具类

创建一个简单的 Redis 客户端工具类,用于发布和订阅消息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class RedisClient {
    private static final String CHANNEL_NAME = "channel:shared";
    private JedisPool pool;

    public RedisClient(String host, int port) {
        JedisPoolConfig config = new JedisPoolConfig();
        pool = new JedisPool(config, host, port);
    }

    public void publish(String message) {
        try (Jedis jedis = pool.getResource()) {
            jedis.publish(CHANNEL_NAME, message);
        }
    }

    public void subscribe(RedisMessageListener listener) {
        new Thread(() -> {
            try (Jedis jedis = pool.getResource()) {
                jedis.subscribe(listener, CHANNEL_NAME);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }).start();
    }
}
3. 创建 Redis 消息监听器

创建一个实现了 ​​JedisPubSub​​ 接口的消息监听器,当接收到新的 Channel 信息时,可以将其添加到本地缓存或处理:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import redis.clients.jedis.JedisPubSub;

public class RedisMessageListener extends JedisPubSub {
    @Override
    public void onMessage(String channel, String message) {
        System.out.println("Received message from channel " + channel + ": " + message);
        // 这里可以将消息解析为 Channel 信息,并进行相应的处理
        handleChannelMessage(message);
    }

    private void handleChannelMessage(String message) {
        // 解析消息并处理 Channel 信息
    }
}
4. 在 Netty 服务器中集成 Redis

在 Netty 服务器中,当一个新的连接建立时,将 Channel 信息发送给其他节点,并订阅来自其他节点的消息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;

public class NettyServer {
    private final RedisClient redisClient;

    public NettyServer(RedisClient redisClient) {
        this.redisClient = redisClient;
    }

    public void start(int port) throws Exception {
        EventLoopGroup bossGroup = new NioEventLoopGroup(1);
        EventLoopGroup workerGroup = new NioEventLoopGroup();

        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        public void initChannel(SocketChannel ch) throws Exception {
                            ch.pipeline().addLast(new MyChannelHandler(redisClient));
                        }
                    })
                    .option(ChannelOption.SO_BACKLOG, 128)
                    .childOption(ChannelOption.SO_KEEPALIVE, true);

            ChannelFuture f = b.bind(port).sync();
            f.channel().closeFuture().sync();
        } finally {
            workerGroup.shutdownGracefully();
            bossGroup.shutdownGracefully();
        }
    }

    public static void main(String[] args) throws Exception {
        RedisClient redisClient = new RedisClient("localhost", 6379);
        NettyServer server = new NettyServer(redisClient);
        server.start(8080);
    }
}
5. 自定义 ChannelHandler

创建一个自定义的 ​​ChannelHandler​​,在这个处理器中,当一个新的连接建立时,将 Channel 信息发送给其他节点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;

public class MyChannelHandler extends SimpleChannelInboundHandler<String> {
    private final RedisClient redisClient;

    public MyChannelHandler(RedisClient redisClient) {
        this.redisClient = redisClient;
    }

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        String channelId = ctx.channel().id().asLongText();
        redisClient.publish(channelId);
        super.channelActive(ctx);
    }

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
        // 处理接收到的消息
    }
}
6. 启动服务

启动 Netty 服务器,确保每个节点都订阅了 Redis 频道,这样当有新的连接时,所有节点都能接收到通知,并根据需要处理这些 Channel 信息。

以上就是一个简单的基于 Netty 和 Redis 实现的集群 Channel 共享方案。实际应用中可能需要考虑更多的细节,例如错误处理、消息格式化、安全性等。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
hadoop 面试题收集及个人答案整理
1、简要描述如何安装配置一个apache开源版hadoop,描述即可,列出步骤更好
全栈程序员站长
2022/09/07
1K0
Hadoop极简入门
其实Hadoop诞生至今已经十多年了,网络上也充斥着关于Hadoop相关知识的的海量资源。但是,有时还是会使刚刚接触大数据领域的童鞋分不清hadoop、hdfs、Yarn和MapReduce等等技术词汇。
王知无-import_bigdata
2019/04/24
7910
Hadoop极简入门
Hadoop
  hadoop2.x core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml slaves
挽风
2023/10/17
3480
Hadoop
Hadoop 超燃之路
以前的存储手段跟分析方法现在行不通了!Hadoop 就是用来解决海量数据的 存储 跟海量数据的 分析计算 问题的,创始人 Doug Cutting 在创建 Hadoop 时主要思想源头是 Google 三辆马车
sowhat1412
2022/09/20
5630
Hadoop 超燃之路
五万字 | 耗时一个月,整理出这份Hadoop吐血宝典
一、HDFS 二、MapReduce 三、Yarn 四、Hadoop3.x 新特性 五、Hadoop 大厂面试真题解析
五分钟学大数据
2021/10/26
1.7K0
最新Hadoop的面试题总结
  1)Zookeeper:是一个开源的分布式应用程序协调服务,基于zookeeper可以实现同步服务,配置维护,命名服务。   2)Flume:一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。   3)Hbase:是一个分布式的、面向列的开源数据库, 利用Hadoop HDFS作为其存储系统。   4)Hive:基于Hadoop的一个数据仓库工具,可以将结构化的数据档映射为一张数据库表,并提供简单的sql 查询功能,可以将sql语句转换为MapReduce任务进行运行。   5)Sqoop:将一个关系型数据库中的数据导进到Hadoop的 HDFS中,也可以将HDFS的数据导进到关系型数据库中。
大数据老哥
2021/03/05
6.1K0
Hadoop大数据技术课程总结2021-2022学年第1学期
数据量大Volume 第一个特征是数据量大。大数据的起始计量单位可以达到P(1000个T)、E(100万个T)或Z(10亿个T)级别。 类型繁多(Variety) 第二个特征是数据类型繁多。包括网络日志、音频、视频、图片、地理位置信息等等,多类型的数据对数据的处理能力提出了更高的要求。 价值密度低(Value) 第三个特征是数据价值密度相对较低。如随着物联网的广泛应用,信息感知无处不在,信息海量,但价值密度较低,如何通过强大的机器算法更迅速地完成数据的价值"提纯",是大数据时代亟待解决的难题。 速度快、时效高(Velocity) 第四个特征是处理速度快,时效性要求高。这是大数据区分于传统数据挖掘最显著的特征。既有的技术架构和路线,已经无法高效处理如此海量的数据,而对于相关组织来说,如果投入巨大采集的信息无法通过及时处理反馈有效信息,那将是得不偿失的。可以说,大数据时代对人类的数据驾驭能力提出了新的挑战,也为人们获得更为深刻、全面的洞察能力提供了前所未有的空间与潜力。
IT从业者张某某
2022/11/12
5950
Hadoop大数据技术课程总结2021-2022学年第1学期
Hadoop快速入门
传说中的Hadoop,我终于来对着你唱"征服"了,好可爱的小象,!J 总的来说,hadoop的思路比较简单(map-reduce),就是将任务分开进行,最后汇总。但这个思路实现起来,比较复杂,但相对于几年前Intel等硬件公司提出的网格运算等方式,显得更加开放。 你难任你难,哥就是头铁! Tip:实践应用是核心,本文概念为主,有些部分可能会有些晦涩,直接跳过就好(不是特别重要)。 本文代码实践在:https://github.com/wanliwang/cayman/tree/master/cm-we
用户1216676
2018/01/24
1.7K0
hadoop_入门1
该文介绍了如何使用 Hadoop 进行单词计数和排序。首先介绍了 Hadoop 的整体架构,然后详细讲解了如何使用 Hadoop 进行单词计数和排序。最后,通过一个实例展示了如何使用 Hadoop 进行排序操作。
用户1147754
2018/01/03
6390
hadoop_入门1
2021最全大数据面试题汇总---hadoop篇,附答案!
1)Zookeeper:是一个开源的分布式应用程序协调服务,基于zookeeper可以实现同步服务,配置维护,命名服务。 2)Flume:一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。 3)Hbase:是一个分布式的、面向列的开源数据库, 利用Hadoop HDFS作为其存储系统。 4)Hive:基于Hadoop的一个数据仓库工具,可以将结构化的数据档映射为一张数据库表,并提供简单的sql 查询功能,可以将sql语句转换为MapReduce任务进行运行。 5)Sqoop:将一个关系型数据库中的数据导进到Hadoop的 HDFS中,也可以将HDFS的数据导进到关系型数据库中。
大数据小禅
2021/08/16
4.6K0
Hadoop面试题汇总-20221031
HDFS提供了一个高效的缓存加速机制—— Centralized Cache Management ,它允许用户指定要缓存的HDFS路径。NameNode会和保存着所需Block数据的所有DataNode通信,并指导它们把块数据缓存在堆外内存(off-heap)中进行缓存。DataNode会通过心跳机制向NameNode汇报缓存状态。
十里桃花舞丶
2022/11/14
7840
Hadoop面试题汇总-20221031
Hadoop阅读笔记(一)——强大的MapReduce
该文摘要总结:通过Hadoop命令行工具进行格式化读取文本文件并输出到控制台,同时通过Java代码实现MapReduce作业,将文本文件内容按行进行分割,对每一行进行统计,并输出到控制台。
JackieZheng
2018/01/08
8260
Hadoop阅读笔记(一)——强大的MapReduce
最新Hive/Hadoop高频面试点小集合
如果其中有一张表为小表,直接使用map端join的方式(map端加载小表)进行聚合。
王知无-import_bigdata
2021/04/21
1.1K0
最新Hive/Hadoop高频面试点小集合
hadoop大数据面试题
以下资料来源于互联网,很多都是面试者们去面试的时候遇到的问题,我对其中有的问题做了稍许的修改了回答了部分空白的问题,其中里面有些考题出的的确不是很好,但是也不乏有很好的题目,这些都是基于真实的面试来的,希望对即将去面试或向继续学习hadoop,大数据等的朋友有帮助!
风火数据
2018/08/26
1.8K0
hadoop大数据面试题
大数据面试题整理
JAVA相关 1-1)List 与set 的区别? 老掉牙的问题了,还在这里老生常谈:List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复。 1-2)数据库的三大范式? 原子性、一致性、唯一性 1-3)java 的io类的图解 1-4)对象与引用对象的区别 对象就是好没有初始化的对象,引用对象即使对这个对象进行了初始化,这个初始化可以使自己的直接new的也可以是直接其他的赋值的,那么背new或者背其他赋值的我们叫做是引用对象,最大的区别于 1-5)谈谈你对反射机制的理解及其
闵开慧
2018/04/02
6.6K1
什么是Hadoop?请简要解释其架构和组件。
Hadoop是一个开源的分布式计算框架,用于处理和存储大规模数据集。它的设计目标是在廉价的硬件上提供高容错性,并且能够处理大量的数据。Hadoop的架构由两个核心组件组成:Hadoop Distributed File System(HDFS)和MapReduce。
GeekLiHua
2025/01/21
1620
进击大数据系列(六):Hadoop 分布式计算框架 MapReduce
MapReduce 是一种编程模型(没有集群的概念,会把任务提交到 yarn 集群上跑),用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和"Reduce(归约)",是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。
民工哥
2023/08/22
1.2K0
进击大数据系列(六):Hadoop 分布式计算框架 MapReduce
大数据面试秘诀:30道hadoop面试真题和解析
近年来,大数据概念被炒的非常热,大数据公司也在快速的崛起,而人才的需求也越来越多。对于正在找大数据相关工作的同学们来说,面试时遇到什么问题才是他们最关心的。在下文中,本文专门搜集了86道hadoop面试时出现过的题目,希望助同学们面试一臂之力。
挖掘大数据
2018/01/11
8500
【硬刚大数据之面试篇】2021年从零到大数据专家面试篇之Hadoop/HDFS/Yarn篇
2021年初的时候,关于Hadoop要退休淘汰的PR文章甚嚣尘上。其中MapReduce思想最为人所诟病,因为其并不友好的写代码方式,高昂的维护成本以及较差的运行效率。
大数据真好玩
2021/09/18
6680
【硬刚大数据之面试篇】2021年从零到大数据专家面试篇之Hadoop/HDFS/Yarn篇
2022年Hadoop面试题最全整理,两万字干货分享【建议收藏】
Hadoop 中常问的就三块,第一:分布式存储(HDFS);第二:分布式计算框架(MapReduce);第三:资源调度框架(YARN)。
Maynor
2023/02/01
1.2K0
推荐阅读
相关推荐
hadoop 面试题收集及个人答案整理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验