Hadoop简明教程

news/2024/9/17 19:07:39/ 标签: hadoop, npm, 大数据

文章目录

    • 关于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:latestcontainer_name: hadoop_namenoderestart: alwaysvolumes:- ./hadoop/namenode:/hadoop/dfs/namenodeenvironment:SERVICE_PRECONDITION: "datanode:9866 jobtracker:9001"ports:- "50070:50070"datanode:image: bde2020/hadoop-distrubuted:latestcontainer_name: hadoop_datanoderestart: alwaysvolumes:- ./hadoop/datanode:/hadoop/dfs/datanodeports:- "9866:9866"jobtracker:image: bde2020/hadoop-distrubuted:latestcontainer_name: hadoop_jobtrackerrestart: alwaysports:- "9001:9001"secondarynamenode:image: bde2020/hadoop-distrubuted:latestcontainer_name: hadoop_secondarynamenoderestart: alwaysvolumes:- ./hadoop/secondarynamenode:/hadoop/dfs/secondarynamenodeports:- "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.ppmy.cn/news/1474537.html

相关文章

如何确保 PostgreSQL 在高并发写操作场景下的数据完整性?

文章目录 一、理解数据完整性二、高并发写操作带来的挑战三、解决方案&#xff08;一&#xff09;使用合适的事务隔离级别&#xff08;二&#xff09;使用合适的锁机制&#xff08;三&#xff09;处理死锁&#xff08;四&#xff09;使用索引和约束&#xff08;五&#xff09;批…

如何在 Objective-C 中实现多态性,并且它与其他面向对象编程语言的多态性实现有何差异?

在Objective-C中&#xff0c;多态性可以通过使用父类的指针来调用子类的方法来实现。具体来说&#xff0c;可以定义一个父类的指针&#xff0c;然后将子类的实例赋值给这个指针。这样&#xff0c;即使使用父类的指针来调用方法&#xff0c;实际上会调用子类的方法。 需要注意的…

2024.7.11 刷题总结

2024.7.11 **每日一题** 2972.统计移除递增子数组的数目 Ⅱ&#xff0c;这道题和昨天的前置题目思路完全一样&#xff0c;只是数据范围变大了。我们还是先处理最大上升前缀&#xff0c;并且加上答案。然后从最后一个元素开始遍历&#xff0c;直到出现非下降元素就终止&#xff…

Elon Musk开源Grok

转载自&#xff1a;AILab基地 早在6天前&#xff0c;马斯克就发文称xAI将开源Grok 图片 13小时前&#xff0c;马斯克开源了旗下公司X的Grok训练模型&#xff0c;并喊话OpenAI&#xff0c;你名字里的Open到底在哪里 图片 下面是xai-org的GitHub开源地址[https://github.com/x…

羧基聚乙二醇生物素的制备方法;COOH-PEG-Biotin

羧基聚乙二醇生物素&#xff08;COOH-PEG-Biotin&#xff09;是一种常见的生物分子聚合物&#xff0c;具有多种应用&#xff0c;特别是在生物实验、药物研发和生物技术等领域。以下是对该化合物的详细解析&#xff1a; 一、基本信息 名称&#xff1a;羧基聚乙二醇生物素&#x…

钉钉扫码登录第三方

钉钉文档 实现登录第三方网站 - 钉钉开放平台 (dingtalk.com) html页面 将html放在 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>登录</title>// jquery<script src"http://code.jqu…

网络(一)——初始网络

文章目录 计算机网络的背景网络发展认识 "协议" 网络协议初识协议分层网络分层 网络传输基本流程数据包封装和分用网络中的地址管理认识IP地址认识MAC地址 计算机网络的背景 网络发展 独立模式:计算机之间相互独立 在最早的时候&#xff0c;计算机之间是相互独立的&…

EasyExcel文档链接与使用示例

文档链接 注解 https://blog.csdn.net/estelle_belle/article/details/134508223 官方文档地址 https://github.com/alibaba/easyexcel/tree/master?tabreadme-ov-file 使用示例 依赖版本 <dependency><groupId>com.alibaba</groupId><artifactId>…

【爬虫入门知识讲解:xpath】

3.3、xpath xpath在Python的爬虫学习中&#xff0c;起着举足轻重的地位&#xff0c;对比正则表达式 re两者可以完成同样的工作&#xff0c;实现的功能也差不多&#xff0c;但xpath明显比re具有优势&#xff0c;在网页分析上使re退居二线。 xpath 全称为XML Path Language 一种…

