Hadoop简明教程

打印 上一主题 下一主题

主题 907|帖子 907|积分 2721

本文帮助各人快速上手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(假如是在集群模式下)。
  1.   cd $HADOOP_HOME/sbin
  2.   ./start-dfs.sh
复制代码
启动YARN

在同一个sbin目次下,运行start-yarn.sh脚原来启动YARN。这将启动ResourceManager和所有NodeManagers。
  1. ./start-yarn.sh
复制代码
验证Hadoop服务

使用jps
命令来验证Hadoop服务是否已经启动。
  1. jps
复制代码
你应该能看到NameNode, DataNode, SecondaryNameNode, ResourceManager, 和 NodeManager 进程。
停止Hadoop

停止YARN,在Hadoop的sbin目次下运行stop-yarn.sh脚原来停止YARN服务。
  1. ./stop-yarn.sh
复制代码
停止HDFS

接着运行stop-dfs.sh脚原来停止HDFS服务。
  1. ./stop-dfs.sh
复制代码
这将依次停止所有DataNodes、Secondary NameNode和NameNode。
全部停止
假如你想一次性停止所有Hadoop服务,可以运行stop-all.sh脚本。
  1. ./stop-all.sh
复制代码
同样地,假如你想一次性启动所有Hadoop服务,可以运行start-all.sh脚本。
  1. ./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集群搭建的基本流程:
准备阶段

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

  1. 安装Java:在所有节点上安装Java SE Development Kit (JDK),并配置JAVA_HOME环境变量。
复制代码
Hadoop安装与配置

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

  1. 格式化HDFS:在Master节点上执行HDFS格式化命令。
  2. 启动Hadoop服务:在Master节点上启动HDFS和YARN服务。
复制代码
测试集群

  1. 测试HDFS:上传一些数据到HDFS并检查是否能够正确读取。
  2. 测试MapReduce或YARN:运行一个简单的MapReduce任务或Spark作业,确保集群正常工作。
复制代码
安装额外组件

  1. 安装Hive:如果需要SQL-like查询能力,可以在Hadoop集群上安装Hive。
  2. 安装HBase:如果需要NoSQL数据库功能,可以安装HBase。
复制代码
监控与维护:

  1. 安装监控工具:例如使用Ganglia或Nagios监控集群健康状态。
  2. 定期维护:包括数据平衡、日志分析和软件升级等。
复制代码
请注意,详细的配置细节会根据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的伪分布式集群:
  1. version: '3'
  2. services:
  3.   namenode:
  4.     image: bde2020/hadoop-distrubuted:latest
  5.     container_name: hadoop_namenode
  6.     restart: always
  7.     volumes:
  8.       - ./hadoop/namenode:/hadoop/dfs/namenode
  9.     environment:
  10.       SERVICE_PRECONDITION: "datanode:9866 jobtracker:9001"
  11.     ports:
  12.       - "50070:50070"
  13.   datanode:
  14.     image: bde2020/hadoop-distrubuted:latest
  15.     container_name: hadoop_datanode
  16.     restart: always
  17.     volumes:
  18.       - ./hadoop/datanode:/hadoop/dfs/datanode
  19.     ports:
  20.       - "9866:9866"
  21.   jobtracker:
  22.     image: bde2020/hadoop-distrubuted:latest
  23.     container_name: hadoop_jobtracker
  24.     restart: always
  25.     ports:
  26.       - "9001:9001"
  27.   secondarynamenode:
  28.     image: bde2020/hadoop-distrubuted:latest
  29.     container_name: hadoop_secondarynamenode
  30.     restart: always
  31.     volumes:
  32.       - ./hadoop/secondarynamenode:/hadoop/dfs/secondarynamenode
  33.     ports:
  34.       - "50090:50090"
复制代码
步调3: 格式化HDFS并启动集群
在你的Docker Compose文件地点的目次下,运行以下命令来格式化HDFS并启动集群:
  1. # 格式化HDFS
  2. docker-compose run --rm namenode /usr/local/bin/hadoop namenode -format
  3. # 启动集群
  4. 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

  1. import org.apache.hadoop.conf.Configuration;
  2. import org.apache.hadoop.fs.FileSystem;
  3. import org.apache.hadoop.fs.Path;
  4. import org.apache.hadoop.io.IOUtils;
  5. import java.io.FileOutputStream;
  6. import java.io.OutputStream;
  7. import java.net.URI;
  8. public class HDFSWritter {
  9.     public static void main(String[] args) throws Exception {
  10.         Configuration conf = new Configuration();
  11.         FileSystem fs = FileSystem.get(URI.create("hdfs://namenode:9000"), conf, "hdfs");
  12.         
  13.         String file = "/path/to/your/file";
  14.         OutputStream out = fs.create(new Path(file));
  15.         IOUtils.copyBytes("This is some text", 0, 15, out, conf);
  16.         IOUtils.closeStream(out);
  17.         fs.close();
  18.     }
  19. }
