0


通过docker-compose安装hadoop

通过docker-compose安装hadoop

1、 hadoop2.X与3.X的区别

本次安装使用的是hadoop3.3.6版本,安装之前首先介绍下hadoop2.X与3.X的区别,让大家了解为什么要选择hadoop3.X的版本。
编号特性Hadoop 2.xHadoop 3.x 11最低支持的 Java 版本JAVA 7 是最低兼容版本JAVA 8 是最低兼容版本2容错复制是处理非空间优化的容错的唯一方法纠删码用于处理容错3数据平衡HDFS 平衡器用于数据平衡。使用数据内节点平衡器,通过 HDFS 磁盘平衡器命令行界面调用。4存储方案使用 3x 复制方案。在 HDFS 中使用纠删码(erasure coding,EC)。5存储开销Hadoop 2.x 中消耗了 200% 的 HDFS存储Hadoop 3.x 中额外使用了 50%的存储,这意味着有更多的工作空间。6可扩展性有限的可扩展性,一个集群中最多可以有 10000 个节点。可扩展性得到改善,集群中可以有超过 10000 个节点。7默认端口范围 (32768-61000)默认使用 Linux 临时端口范围,启动时绑定失败。使用的端口不在此临时端口范围内。8兼容的文件系统HDFS(默认)、FTP、Amazon S3 和 Windows Azure 存储 Blob (WASB) 文件系统。所有文件系统,包括 Microsoft Azure Data Lake 文件系统。9NameNode节点恢复NameNode节点恢复需要手动干预。NameNode节点恢复无需手动干预。

2、 hadoop3.X会启动哪些节点

编号名称作用1NameNode(缩写:NN)存储文件的元数据,如文件名,文件目录结构,文件属性(生成时间、副本数、文件权限),以及每个文件的块列表和块所在的DataNode等;配置副本策略;处理的客户端的读写请求。2DataNode (缩写:DN)在本地文件系统存储文件块数据,以及块数据的校验和;执行数据块的读/写操作3ResourceManager(YARN组件,缩写:RM)整个集群资源(内存、CPU等)的管理者,接收NodeManager的资源汇报,并负责集群所有资源的统一管理和分配。4NodeManager (YARN组件,缩写:NM)单个节点服务器的管理者,是一种守护进程,负责在集群的每个节点上管理和监控资源,负责启动和停止容器。5ApplicationMaster(YARN组件,缩写:AM)1)管理在YARN内运行的应用程序的实例。2)AM负责协调来自RM的资源。3)AM通过nodeManager 监视 容器执行和资源调度
备注:
1)什么是YARN?YARN是Hadoop2.0版本引入的资源管理系统。YARN作为一个资源调度平台,包括三个组件:ResourceManager、NodeManager 以及ApplicationMaster。(严格来说ApplicationMaster只是一个YARN的客户端)

2)每一个HDFS集群包括一个NameNode和多个DataNode。

3)对于非高可用集群,默认会启动一个Secondary NameNode进程。Secondary NameNode的作用是消费EditsLog,定期地合并FsImage和EditsLog,生成新的FsImage文件,降低了NameNode的压力。

4)对于高可用集群,默认会启动两个NameNode,一个是Active NameNode,另一个是Standby NameNode,两个NameNode承担不同角色。
Active NameNode负责处理DataNode和Client的请求,Standby NameNode跟Active NameNode一样拥有最新的元数据信息,随时准备在Active NameNode出现异常时接管其服务。如果Active NameNode异常,Standby NameNode会感知到并切换成Active NameNode的角色处理DataNode和Client请求

3、 安装hadoop3.3.6
3.1 Docker环境准备

本人是 Mac系统,Docker版本为:Docker version 24.0.6;docker-compose版本:v2.23.0-desktop.1。

3.2 修改Docker Compose 版本的支持

关闭对Compose V2版本的支持:docker-compose disable-v2

docker-compose的Compose配置文件语法版本有3个版本,分别为1, 2.x 和 3.x。如果不关闭V2版本的话,运行docker-compose命令时会报错:unexpected character “-” in variable name near,执行docker-compose disable-v2解决该问题。

3.3 docker-compose.yaml创建
version: "3"
networks:
   hadoop-net:
      driver: bridge
services:
   namenode:
      image: apache/hadoop:3.3.5
      hostname: namenode
      command: ["hdfs", "namenode"]
      user: "root:root"
      ports:
        - 9870:9870
        - 8020:8020
      volumes:
        - namenode:/tmp/hadoop-root/dfs
      env_file:
        - ./config.env
      privileged: true
      environment:
          ENSURE_NAMENODE_DIR: "/tmp/hadoop-root/dfs/name"
      networks:
        - hadoop-net
   datanode:
      image: apache/hadoop:3.3.5
      hostname: datanode
      command: ["hdfs", "datanode"]
      user: "root:root"
      env_file:
        - ./config.env
      privileged: true
      ports:
        - 9864:9864
        - 9866:9866
      volumes:
        - datanode:/tmp/hadoop-root/dfs
      networks:
        - hadoop-net
   resourcemanager:
      image: apache/hadoop:3.3.5
      hostname: resourcemanager
      command: ["yarn", "resourcemanager"]
      user: "root:root"
      ports:
         - 8088:8088
         - 8030:8030
         - 8031:8031
         - 8032:8032
         - 8033:8033
      env_file:
        - ./config.env
      volumes:
        - ./test.sh:/opt/test.sh
      networks:
        - hadoop-net
   nodemanager:
      image: apache/hadoop:3.3.5
      command: ["yarn", "nodemanager"]
      user: "root:root"
      env_file:
        - ./config.env
      ports:
         - 8042:8042
      networks:
        - hadoop-net
