从零搭建docker hadoop集群

介绍

java,集群大数据处理框架,主机直接使用socket通信.

参考:https://www.runoob.com/w3cnote/hadoop-setup.html

底层组成

  1. HDFS: Hadoop Distributed File System, 负责分布式存储数据

    1. 节点
      1. NameNode: 命名节点,指挥(管理)其他节点,只有一个
      2. DataNode: 数据节点,存储数据块(基本单位 )
      3. Secendary: 副命名节点,分担命名节点的压力,不能代替命名节点,可以备份数据以恢复命名节点,可以有多个
  2. MapReduce: Map Reduce, 映射和规约

docker搭建Hadoop环境

  1. 环境window 7准备:

    1. docker toolbox
    2. 问题:https://blog.csdn.net/CSDN_duomaomao/article/details/73028390
  2. 打开docker toolbox: 进入安装目录,打开start.sh

  3. 安装centos:8,版本为8, 命令:

    1. 安装: docker pull centos:8
    2. 查看: docker images
    3. 启动: docker run -d --name java_ssh_proto --privilege centos:8 /usr/sbin/init
      1. -d: 后台运行
      2. –name: 容器名称
      3. –privilege: 进入容器内,登陆的用户拥有root权限,不使用则只有普通用户权限
      4. centos:8: 运行centos且版本为8的镜像
      5. /usr/sbin/init: 运行后自动执行的脚本
  4. 配置将软件包缓存,以提高搭建环境时的安装速度

    sed -e 's|^mirrorlist=|#mirrorlist=|g' \
             -e 's|^#baseurl=http://mirror.centos.org/$contentdir|baseurl=https://mirrors.ustc.edu.cn/centos|g' \
             -i.bak \
             /etc/yum.repos.d/CentOS-Linux-AppStream.repo \
             /etc/yum.repos.d/CentOS-Linux-BaseOS.repo \
             /etc/yum.repos.d/CentOS-Linux-Extras.repo \
             /etc/yum.repos.d/CentOS-Linux-PowerTools.repo \
             /etc/yum.repos.d/CentOS-Linux-Plus.repo
    yum makecache
    

    sed命令参考:https://www.runoob.com/linux/linux-comm-sed.html

    -e: 使用指定的规则处理输入的文本文件

    's|^mirrorlist=|#mirrorlist=|g' :
    s: 替换动作
    将^mirrorlist=(^正则表达式:开头为mirrorlist)替换为#mirrorlist=
    g:正则表达式参数,全局替换
    

    -i.bak: 将原文件修改前内容保存为"原文件名称.bak",用作备份

  5. 安装jdk和ssh

    1. yum install -y java-1.8.0-openjdk-devel openssh-clients openssh-server
      1. -y: 自动确认Y
    2. 启动ssh服务: systemctl enable sshd & systemctl start sshd
      1. enable: 每次开机启动
      2. start:立即启动
      3. 等价于: systemctl enable sshd --now
    3. 保存安装jdk和ssh的centos进行
      1. 若在容器内,则退出容器: exit
      2. 若容器在运行,停止容器: docker stop java_ssh_proto
      3. 提交最后版本的容器镜像: docker commit java_ssh_proto java_ssh
  6. 安装hadoop

    1. 启动容器: docker run -d --name=hadoop_single --privileged java_ssh /usr/sbin/init

    2. 问题:https://blog.csdn.net/asdwt123/article/details/104637556

      docker-machine  ssh default
      
      sudo mkdir /sys/fs/cgroup/systemd
      
      sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd
      

      -t: 指定系统形态,不指定则系统自动指定

      挂载一棵cgroup树,但不关联任何subsystem

      参考:https://blog.csdn.net/weixin_34293141/article/details/89279437

    3. 下载hadoop: 3.2.x, 复制到/root/,并解压到/usr/local/hadoop

      1. 在容器外: docker cp hadoop-3.2.2.tar.gz hadoop_single:/root/
      2. 进入容器: docker exec -it hadoop_single bash
      3. 解压:tar -zxf hadoop-3.2.2.tar.gz -C
      4. 移到到/usr/local/并改名为hadoop: mv hadooop-3.2.2 /usr/local/hadoop
    4. 配置hadoop全局环境变量

      1. 配置HADOOP_HOME: echo “export HADOOP_HOME=/usr/local/hadoop” >> /etc/bashrc
      2. 配置PATH: echo “export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin” >> /etc/bashrc
      3. 退出重新并进入容器: exit -> docker exec -it hadoop_single bash
    5. 配置hadoop内环境变量

      1. 配置JAVA_HOME: echo “export JAVA_HOME=/usr” >> $HADOOP_HOME/etc/hadoop/hadoop-env.sh
      2. 配置HADOOP_HOME: echo “export HADOOP_HOME=/usr/local/hadoop” >> $HADOOP_HOME/etc/hadoop/hadoop-env.sh
      3. 验证hadoop: hadoop version

