macbook docker搭建hadoop集群

背景

python处理大数据性能上不足,所以想着用pyspark来处理,但是前提是要有一个hadoop的分布式环境,没有现成的,那就搭一个。

环境

mac: 10.15.6
docker: 20.10.6
hadoop: 3.2.3
jdk: 1.8
scala: 3.1.1
spark: 3.0.3

项目说明

在docker中集成 hadoop,spark,scala, habse(暂未更新),目前已经完成可以启动1台master,3台slave的hadoop分布式环境,接下来会继续更新安装hbase等;
搭建好的环境会被pyspark使用,当然这种方式只是在一台宿主机上搭建,只是跟伪分布式有点不同。

项目地址:https://github.com/DM-NUM/hadoop_cluster.git
可以拉下来直接用,文档有说明;项目会持续更新

所有的配置全部写入Dockerflie 和 entrypoint.sh,省去了因配置不当而导致启动失败的问题,踩过了不少坑了,修改过很多个版本,现在跑wordcount测试没问题了。

项目的具体文件我就不放啦,记录了一些在安装过程中遇到的问题,希望也能帮到你:

README

ATTENTION:

  • 在build image前,一定要先手动将java1.8下载到项目目录中,因为java1.8官网需要登录并在浏览器下载;尝试过在非官网地址用curl下载,但是下载下来的java缺少了一些文件夹,所以老老实实去官网下载吧:https://www.oracle.com/java/technologies/downloads/
  • 镜像中大部分是在下载软件,如果你不想你的镜像占用磁盘空间太大,建议所有软件你先下载到本地,然后将镜像中,所有curl相关的命令都注释再创建镜像。

wait_for_it.sh脚本是直接引用了大神的脚本,大神项目地址是:https://github.com/vishnubob/wait-for-it.git;自己就偷懒了,其实在这项目中也可以>不使用这个脚本,但是保险起见,还是使用了。

项目启动:

  • ./start.sh build 构建镜像
  • ./start.sh run 启动集群,hadoop0(master),hadoop1, hadoop2,hadoop3;【初次启动hadoop需要格式化,将docker-compose中hadoop0容器的command改成master-format】
  • ./stop.sh stop 关闭容器
  • ./stop.sh del 删除容器

项目脚本说明:

  • 所有的脚本都放在/usr/local/app,docker-compose.yml中映射了本地目录,可自行修改
  • jdk版本查看了网上的资料说要1.8,不然启动hadoop时有些任务启动不了,而官网下载jdk1.8需要登陆账号,最终放弃了使用curl直接下载的方式,而是通>过浏览器下载到本地路径中,再add到镜像。所以为了使镜像生成更快,所有的软件都下到项目路径中。
  • jsvc需要重新编译,所以需要安装make
  • 镜像中生成ssh key是为了生成同一套密钥,启动多组容器即可相互访问
  • wait_for_it.sh是为了在docker-compose启动容器时,保证slave都启动了,再启动master
  • 容器启动后,执行的脚本由entrypoint.sh控制

正常启动项目进程:

  • master:
    • hadoop
      • NameNode
      • DataNode
      • NodeManager
      • ResourceManager
      • SecondaryNameNode
    • zookeeper
      • QuorumPeerMain
    • hbase
      • HMaster
      • HRegionServer
  • slave:
    • hadoop
      • DataNode
      • NodeManager
    • zookeeper
      • QuorumPeerMain
    • hbase
      • HRegionServer

hadoop测试

  • ./test_wordcount.sh

控制台

  • localhost:8088 hadoop yarn
  • localhost:9864 hadoop namenode
  • localhost:9870 hadoop datanode
  • localhost:16010 hbase

错误记录:

hadoop 错误

  1. 集群退出时,最好是使用hadoop的退出命令,不要强行用kill进程的方式退出。

  2. 启动脚本时,./start.sh run

    • 因为我比较贪心,用了docker-compose同时启动多个容器,且entrypoint脚本启动比较多,所以导致启动docker超时。
    • 在本机添加环境变量,即设置超时时间
    • export DOCKER_CLIENT_TIMEOUT=120
    • export COMPOSE_HTTP_TIMEOUT=120
    • 重启docker服务
    • 参考文档

