Hadoop简明教程

news2024/9/24 15:27:24

文章目录

    • 关于Hadoop
    • Hadoop拓扑结构
      • Namenode 和 Datanode
    • 基本管理
      • 启动Hadoop
      • 启动YARN
      • 验证Hadoop服务
      • 停止Hadoop
      • 停止HDFS
    • Hadoop集群搭建步骤
      • 准备阶段
      • Java环境配置
      • Hadoop安装与配置
      • HDFS格式化与启动服务
      • 测试集群
      • 安装额外组件
      • 监控与维护:
    • 使用Docker搭建集群
    • 使用Hadoop读写数据
      • 写入数据到HDFS
      • 读数据
    • 使用Hadoop进行分布式计算

本文帮助大家快速上手Hadoop。

关于Hadoop

Google通过三篇重量级论文为大数据时代提供了三项革命性技术:GFS、MapReduce和BigTable,即所谓的Google大数据的“三驾马车”。

  • GFS(Google File System)是Google面向大规模数据密集型应用的、可伸缩的分布式文件系统,可在廉价的硬件上运行,并具有可靠的容错能力。
  • MapReduce是一种并行编程模式,可以在超大分布式集群上并行运算,对超大规模数据集进行处理。
  • BigTable是在GFS上构建的处理结构化数据的分布式数据库,可以用于处理海量数据的更新和随机查询。
    Hadoop和Hbase是基于这三项技术发展出的开源实现。在大数据分析和处理领域,Hadoop兼容体系已经成为一个非常成熟的生态圈,涵盖了很多大数据相关的基础组件,包括Hadoop、Hbase、Hive、Spark、Flink、Storm、Presto、Impala等。

Hadoop拓扑结构

Namenode 和 Datanode

HDFS采用master/slave架构。一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。Namenode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。集群中的Datanode一般是一个节点一个,负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上。Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录。它也负责确定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求。在Namenode的统一调度下进行数据块的创建、删除和复制。

在这里插入图片描述
Namenode和Datanode被设计成可以在普通的商用机器上运行。这些机器一般运行着GNU/Linux操作系统(OS)。HDFS采用Java语言开发,因此任何支持Java的机器都可以部署Namenode或Datanode。由于采用了可移植性极强的Java语言,使得HDFS可以部署到多种类型的机器上。一个典型的部署场景是一台机器上只运行一个Namenode实例,而集群中的其它机器分别运行一个Datanode实例。这种架构并不排斥在一台机器上运行多个Datanode,只不过这样的情况比较少见。

集群中单一Namenode的结构大大简化了系统的架构。Namenode是所有HDFS元数据的仲裁者和管理者,这样,用户数据永远不会流过Namenode。
在这里插入图片描述

基本管理

Hadoop集群的启动和停止涉及到其多个服务的管理,主要包括HDFS(Hadoop Distributed File System)和YARN(Yet Another Resource Negotiator)。这些服务通常通过位于Hadoop安装目录下的脚本来控制。

启动Hadoop

启动HDFS,打开终端并切换到Hadoop的sbin目录。 运行start-dfs.sh脚本来启动HDFS。这将依次启动NameNode、Secondary NameNode和所有DataNodes(如果是在集群模式下)。

  cd $HADOOP_HOME/sbin
  ./start-dfs.sh

启动YARN

在同一个sbin目录下,运行start-yarn.sh脚本来启动YARN。这将启动ResourceManager和所有NodeManagers。

./start-yarn.sh

验证Hadoop服务

使用jps命令来验证Hadoop服务是否已经启动。

jps

你应该能看到NameNode, DataNode, SecondaryNameNode, ResourceManager, 和 NodeManager 进程。

停止Hadoop

停止YARN,在Hadoop的sbin目录下运行stop-yarn.sh脚本来停止YARN服务。

./stop-yarn.sh

停止HDFS

接着运行stop-dfs.sh脚本来停止HDFS服务。

./stop-dfs.sh

这将依次停止所有DataNodes、Secondary NameNode和NameNode。
全部停止

如果你想一次性停止所有Hadoop服务,可以运行stop-all.sh脚本。

./stop-all.sh