配置单机HDFS

  1. hadoop用户:
    1. 新建hadoop用户: adduser hadoop
    2. 创建hadoop密码:
      1. 安装修改密码的快捷工具: yum install -y passwd sudo
      2. 修改密码: passwd hadoop
      3. 输入密码:hadoop -> 再次确认输入密码 hadoop
    3. 修改hadoop安装目录拥有者为hadoop用户: chown -R hadoop /usr/local/hadoop
    4. 为hadoop用户添加sudo权限: 在/etc/sudoers文件的“root ALL=(ALL) ALL”下一行添加“hadoop ALL=(ALL) ALL”
  2. commit镜像: docker commit hadoop_single hadoop_proto
  3. 创建新容器hdfs_single: docker run -d --name=hdfs_single --privileged hadoop_proto /usr/sbin/init
  4. 启动HDFS
    1. hadoop用户进入容器: docker exec -it hadoop_single su hadoop
    2. 验证:whoami -> hadoop
    3. 添加ssh密钥: ssh-keygen -t rsa
    4. 添加ip(IP 通过ip addr | grep 172 所获得)到密钥的信任列表: ssh-copy-id hadhoop@172.17.0.2
    5. 配置core.site.xml
      <property>
         <name>fs.defaultFS</name>
         <value>hdfs:172.17.0.2:9000</value>
      </property>
      
    6. 配置hdfs.site.xml
      <property>
         <name>dfs.replication</name>
         <value>1</value>
      </property>
      
    7. 启动 HDFS: start-dfs.sh
    8. 验证:
      1. 查看jps进程: jps, 有NameNode, SecondaryNameNode, DataNode
      2. 查看http进程: curl http://172.17.0.2:9870
  5. HDFS使用
    1. HDFS Shell:
      1. 查看文件: hadoop fs -ls /
      2. 新建文件夹: hadoop fs -mkdir /hello
      3. 上传文件: hadoop fs -put a.txt /hello/
      4. 下载文件: hadoop fs -get /hello/a.txt
      5. 查看文件: hadoop fs -cat /hello/a.txt

配置集群HDFS

  1. 配置集群原型 cluster_proto

    1. 启动镜像hadoop_proto 作为容器 hadoop_temp:
      docker run -d --name=hadoop_temp --privileged hadoop_property /usr/sbin/init
    2. 配置workers记录所有DataNode:
      dn1
      dn2
      
    3. 配置core.site.xml
      <!-- 配置hdfs节点入口 -->
      <property>
         <name>fs.defaultFS</name>
         <value>hdfs://nn:9000</value>
      </property>
      
      <!-- 配置临时文件夹位置 -->
      <property>
         <name>hadoop.tmp.dir</name>
         <value>file:///home/hadoop/tmp</value>
      </property>
      
    4. 配置 hdfs.site.xml
      <!-- 配置DataNode数量为2 -->
      <property>
         <name>dfs.replication</name>
         <value>2</value>
      </property>
      
      <!-- 配置记录namenode的文件夹 -->
      <property>
         <name>dfs.namenode.name.dir</name>
         <value>file:///home/hadoop/hdfs/name</value>
      </property>
      
    5. 配置 ssh
      1. 生成公钥: ssh-keygen -t rsa -P “” ~/.ssh/id_rsa
      2. 添加主机到信任列表: ssh-copy-id -i ~/.ssh/id_rsa hadoop@localhost
    6. 退出并commit为hadoop_proto镜像
      1. 退出容器: exit
      2. 关闭容器: docker stop hadoop_temp
      3. 提交容器: docker commit hadoop_temp cluster_proto
  2. 部署集群

    1. 创建网络hnet: docker network creat --subnet 172.20.0.0/16 hnet
    2. 分别启动nn,dn1,dn2容器
    docker -run -d --name=nn --hostname=nn  -network=hnet -ip=172.20.0.11 --add-host=dn1:172.20.0.21 --add-host=dn2:172.20.0.31 --privileged cluster_proto /usr/sbin/init
    
    docker -run -d --name=dn1 --hostname=dn1  -network=hnet -ip=172.20.0.21 --add-host=nn:172.20.0.11 --add-host=dn2:172.20.0.31 --privileged cluster_proto /usr/sbin/init
    
    docker -run -d --name=dn2 --hostname=dn2  -network=hnet -ip=172.20.0.31 --add-host=nn:172.20.0.11 --add-host=dn1:172.20.0.21 --privileged cluster_proto /usr/sbin/init
    
    1. 进入nn容器启动NameNode和SecondaryNameNode,并通过ssh启动dn1,dn2的DataNode:
      1. 进入nn容器: docker exec -it nn su hadoop
      2. 格式化namenode: hdfs namenode -format
      3. 启动: start-dfs.sh
    2. 验证:
      1. 退出容器:exit
      2. 验证nn的NameNode,SecondaryNameNode: docker exec nn jps
      3. 验证dn1的DataNode: docker exec dn1 jps
      4. 验证dn2的DataNode: docker exec dn2 jps

MapReduce的使用

  1. 集群版:
    1. 进入nn容器:docker exec -it nn su hadoop
    2. 创建input.txt
    I like runoob
    I love runoob
    I like hadoop
    I love hadoop
    
    1. 上传input.txt到hadoop: hadoop -put input.txt /input.txt
    2. 统计单词: hadoop jar $HADOOP_HOME/share/hadoop//mapreduce/hadoop-mapreduce-examples-3.2.2.jar wordcount input.txt output
    3. 查看结果
      1. 输出文件夹: hadoop fs -ls /output
      2. 输出内容: hadoop fs -cat /output/part-r-00000
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值