复制代码
读数据

  1. import org.apache.hadoop.conf.Configuration;
  2. import org.apache.hadoop.fs.FileSystem;
  3. import org.apache.hadoop.fs.Path;
  4. import org.apache.hadoop.io.IOUtils;
  5. import java.io.InputStream;
  6. import java.net.URI;
  7. public class HDFSReader {
  8.     public static void main(String[] args) throws Exception {
  9.         Configuration conf = new Configuration();
  10.         FileSystem fs = FileSystem.get(URI.create("hdfs://namenode:9000"), conf, "hdfs");
  11.         
  12.         String file = "/path/to/your/file";
  13.         InputStream in = fs.open(new Path(file));
  14.         IOUtils.copyBytes(in, System.out, 4096, false);
  15.         IOUtils.closeStream(in);
  16.         fs.close();
  17.     }
  18. }
复制代码
注意:在上述代码中,“namenode:9000”应更换为你的Hadoop集群的namenode地址和端口,“hdfs”应更换为你的Hadoop集群的用户名,“/path/to/your/file”应更换为你想要读写文件的实际路径。
此外,你还需要在你的项目中添加Hadoop的依赖,比方在Maven的pom.xml中添加:
  1. <dependencies>
  2.     <dependency>
  3.         <groupId>org.apache.hadoop</groupId>
  4.         <artifactId>hadoop-client</artifactId>
  5.         <version>3.2.1</version>
  6.     </dependency>
  7. </dependencies>
复制代码
使用Hadoop进行分布式计算

在Hadoop中,主要通过MapReduce框架来进行分布式计算。下面是一个使用Java编写的简单WordCount步伐的例子,它展示了如何使用Hadoop MapReduce进行分布式计算。
步调1: 创建Mapper类
  1. import java.io.IOException;
  2. import java.util.StringTokenizer;
  3. import org.apache.hadoop.io.IntWritable;
  4. import org.apache.hadoop.io.LongWritable;
  5. import org.apache.hadoop.io.Text;
  6. import org.apache.hadoop.mapreduce.Mapper;
  7. public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
  8.     private final static IntWritable one = new IntWritable(1);
  9.     private Text word = new Text();
  10.     public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
  11.         String line = value.toString();
  12.         StringTokenizer tokenizer = new StringTokenizer(line);
  13.         while (tokenizer.hasMoreTokens()) {
  14.             word.set(tokenizer.nextToken());
  15.             context.write(word, one);
  16.         }
  17.     }
  18. }
复制代码
步调2: 创建Reducer类
  1. import java.io.IOException;
  2. import org.apache.hadoop.io.IntWritable;
  3. import org.apache.hadoop.io.Text;
  4. import org.apache.hadoop.mapreduce.Reducer;
  5. public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
  6.     private IntWritable result = new IntWritable();
  7.     public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
  8.         int sum = 0;
  9.         for (IntWritable val : values) {
  10.             sum += val.get();
  11.         }
  12.         result.set(sum);
  13.         context.write(key, result);
  14.     }
  15. }
复制代码
步调3: 创建Driver类
  1. import org.apache.hadoop.conf.Configuration;
  2. import org.apache.hadoop.fs.Path;
  3. import org.apache.hadoop.io.IntWritable;
  4. import org.apache.hadoop.io.Text;
  5. import org.apache.hadoop.mapreduce.Job;
  6. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  7. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  8. public class WordCountDriver {
  9.     public static void main(String[] args) throws Exception {
  10.         Configuration conf = new Configuration();
  11.         Job job = Job.getInstance(conf, "word count");
  12.         job.setJarByClass(WordCountDriver.class);
  13.         job.setMapperClass(WordCountMapper.class);
  14.         job.setCombinerClass(WordCountReducer.class);
  15.         job.setReducerClass(WordCountReducer.class);
  16.         job.setOutputKeyClass(Text.class);
  17.         job.setOutputValueClass(IntWritable.class);
  18.         FileInputFormat.addInputPath(job, new Path(args[0]));
  19.         FileOutputFormat.setOutputPath(job, new Path(args[1]));
  20.         System.exit(job.waitForCompletion(true) ? 0 : 1);
  21.     }
  22. }
复制代码
运行步伐
首先,你需要将输入文本文件放到HDFS上,然后运行你的MapReduce步伐。假设你的输入文件在HDFS上的路径是/user/input,输出路径是/user/output,那么你可以在命令行中使用以下命令运行你的步伐:
  1. hadoop jar your-jar-file.jar WordCountDriver /user/input /user/output
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

老婆出轨

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表