同样地,如果你想一次性启动所有Hadoop服务,可以运行start-all.sh脚本。

./start-all.sh

请注意,这些脚本可能会根据你的Hadoop版本和配置略有不同。在某些情况下,你可能需要使用完整的路径来引用这些脚本,例如$HADOOP_HOME/sbin/start-dfs.sh。

另外,如果你使用的是Hadoop 2.x或更高版本,YARN的启动和停止脚本名可能与上面提到的不同。例如,在Hadoop 2.x中,YARN的启动脚本可能是start-yarn.sh而不是start-mapred.sh。在使用这些脚本之前,请确保你查阅了你的Hadoop版本的官方文档。

Hadoop集群搭建步骤

搭建Hadoop集群涉及多个步骤,具体取决于你的硬件环境、操作系统选择以及Hadoop的版本。以下是一个基于Linux系统的Hadoop集群搭建的基本流程:

准备阶段

环境规划:确定Hadoop集群的规模,包括Master节点和Slave节点的数量,以及它们之间的网络拓扑结构。
硬件准备:确保所有服务器满足Hadoop的要求,如足够的CPU、内存和磁盘空间。
操作系统安装:在所有服务器上安装相同版本的Linux发行版。
SSH无密码登录:配置Master节点到所有其他节点的SSH无密码登录,便于远程管理。
时钟同步:使用NTP或其他工具同步所有节点的系统时间。
关闭防火墙:暂时关闭防火墙以避免网络问题。

Java环境配置

安装Java:在所有节点上安装Java SE Development Kit (JDK),并配置JAVA_HOME环境变量。

Hadoop安装与配置

上传Hadoop:将Hadoop的tar.gz压缩包上传至所有节点的指定目录。
解压Hadoop:在每个节点上解压Hadoop压缩包。
配置Hadoop:编辑Hadoop的核心配置文件,如core-site.xml, hdfs-site.xml, mapred-site.xml, yarn-site.xml等,确保它们指向正确的存储目录和网络配置。
环境变量设置:在所有节点上设置HADOOP_HOME环境变量,并更新.bashrc或.profile以包含Hadoop的bin目录。

HDFS格式化与启动服务

格式化HDFS:在Master节点上执行HDFS格式化命令。
启动Hadoop服务:在Master节点上启动HDFS和YARN服务。

测试集群

测试HDFS:上传一些数据到HDFS并检查是否能够正确读取。
测试MapReduce或YARN:运行一个简单的MapReduce任务或Spark作业,确保集群正常工作。

安装额外组件

安装Hive:如果需要SQL-like查询能力,可以在Hadoop集群上安装Hive。
安装HBase:如果需要NoSQL数据库功能,可以安装HBase。

监控与维护:

安装监控工具:例如使用Ganglia或Nagios监控集群健康状态。
定期维护:包括数据平衡、日志分析和软件升级等。

请注意,具体的配置细节会根据Hadoop的版本和你的具体需求有所不同。如果你正在使用Hadoop 2.x或3.x,某些配置文件的名称可能略有不同,比如mapred-site.xml在Hadoop 2.x中被mapreduce-site.xml所取代。

在实际操作中,你可能需要参考Hadoop官方文档和相关的社区指南来获得最新的配置建议和解决潜在的问题

使用Docker搭建集群

使用Docker搭建Hadoop集群可以简化部署过程,同时提供更好的隔离性和可移植性。以下是一个使用Docker和Docker Compose搭建Hadoop伪分布式环境的步骤:
步骤1: 准备Docker镜像

首先,你需要获取Hadoop的Docker镜像。你可以在Docker Hub上找到预构建的Hadoop镜像,或者自己构建一个。这里假设你使用的是bde2020/hadoop-distrubuted镜像。
步骤2: 编写Docker Compose文件

创建一个docker-compose.yml文件,定义你的Hadoop集群。以下是一个示例文件,用于创建一个包含NameNode、DataNode和JobTracker的伪分布式集群:

version: '3'