玄机——第五章 linux实战-黑链 wp

文章目录 一、前言二、概览简介 三、参考文章四、步骤&#xff08;解析&#xff09;准备步骤#1.0步骤#1.1找到黑链添加在哪个文件 flag 格式 flag{xxx.xxx} 步骤#1.2webshell的绝对路径 flag{xxxx/xxx/xxx/xxx/} 步骤#1.3黑客注入黑链文件的 md5 md5sum file flag{md5} 步骤#1.…

Mysql LIKE什么时候走索引,什么时候不走索引

在 MySQL 中&#xff0c;LIKE 查询是否走索引&#xff0c;主要取决于通配符的位置和使用的存储引擎。 使用索引的情况 前缀匹配&#xff1a; 当 LIKE 查询中的通配符出现在字符串的末尾时&#xff0c;查询可以利用索引。例如&#xff0c;LIKE abc% 。这种情况下&#xff0c;索…

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

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

基于EMQX+Flask+InfluxDB+Grafana打造多协议物联网云平台:MQTT/HTTP设备接入与数据可视化流程(附代码示例)

摘要: 本文深入浅出地介绍了物联网、云平台、MQTT、HTTP、数据可视化等核心概念&#xff0c;并结合 EMQX、Flask、InfluxDB、Grafana 等主流工具&#xff0c;手把手教你搭建一个支持多协议的物联网云平台。文章结构清晰&#xff0c;图文并茂&#xff0c;代码翔实易懂&#xff0…

MySQL 数据库的 DDL

备份 MySQL 数据库的 DDL&#xff08;数据定义语言&#xff09;语句包括导出数据库结构&#xff08;如表、视图、触发器、存储过程和函数等&#xff09;&#xff0c;但不包括实际数据。通常使用 mysqldump 工具进行此类操作。以下是具体的方法&#xff1a; 备份 DDL 1. 导出数…

免费的AI文生视频哪些比较靠谱?

目前市场上推出了很多文生图&#xff0c;图生视频等各类AI工具网站&#xff0c;但实际上效果如何呢&#xff1f; 可以说&#xff0c;进步很大。从无到有&#xff0c;从有到精&#xff0c;毕竟需要一个时间阶段的。 国内的文生视频大部分都直接需要付费&#xff0c;不付费的比…

近期几首小诗汇总-生活~卷

生活 为生活飘零&#xff0c;风雨都不阻 路见盲人艰&#xff0c;为她心点灯 贺中科大家长论坛成立十五周年 科学家园有喜贺 园外丑汉翘望中 曾一学子入我科 正育科二盼长大 憧憬也能入此家 与科学家论短长 园外翘首听高论 发现有隙入此坛 竟然也能注册成 入园浏览惶然立 此贴…

clean code-代码整洁之道 阅读笔记(第十六章)

第十六章 重构SerialDate 16.1 首先&#xff0c;让它能工作 利用SerialDateTests来完整的理解和重构SerialDate用Clover来检查单元测试覆盖了哪些代码&#xff0c;效果不行重新编写自己的单元测试经过简单的修改&#xff0c;让测试能够通过 16.2 让它做对 全过程&#xff1…

【Go系列】 array、slice 和 map

承上启下 我们上一篇文章中介绍了if和for&#xff0c;这不得练习下&#xff0c;让我们一起来实践一下如何使用 continue 语句来计算100以内的偶数之和。在我们编写代码的过程中&#xff0c;continue 语句将会帮助我们跳过某些不需要的迭代&#xff0c;比如在这个例子中&#xf…

RabbitMQ 高级功能

RabbitMQ 是一个广泛使用的开源消息代理&#xff0c;它支持多种消息传递协议&#xff0c;可以在分布式系统中用于可靠的消息传递。除了基本的消息队列功能外&#xff0c;RabbitMQ 还提供了一些高级功能&#xff0c;增强了其在高可用性、扩展性和灵活性方面的能力。以下是一些主…

一文详解DDL同步及其应用场景

目录 一、什么是DDL&#xff1f; 二、什么是DDL同步&#xff1f; 三、DDL同步的痛点 1、缺少自动DDL同步机制 2、缺少DDL变更监测预警 四、解决方案 五、应用场景及案例 案例一 案例二 案例三 在现代数据管理中&#xff0c;数据库的结构变更频繁且不可避免&#xff0c;特别是在…