namenode启动失败

  1. 对namenode格式化之后,datanode和namenode文件夹下面的current/VERSION中的clusterid不一致,导致启动失败;解决:删除datanode的current文件夹,
    或者将namenode文件夹的version的clusterid拷贝到datanode
  2. datanode启动失败
    * slave挂载了和master相同的数据目录,导致磁盘写入失败;解决方法:删除slave的数据挂载目录
  3. 执行hadoop的wordcount,任务卡在job
    * 修改yarn-site.xml的内存配置,原因就是内存不够用,参考:https://blog.csdn.net/qq_44491709/article/details/107872137

hbase 错误

  1. hbase启动后,在设定的时间超时后,hmaster退出,然后日志有各种各样的warn,就是没有error;

    • 其实这种情况就是前期搭建好hbase后的一些不规范导致留下来的后遗症,比如:
      • 前期使用了hbase自带的zookeeper,后面又另外安装了zookeeper
      • 前期很多次直接kill掉hbase
      • 最终找到一个大神的方法,就是网上有人跟我遇到同种情况,hbase没有数据
      • 大神给的方案是直接删掉hadoop中/hbase文件夹下所有文件,再删除zookeeper客户端下,/hbase文件夹,代码如下
        • hdfs dfs -rm -r /hbase/*
        • 然后,打开zookeeper客户端,zkCli.zh … 输入:deleteall /hbase
        • 成功解决
      • 但是这种一般是你最开始创建好hbase才这么做,不然很危险,数据啥的全都会没了
      • 所以还是要好好规范退出程序,先退出hbase,再退出zookeeper;一定要牢牢记住老铁们,花了我一周时间排查这个问题。
      • 附上大神的帖子:https://community.cloudera.com/t5/Support-Questions/HBase-Master-Failed-to-become-active-master/m-p/27240
    1. 分布式集群下启动hbase,但是总是有一两个slave的hregionserver进程启动失败

      • 之前为了方便,就直接用hbase自带的zookeeper,但产生了一系列的bug,怎么排都排不完,后来,还是决定下了独立的zookeeper,安装后就只有少量的bug,一下子就解决了;所以呀,还是别偷懒。
    2. master的hmater, hregionserver, QuorumPeerMain已经启动,每个slave的hregionserver, QuorumPeerMain也正常启动,但是打开hbase shell中出现错误:

      • 关闭hadoop的安全模式:hdfs dfsadmin -safemode leave
    3. hadoop关闭安全模式,错误:Error: Could not find or load main class org.apache.hadoop.hdfs.tools.DFSAdmin

      • 环境变量中添加export HADOOP_CLASSPATH= ( h a d o o p c l a s s p a t h ) : (hadoop classpath): (hadoopclasspath):HADOOP_CLASSPATH
    4. 当你非正常退出hbase时,可能会导致下次启动hbase时错误,有可能meta数据损坏

      • 查看hbase文件夹下文件hadoop fs -ls /hbase
      • 尝试使用habse hack -repairHoles 修复
      • 一定要正常退出hbase,不要轻易使用kill -9
        • 一般stop-hbase.sh, 但有可能没有全部退出
        • hbase-daemon.sh stop master 退出主机master
        • hbase-daemon.sh stop regionserver 退出主机regionserver
        • hbase-daemons.sh stop regionserver 退出集群
    5. 运行一段时间后,regionsever退出:[regionserver/hadoop1:16020] util.Sleeper: We slept 16888ms instead of 3000ms, this is likely due to a long garbage collecting pause and it’s usually bad, see http://hbase.apache.org/book.html#trouble.rs.runtime.zkexpired]

      • 查看日志好像是说gc超时导致regionserver连接不上zk,在hbase-env.sh添加个配置就可以解决。
      • https://blog.csdn.net/vah101/article/details/22923013

anaconda错误

  1. 打开python终端后,退格键和方向键异常
    • export TERMINFO=/usr/share/terminfo
  2. 删除创建的环境失败,命令 conda remove -n test_env
    • 使用conda remove -n test_env --all, 实在不行,就使用 rm -rf
  3. 其实除了上面的问题,还有各种各样很多的问题,最终删了整个anaconda文件夹,重新执行安装anaconda,这次没有指定anaconda的安装路径,全部选择默认的安装操作,安装完毕后,一切正常,所以我猜估计是手动安装时,执行了conda init,初始化脚本配置可能有问题。
  4. 重新安装后就一切正常了,所以我现在暂时不考虑将anaconda的安装过程写到entrypoint.sh,进了容器后在手动执行bash Anaconda3-2020.02-Linux-x86_64.sh,然后一路选择yes就好了;默认安装anaconda在/root路径下

hive错误

  1. 启动报错:java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument
    • hadoop(路径: H A D O O P H O M E / s h a r e / h a d o o p / c o m m o n / l i b ) 中 该 j a r 包 为 g u a v a − 27.0 − j r e . j a r ; 而 h i v e ( 路 径 : HADOOP_HOME/share/hadoop/common/lib)中该jar包为 guava-27.0-jre.jar;而hive(路径: HADOOPHOME/share/hadoop/common/libjarguava27.0jre.jarhive(HIVE_HOME/lib)中该jar包为guava-19.0.1.jar, 将guava-27.0-jre.jar替换guava-19.0.1.jar
  2. Exception in thread “main” java.lang.UnsatisfiedLinkError: /usr/local/app/jdk1.8.0_321/jre/lib/amd64/libmanagement.so: /usr/local/app/jdk1.8.0_321/jre/lib/amd64/libmanagement.so: cannot open shared object file: Input/output error
    • 这个问题很棘手,除了这个错误还有报找不到hadoop路径下的core-site.xml, hdfs-site.xml等文件的; 但是实际上这些文件我的安装路径下都有
    • 花了很长时间。网上也没有人遇到我同样的情况,而且我的hadoop和hbase都能正常启动
    • 后来想了下会不会是hadoop和hbase启动后,对hive启动进程的冲突,停掉了hbase和hadoop后,居然可以初始化hive了!!!!
    • 启动hive是需要hadoop的,所以重启启动了hadoop
    • 看来问题指向是hbase的问题,所以hive就不要安装在hadoop机器上了
  3. 启动hive客户端后,输出了一大堆的info级别和warn级别的log
    • 这个问题也比较棘手,网上一些人说将log日志调整为warn级别,但有人说不行,看了个比较靠谱的,就是hadoop版本比较低,不适合hive3.1.3,所以可以试试降hive版本,或者升hadoop(但是不升hadoop,好不容易搭建好哈哈哈哈。。)
    • https://blog.csdn.net/qq_46548855/article/details/113948405

zookeeper错误

  1. 重新开机启动zookeeper错误:zookeeper … already running as process 1203
    • 原因网上说可能是突然断电,机器异常关机或者程序异常启动,导致上次程序的pid记录在本次启动时冲突,网上最多的解决方案是删除zookeeper datadir下的zookeeper_server.pid文件,但是尴尬的是我在datadir目录下并没有这个文件,只有myid和version-2两个文件(文件夹),那既然这样,我就删除version-2这个文件夹,it work!!! 不过也很神奇,开zkServer.sh启动脚本,确实应该是会在datadir下生成zookeeper_server.pid,可是确没有,这点是我没搞懂的!!!
    • 参考资料
      • 所以zookeeper还是要用正常方式退出,不要强行kill

hadoop0连接不上mysql容器实例

  1. 因为mysql实例是直接用links mysql容器的,最开始的时候在docker-compose没有指定mysql容器使用customnetwork,导致hadoop0容器一直连不上数据库,添加网络后就可以了。

启动页面端

hadoop

namenode localhost:9870

hadoop集群namenode

datanode local:9864

在这里插入图片描述

yarn localhost:8088

在这里插入图片描述

hbase

hbase web端,三台节点正常运行

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要基于Docker搭建Hadoop集群,您需要遵循以下步骤: 1. 安装Docker:您需要在所有节点上安装Docker。可以通过Docker官方文档来了解如何在您的操作系统上安装Docker。 2. 创建Docker镜像:您需要创建包含HadoopDocker镜像。您可以使用Dockerfile来创建镜像,并在其中安装所需的软件包。 3. 创建Docker容器:一旦您创建了Docker镜像,您需要在每个节点上创建Docker容器。您可以使用Docker命令来创建容器。 4. 配置Hadoop集群:您需要配置Hadoop集群,以便每个节点都能够与其他节点通信。您需要编辑Hadoop配置文件,如core-site.xml和hdfs-site.xml,并指定节点的IP地址和端口号。 5. 启动Hadoop集群:最后,您需要启动Hadoop集群。您可以使用启动脚本启动Hadoop集群。 在完成这些步骤后,您应该已经成功地在基于DockerHadoop集群上设置了分布式计算环境。 ### 回答2: 随着大数据技术的发展,hadoop已经成为了很多企业的首选,但是hadoop的部署和维护是一件非常繁琐的事情,需要很多经验和技巧。为了简化这个过程,很多人开始尝试将hadoop集群部署在docker容器中。 Docker是一个开源的容器化平台,可以轻松地部署和运行各种应用程序。Docker的容器可以在任何运行Docker的机器上运行,这使得hadoop的集群可以很容易地部署在任何地方。 基于docker搭建hadoop集群的步骤如下: 1. 安装Docker 首先需要在每台机器上安装Docker。安装过程可以参考Docker官方文档。 2. 创建docker镜像 在第一台机器上创建一个docker镜像,这个镜像可以包含我们需要的hadoop环境。 可以通过Dockerfile创建这个镜像,并且在 Dockerfile 中指定需要的软件包和配置。这个镜像可以包含hadoop,jdk等组件。 3. 部署容器 在第一台机器上使用这个docker镜像创建一个容器,这个容器就是hadoop的NameNode。可以指定hadoop的配置文件,并且可以将hadoop的数据目录挂载到本地硬盘上。 同时,在其他机器上也创建容器,这些容器就是hadoop的DataNode。 4. 启动hadoop服务 启动NameNode容器后,需要进入容器内部,启动hadoop服务。使用hadoop dfsadmin -report 命令可以查看hadoop集群的状态。 5. 配置hadoop集群 hadoop的配置文件可以在NameNode容器内修改,也可以将配置文件挂载到容器内部。配置文件的修改可以通过修改Dockerfile或者手动修改容器内的文件来完成。 一些hadoop集群相关的配置信息需要在hadoop-env.sh,hdfs-site.xml和core-site.xml等文件中进行修改。 6. 测试hadoop集群 在hadoop集群启动后,可以使用hdfs dfs -ls / 命令来测试hadoop集群的正常运行。 基于docker搭建hadoop集群的优点在于部署和维护都非常方便,同时可以快速地扩展集群。Docker容器可以很容易地在不同的主机上运行,并且可以保证集群的统一性。 ### 回答3: Docker是一种轻量级的容器化技术,可以方便快捷地搭建、运行、迁移和管理软件应用,而Hadoop是目前广泛应用于大数据处理和分析的开源平台,使用Hadoop可以有效地解决数据分析和处理的瓶颈问题。基于Docker搭建Hadoop集群,可以实现快速部署与运维,提高集群的可维护性和可扩展性,同时也可以降低运行成本。 以下是基于Docker搭建Hadoop集群的步骤: 1. 安装Docker:首先需要在主机上安装Docker运行环境。 2. 下载Hadoop镜像:从Docker Hub上下载Hadoop镜像,并创建一个自定义的网络。 3. 创建Hadoop节点容器:创建一个Hadoop节点容器,并在其内部配置Hadoop环境变量。 4. 配置Hadoop:配置Hadoop集群的核心配置文件core-site.xml、hdfs-site.xml、yarn-site.xml和mapred-site.xml等。 5. 启动Hadoop集群:使用start-dfs.sh和start-yarn.sh脚本启动Hadoop集群,查看配置是否生效。 6. 部署应用程序:将应用程序放入Hadoop集群中的HDFS文件系统,使用yarn命令启动应用程序。 7. 监控和维护:使用Hadoop的监控和管理工具,对集群进行监控和维护。 基于Docker搭建Hadoop集群具有很多优点,如环境准备简单、扩展性强、可移植性高、资源利用率高等,同时也需要注意安全性和稳定性的问题。在实际应用中,可以根据实际需求,对集群进行灵活配置和管理,以便更好地支持大数据处理和分析任务的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值