services:
  namenode:
    image: bde2020/hadoop-distrubuted:latest
    container_name: hadoop_namenode
    restart: always
    volumes:
      - ./hadoop/namenode:/hadoop/dfs/namenode
    environment:
      SERVICE_PRECONDITION: "datanode:9866 jobtracker:9001"
    ports:
      - "50070:50070"

  datanode:
    image: bde2020/hadoop-distrubuted:latest
    container_name: hadoop_datanode
    restart: always
    volumes:
      - ./hadoop/datanode:/hadoop/dfs/datanode
    ports:
      - "9866:9866"

  jobtracker:
    image: bde2020/hadoop-distrubuted:latest
    container_name: hadoop_jobtracker
    restart: always
    ports:
      - "9001:9001"

  secondarynamenode:
    image: bde2020/hadoop-distrubuted:latest
    container_name: hadoop_secondarynamenode
    restart: always
    volumes:
      - ./hadoop/secondarynamenode:/hadoop/dfs/secondarynamenode
    ports:
      - "50090:50090"

步骤3: 格式化HDFS并启动集群

在你的Docker Compose文件所在的目录下,运行以下命令来格式化HDFS并启动集群:

# 格式化HDFS
docker-compose run --rm namenode /usr/local/bin/hadoop namenode -format

# 启动集群
docker-compose up -d

步骤4: 验证集群

你可以通过访问各个服务的Web UI来验证集群是否正常运行。例如,NameNode的Web UI通常可以通过http://localhost:50070/访问。
步骤5: 使用Hadoop集群

现在,你可以在容器内部或外部运行Hadoop命令,例如上传文件到HDFS或提交MapReduce作业。为了在宿主机上运行Hadoop命令并连接到Docker中的集群,你可能需要配置/.bashrc或/.profile来包含Docker容器中的Hadoop bin目录。

以上步骤描述了一个基础的Hadoop伪分布式集群的搭建过程。对于全分布式集群,你可能需要在多台物理机器上运行Docker,并调整Docker Compose文件以反映你的网络配置。

使用Hadoop读写数据

在Hadoop中,我们通常使用HDFS(Hadoop Distributed File System)进行数据存储,以及MapReduce或Spark进行数据处理。以下是一个使用Java API进行HDFS数据读写的简单示例:

写入数据到HDFS

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

import java.io.FileOutputStream;
import java.io.OutputStream;
import java.net.URI;

public class HDFSWritter {
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(URI.create("hdfs://namenode:9000"), conf, "hdfs");
        
        String file = "/path/to/your/file";
        OutputStream out = fs.create(new Path(file));
        IOUtils.copyBytes("This is some text", 0, 15, out, conf);
        IOUtils.closeStream(out);
        fs.close();
    }
}

读数据

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

import java.io.InputStream;
import java.net.URI;

public class HDFSReader {
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(URI.create("hdfs://namenode:9000"), conf, "hdfs");
        
        String file = "/path/to/your/file";
        InputStream in = fs.open(new Path(file));
        IOUtils.copyBytes(in, System.out, 4096, false);
        IOUtils.closeStream(in);
        fs.close();
    }
}

注意:在上述代码中,“namenode:9000”应替换为你的Hadoop集群的namenode地址和端口,“hdfs”应替换为你的Hadoop集群的用户名,“/path/to/your/file”应替换为你想要读写文件的实际路径。

此外,你还需要在你的项目中添加Hadoop的依赖,例如在Maven的pom.xml中添加:

<dependencies>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>3.2.1</version>
    </dependency>
</dependencies>

使用Hadoop进行分布式计算

在Hadoop中,主要通过MapReduce框架来进行分布式计算。下面是一个使用Java编写的简单WordCount程序的例子,它展示了如何使用Hadoop MapReduce进行分布式计算。
步骤1: 创建Mapper类

import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {

    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        String line = value.toString();
        StringTokenizer tokenizer = new StringTokenizer(line);
        while (tokenizer.hasMoreTokens()) {
            word.set(tokenizer.nextToken());
            context.write(word, one);
        }
    }
}

步骤2: 创建Reducer类

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {

    private IntWritable result = new IntWritable();

    public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int sum = 0;
        for (IntWritable val : values) {
            sum += val.get();
        }
        result.set(sum);
        context.write(key, result);
    }
}