volumes:
  datanode:
  namenode:

备注:

1)设置容器以root用户启动 user: “root:root”,(否则对volumes的读写有问题;另外一种解决办法是在机器上创建hadoop用户)

3.4 环境变量文件config.env创建
CORE-SITE.XML_fs.default.name=hdfs://namenode
CORE-SITE.XML_fs.defaultFS=hdfs://namenode
CORE-SITE.XML_hadoop.http.staticuser.user=root
CORE-SITE.XML_hadoop.tmp.dir=/tmp/hadoop-root
HDFS-SITE.XML_dfs.namenode.rpc-address=namenode:8020
HDFS-SITE.XML_dfs.replication=1
MAPRED-SITE.XML_mapreduce.framework.name=yarn
MAPRED-SITE.XML_yarn.app.mapreduce.am.env=HADOOP_MAPRED_HOME=${HADOOP_HOME}
MAPRED-SITE.XML_mapreduce.map.env=HADOOP_MAPRED_HOME=${HADOOP_HOME}
MAPRED-SITE.XML_mapreduce.reduce.env=HADOOP_MAPRED_HOME=${HADOOP_HOME}
MAPRED-SITE.XML_mapreduce.jobhistory.address=0.0.0.0:10020
MAPRED-SITE.XML_mapreduce.jobhistory.webapp.address=0.0.0.0:19888
YARN-SITE.XML_yarn.resourcemanager.hostname=resourcemanager
YARN-SITE.XML_yarn.nodemanager.pmem-check-enabled=true
YARN-SITE.XML_yarn.nodemanager.delete.debug-delay-sec=600
YARN-SITE.XML_yarn.nodemanager.vmem-check-enabled=true
YARN-SITE.XML_yarn.nodemanager.aux-services=mapreduce_shuffle
YARN-SITE.XML_yarn.nodemanager.resource.cpu-vcores=4
YARN-SITE.XML_yarn.application.classpath=opt/hadoop/etc/hadoop:/opt/hadoop/share/hadoop/common/lib/*:/opt/hadoop/share/hadoop/common/*:/opt/hadoop/share/hadoop/hdfs:/opt/hadoop/share/hadoop/hdfs/lib/*:/opt/hadoop/share/hadoop/hdfs/*:/opt/hadoop/share/hadoop/mapreduce/*:/opt/hadoop/share/hadoop/yarn:/opt/hadoop/share/hadoop/yarn/lib/*:/opt/hadoop/share/hadoop/yarn/*
CAPACITY-SCHEDULER.XML_yarn.scheduler.capacity.maximum-applications=10000
CAPACITY-SCHEDULER.XML_yarn.scheduler.capacity.maximum-am-resource-percent=0.1
CAPACITY-SCHEDULER.XML_yarn.scheduler.capacity.resource-calculator=org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator
CAPACITY-SCHEDULER.XML_yarn.scheduler.capacity.root.queues=default
CAPACITY-SCHEDULER.XML_yarn.scheduler.capacity.root.default.capacity=100
CAPACITY-SCHEDULER.XML_yarn.scheduler.capacity.root.default.user-limit-factor=1
CAPACITY-SCHEDULER.XML_yarn.scheduler.capacity.root.default.maximum-capacity=100
CAPACITY-SCHEDULER.XML_yarn.scheduler.capacity.root.default.state=RUNNING
CAPACITY-SCHEDULER.XML_yarn.scheduler.capacity.root.default.acl_submit_applications=*
CAPACITY-SCHEDULER.XML_yarn.scheduler.capacity.root.default.acl_administer_queue=*
CAPACITY-SCHEDULER.XML_yarn.scheduler.capacity.node-locality-delay=40
CAPACITY-SCHEDULER.XML_yarn.scheduler.capacity.queue-mappings=
CAPACITY-SCHEDULER.XML_yarn.scheduler.capacity.queue-mappings-override.enable=false

备注:

1)设置HDFS web UI用户身份(否则对volumes的读写有问题):CORE-SITE.XML_hadoop.http.staticuser.user=root

2)设置Hadoop保存数据路径:CORE-SITE.XML_hadoop.tmp.dir=/tmp/hadoop-root

3)设置MR程序默认运行模式,yarn集群模式,local本地模式:MAPRED-SITE.XML_mapreduce.framework.name=yarn

3.4 创建后的目录如下
-rw-r--r--@ 1 taoruicheng  453037844   1.8K 12 19 18:02 config.env
-rw-r--r--@ 1 taoruicheng  453037844   1.0K 12 19 18:31 docker-compose.yaml
drwxr-xr-x  2 taoruicheng  453037844    64B 12 19 11:36 test.sh
3.5 启动程序

docker-compose up -d

3.6 查看程序状态

docker-compose ps

NAME                       IMAGE                 COMMAND                   SERVICE           CREATED       STATUS       PORTS
hadoop-datanode-1          apache/hadoop:3.3.5   "/usr/local/bin/dumb…"   datanode          3 hours ago   Up 3 hours   0.0.0.0:9864->9864/tcp, 0.0.0.0:9866->9866/tcp
hadoop-namenode-1          apache/hadoop:3.3.5   "/usr/local/bin/dumb…"   namenode          3 hours ago   Up 3 hours   0.0.0.0:8020->8020/tcp, 0.0.0.0:9870->9870/tcp
hadoop-nodemanager-1       apache/hadoop:3.3.5   "/usr/local/bin/dumb…"   nodemanager       3 hours ago   Up 3 hours   0.0.0.0:8042->8042/tcp
hadoop-resourcemanager-1   apache/hadoop:3.3.5   "/usr/local/bin/dumb…"   resourcemanager   3 hours ago   Up 3 hours   0.0.0.0:8030-8033->8030-8033/tcp, 0.0.0.0:8088->8088/tcp
4、 访问HDFS集群的Namenode页面

http://localhost:9870/

备注:在http://localhost:9870/explorer.html#/ 页面上传、下载文件,提示上传失败,通过F12可以查看上传文件请求的地址为:http://datanode:9864/webhdfs/v1/XXX ,如果提示失败,可以设置本地host:

127.0.0.1 datanode
127.0.0.1 namenode
127.0.0.1 resourcemanager

Namenode 端口号(默认值):

  • 8020:就是hdfs客户端访问hdfs集群的RPC通信端口
  • 9870:Namenode 的web界面端口

Datanode 端口号(默认值):

  • 9864:Datanode的http服务端口
  • 9866:Datanode的数据传输端口
5、 访问YARN集群的ResourceManager页面

http://localhost:8088/

ResourceManager 端口号(默认值):

  • 8030:ResourceManager 客户端RPC端口
  • 8031:ResourceManager Scheduler 端口
  • 8032:ResourceManager Application Master 端口
  • 8033:ResourceManager 资源追踪器端口
  • 8088:ResourceManager Web界面

NodeManager 端口号(默认值):

  • 8042:NodeManager web地址
  • 8040: IPC接口(Inter-Process Communication)

NM Webapp address.

6、通过java代码访问hdfs

1)通过webhdfs协议进行文件操作

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.net.URI;
public class CreateFileOnHDFS {
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        // 指定本客户端上传文件到hdfs时需要保存的副本数为:1
        conf.set("dfs.replication", "1");
        // 指定本客户端上传文件到hdfs时切块的规格大小:64M
        conf.set("dfs.blocksize", "64m");
        // 构造一个访问指定HDFS系统的客户端对象: 参数1:——HDFS系统的URI,参数2:——客户端要特别指定的参数,参数3:客户端的身份(用户名)
        FileSystem fs = FileSystem.get(new URI("webhdfs://localhost:9870/"), conf, "root");
        // 上传一个文件到HDFS中
        fs.copyFromLocalFile(new Path("/Users/taoruicheng/aa.md"), new Path("/"));
        fs.close();
    }
}

2)通过hdfs协议访问

如果通过hdfs协议进行上传文件的话,不设置conf.set(“dfs.client.use.datanode.hostname”,“true”);会通过docker 的内部集群ip进行访问。

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.net.URI;
public class CreateFileOnHDFS {
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        // 指定本客户端上传文件到hdfs时需要保存的副本数为:1
        conf.set("dfs.replication", "1");
        // 指定本客户端上传文件到hdfs时切块的规格大小:64M
        conf.set("dfs.blocksize", "64m");
        conf.set("dfs.client.use.datanode.hostname","true");
        // 构造一个访问指定HDFS系统的客户端对象: 参数1:——HDFS系统的URI,参数2:——客户端要特别指定的参数,参数3:客户端的身份(用户名)
        FileSystem fs = FileSystem.get(new URI("hdfs://datanode:8020/"), conf, "root");
        // 上传一个文件到HDFS中
        fs.copyFromLocalFile(new Path("/Users/taoruicheng/bb.md"), new Path("/"));
        fs.close();
    }
}
7、运行Mapreduce代码

docker exec -it hadoop-resourcemanager-1 /bin/bash

hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.5.jar pi 5 100

访问http://localhost:8088/cluster/apps 可以查看任务详情

标签: docker hadoop 容器

本文转载自: https://blog.csdn.net/taoruicheng1/article/details/135114606
版权归原作者 爱吃橙子的成 所有, 如有侵权,请联系我们删除。

“通过docker-compose安装hadoop”的评论:

还没有评论