步骤3: 创建Driver类

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class WordCountDriver {

    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf, "word count");
        job.setJarByClass(WordCountDriver.class);
        job.setMapperClass(WordCountMapper.class);
        job.setCombinerClass(WordCountReducer.class);
        job.setReducerClass(WordCountReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

运行程序

首先,你需要将输入文本文件放到HDFS上,然后运行你的MapReduce程序。假设你的输入文件在HDFS上的路径是/user/input,输出路径是/user/output,那么你可以在命令行中使用以下命令运行你的程序:

hadoop jar your-jar-file.jar WordCountDriver /user/input /user/output

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1920844.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL构造一个触发器audit_log

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 构造一个触发…

华为如何做成数字化转型?

目录 企业数字化转型是什么&#xff1f; 华为如何定义数字化转型&#xff1f; 为什么做数字化转型&#xff1f; 怎么做数字化转型&#xff1f; 华为IPD的最佳实践之“金蝶云” 企业数字化转型是什么&#xff1f; 先看一下案例&#xff0c;华为经历了多次战略转型&#xf…

Python数据分析-乳腺癌诊断分析预测

一、研究背景 乳腺癌是全球女性中最常见的癌症之一&#xff0c;发病率和死亡率都处于较高水平。据世界卫生组织&#xff08;WHO&#xff09;统计&#xff0c;乳腺癌每年造成数百万女性的死亡&#xff0c;并且其发病率在许多国家呈上升趋势。乳腺癌的早期诊断对于提高患者的生存…

气膜仓储与传统仓储的成本优势对比—轻空间

随着物流和仓储需求的不断增长&#xff0c;企业对仓储设施的要求也日益提高。传统仓储设施虽然具有一定的优势&#xff0c;但在建设和运营成本上往往较高。近年来&#xff0c;气膜仓储作为一种新型仓储方式&#xff0c;以其独特的优势逐渐受到市场青睐。轻空间将详细探讨气膜仓…

小程序创建与项目初始化(构建 npm + 集成 Sass)

一、打开微信开发者工具 确认 左侧导航栏是否选中的 小程序点击 【】创建小程序 二、创建小程序 三、初始化 清空 app.wxss、app.js 去掉 rendererOptions 和 componentFramework 不需要最新的搜索引擎 留下以下文件 四、自定义构建 npm 集成 Sass 首先 先把小程序源…

如何使用Python正则表达式解析多行文本

使用 Python 的正则表达式来解析多行文本通常涉及到使用多行模式&#xff08;re.MULTILINE&#xff09;和 re.DOTALL 标志&#xff0c;以及适当的正则表达式模式来匹配你想要提取或处理的文本块。以下是一个简单的示例&#xff0c;展示了如何处理多行文本&#xff1a; 1、问题背…

maven编码报错

maven 编译的时候编码报错&#xff1a; classworlds For input string: "ㄻ孛孛"报错原因&#xff1a; maven 编码使用的是UTF-16 &#xff0c;系统中使用UFT-8 解决办法&#xff1a; 如下设置为UTF-8

SSM社区物业管理系统-计算机毕业设计源码91276

摘要 随着城市化进程的加快&#xff0c;居民社区的规模和数量不断增长&#xff0c;传统的人工管理方式已经无法满足管理需求。借助信息技术和互联网应用&#xff0c;社区物业管理系统可以实现物业管理信息的集中化、自动化和便捷化&#xff0c;提供全方位的管理和服务支持。社区…

PostgreSQL17索引优化之支持并行创建BRIN索引

PostgreSQL17索引优化之支持并行创建BRIN索引 最近连续写了几篇关于PostgreSQL17优化器改进的文章&#xff0c;其实感觉还是挺有压力的。对于原理性的知识点&#xff0c;一方面是对这些新功能也不熟悉&#xff0c;为了尽可能对于知识点表述或总结做到准确&#xff0c;因此需要…

Linux之文件fd

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 C进阶​ ​​​​算法 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂 目录 一.文件内容的回顾 二.提炼一下对文件的…

狂飙的鸭子,哪里跑!安定的力量(深度好文)——早读(逆天打工人爬取热门微信文章解读)

容我也来卖个小聪明&#xff0c;学习洞见&#xff0c;深度好文 引言Python 代码第一篇 洞见 安定的力量&#xff08;深度好文&#xff09;第二篇结尾 引言 老刺激了 骑着自行车在路上狂摇 刚刚好赶上打卡时间 早上一切很平和 听书 吃绿豆饼茶 做早餐 准点一天的排泄 老天估计…

快手矩阵系统:一键发布,多平台自动文案生成

在当今信息爆炸的时代&#xff0c;自媒体平台的崛起为用户提供了广阔的展示舞台。然而&#xff0c;对于内容创作者来说&#xff0c;如何高效地在多个平台上发布内容&#xff0c;同时保持文案的吸引力和独特性&#xff0c;一直是一个不小的挑战。幸运的是&#xff0c;随着技术的…

基于xinference推理引擎 + glm4-9b-chat模型的本地化部署探索

【备注】从langchain-chatchat v0.3开始&#xff0c;所有的模型配置&#xff0c;均由推理模型&#xff08;如&#xff1a;xinference &#xff09;进行加载和启动。 xinference 中配置并启动模型 1、查看支持的模型 xinference registrations --model-type LLM 2、执行tran…

相约 TDBC丨拓数派将亮相 2024 可信数据库发展大会!

2024 年&#xff0c;我国数据库正处于蓬勃发展期和关键应用期&#xff0c;在人工智能迅猛发展和数据要素市场化建设的浪潮下&#xff0c;为进一步推动全球数据库产业进步&#xff0c;2024 可信数据库发展大会将于 2024 年 7 月 16-17 日&#xff0c;在北京朝阳悠唐皇冠假日酒店…

计网ip层重要面经总结

文章目录 127.0.0.1, localhost, 0.0.0.0有什么不同?ipv6还需要NAT吗&#xff1f;DNS查询服务器的基本流程浏览器输入一个URL到显示器显示的过程PING是怎么工作的&#xff1f;ipv4和ipv6究竟有哪些区别&#xff1f;什么是跨域&#xff0c;什么情况下会发生跨域问题&#xff1f…

前端面试题42(MVVM与MVC区别)

MVVM&#xff08;Model-View-ViewModel&#xff09;和MVC&#xff08;Model-View-Controller&#xff09;都是软件架构模式&#xff0c;主要用于简化应用程序开发中的复杂性&#xff0c;尤其是在用户界面和数据管理方面。尽管它们有一些相似之处&#xff0c;但在设计理念和实施…

GD32MCU最小系统构成条件

大家是否有这个疑惑&#xff1a;大学课程学习51的时候&#xff0c;老师告诉我们51的最小系统构成&#xff1f;那么进入32位单片机时代&#xff0c;gd32最小系统构成又是怎么样的呢&#xff1f; 1.供电电路 需要确保供电的电压电流稳定&#xff0c;以东方红开发版为例&#xff…

基于深度学习的行人重识别

目录 1、基于表征学习的ReID方法 2、基于度量学习的ReID方法 &#xff08;1&#xff09;对比损失(Contrastive loss) &#xff08;2&#xff09;三元组损失(Triplet loss) &#xff08;3&#xff09; 四元组损失(Quadruplet loss) &#xff08;4&#xff09;难样本采样三元…

React+TS前台项目实战(三十)-- 首页构建之基于react-query和性能hook实现全页面数据渲染

文章目录 前言一、首页源码详细注释说明技术分析1. 页面功能分析2. 代码详细注释 二、效果展示总结 前言 前三篇文章详细介绍了首页的响应式布局&#xff0c;采用关注点分离进行模块拆解&#xff0c;现在只需按需引入模块&#xff0c;页面更加简洁&#xff0c;代码的维护性得到…

【鸿蒙学习笔记】关系型数据库概述

目录标题 关系型数据库的运行机制样例代码共通方法 DBUtilsIndex 代码效果 关系型数据库的运行机制 1、 关系型数据库对应用提供通用的操作接口&#xff0c;底层使用SQLite作为持久化存储引擎&#xff0c;支持SQLite具有的数据库特性&#xff0c;包括但不限于事务、索引、视图…