featured.png

Hadoop Stack on Docker

Table of Contents

提问:为什么你们 Apache 基金会这么喜欢动物

仓库在这里

下面将会介绍构建的过程、配置、使用和坑。

构建

postgresql-hms

Hive Metastore 会使用的数据库。

唯一干的事情是从外面拷贝了一个初始化脚本。

base

从 Ubuntu 20.04 的镜像开始构建。什么你问我为什么不是 Debian?因为那东西源里面不自带 OpenJDK 8 啊。

  • 既然都是 Hadoop Stack 了那总不能没有 hadoop 用户吧。
# add hadoop user
RUN useradd -m -s /bin/bash hadoop

hadoop

从刚刚构建完成的 base 镜像开始构建。

其实主要就是下载了一个 Hadoop 3.3.0 的预构建的分发版。

spark

从刚刚构建完成的 hadoop 镜像开始构建。

其实主要就是下载了一个 Spark 2.4.7 的预构建的分发版,同时下载了 Scala 2.12.8。

关于 Spark 的版本问题会在之后提及。

hive

从刚刚构建完成的 spark 镜像开始构建。

其实主要就是下载了 Hive 3.1.2 的预构建的分发版和依赖库。

  • Hadoop 的 Grava 版本和 Hive 的不对应。

        # hadoop's guava's version is way higher than hive's
        cp /home/hadoop/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar /home/hadoop/hive/lib/ && \
        rm /home/hadoop/hive/lib/guava-19.0.jar
    
  • 为了支持 Hive on Spark,需要 Spark 有 Hive 的 jars,Hive 有 Spark 的 jars

    不想配 CLASSPATH 的我自然是直接拷贝文件了:

        # hive on spark: jars
        cp /home/hadoop/hive/lib/*.jar /home/hadoop/spark/jars/ && \
        cp /home/hadoop/spark/jars/*.jar /home/hadoop/hive/lib/
    

关于 Hive 的版本问题会在之后提及。

nifi

从构建完成的 base 镜像开始构建。

其实主要就是下载了一个 Nifi 1.12.1 的预构建的分发版。

edge

从构建完成的 base 镜像开始构建。

其实主要就是下载了 Flume 1.9.0,Kafka 2.7.0,Sqoop 1.4.7 的预构建的分发版和 Sqoop 的依赖库。

hue

进行了一个 hue 的服务的配置。

zeppelin

从构建完成的 hive 镜像开始构建。

其实主要就是下载了一个 Zeppelin 0.9.0 的预构建的分发版。

配置

我们将会使用一个 Spark Master,两个 Spark Worker 的配置。Master 的主机名是 nodemaster,两个 Worker 的 主机名分别是 node2 node3

hadoop

需要注意的点:

  • 配置文件中的 workers 中包含了你所有 Worker 的主机名。

spark

需要注意的点:

  • 配置文件中的环境脚本中,可执行文件应使用绝对路径或已经配置好的环境变量进行引导。

使用

仓库

配置时的坑

  • HDFS 初始化的时候一定要格式化。(nodemaster)

  • Hive Metastore 初始化的时候需要调用自己的脚本:不可用别人的备份来还原。

  • 启动 namenode 等报错:相似情况

    观察到如下情况:

    Starting namenodes on [namenode] ERROR: Attempting to operate on hdfs namenode as root ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation. Starting datanodes ERROR: Attempting to operate on hdfs datanode as root ERROR: but there is no HDFS_DATANODE_USER defined. Aborting operation. Starting secondary namenodes [datanode1] ERROR: Attempting to operate on hdfs secondarynamenode as root ERROR: but there is no HDFS_SECONDARYNAMENODE_USER defined. Aborting operation. Starting resourcemanager ERROR: Attempting to operate on yarn resourcemanager as root ERROR: but there is no YARN_RESOURCEMANAGER_USER defined. Aborting operation. Starting nodemanagers ERROR: Attempting to operate on yarn nodemanager as root ERROR: but there is no YARN_NODEMANAGER_USER defined. Aborting operation.

    解决方案:检查初始化脚本中以下几个环境变量:

    start-dfs.sh

    HDFS_DATANODE_USER=<使用 Hadoop 的用户> HADOOP_SECURE_DN_USER=hdfs HDFS_NAMENODE_USER=<使用 Hadoop 的用户> HDFS_SECONDARYNAMENODE_USER=<使用 Hadoop 的用户>

    start-yarn.sh

    YARN_RESOURCEMANAGER_USER=<使用 Hadoop 的用户> HADOOP_SECURE_DN_USER=yarn YARN_NODEMANAGER_USER=<使用 Hadoop 的用户>

  • Spark on Hive 初始化时内存不足。

    • java.lang.IllegalArgumentException: Required executor memory (1024), overhead (384 MB), and PySpark memory (0 MB) is above the max threshold (1024 MB) of this cluster!
    • 提示:Please check the values of 'yarn.scheduler.maximum-allocation-mb' and/or 'yarn.nodemanager.resource.memory-mb'.
    • 修改所有出现这些属性字段对应的值。
    • 注意:我最终并未使用 YARN。
  • Hive on Spark 提交任务后长时间无反应。

    • 检查 Hadoop 中 YarnApplicationState: ACCEPTED: waiting for AM container to be allocated, launched and register with RM.
    • 我猜是 YARN 挂了。
    • 所以我就没用 YARN。
  • 缺少类:

    1. Error: java.lang.RuntimeException: java.lang.NoClassDefFoundError: org/apache/commons/httpclient/HttpConnectionManager

      • 出现在你 Hive 连接 Elasticsearch 的时候。
      • 你需要的是 commons-httpclient-*.jar
    2. Cannot create an instance of InputSplit class = org.elasticsearch.hadoop.hive.EsHiveInputFormat$EsHiveSplit:Class org.elasticsearch.hadoop.hive.EsHiveInputFormat$EsHiveSplit not found

      • 出现在:即使你已经将 Elasticsearch 的 jar 拷贝进 $HIVE_HOME/lib 里,使用 Hive 读取 Elasticsearch 中信息的时候仍然报错。
      • 修改 hive-site.xml,在 hive.aux.jars.path 属性(首先,检查是否有这个属性;没有则创建)中明示出 Elasticsearch 的 jar。
    3. java.lang.NoClassDefFoundError: org/apache/spark/SparkConf

      • 出现在 Hive on Spark 初始化的时候。
      • 这表明你缺少 Spark(spark-core) 的 jar 包。
    4. java.lang.NoClassDefFoundError: scala/Cloneable

      • 和上面同理。
      • 这表明你缺少 Scala 的 jar 包。
    5. Job failed with java.lang.ClassNotFoundException: org.apache.spark.AccumulatorParam

      • 出现在使用 Hive on Spark ,初始化的时候。
      • 这个时候你去找对应 Spark 版本的 spark-core_2.12-*.jar,如果发现找不到这个类那就应该换个 Spark 版本咯。
      • 官网写的版本配置三年没更新了,我这里使用的是 Spark == 2.4.7 和 Hive == 3.1.2。

配置时的小技巧

  • 让 Hive 打出更多等级的 log:

    hive --hiveconf hive.root.logger=INFO,console
    

    INFO 可以替换成别的日志等级。

  • 给 Python 2.7 安装 pip

    wget https://bootstrap.pypa.io/2.7/get-pip.py
    python ./get-pip.py
    
  • 你是 root。在脚本中你想用某人的身份执行一段脚本:

    source (highest vote)

    original

    #!/usr/bin/env bash
    whoami
    sudo -i -u someuser bash << EOF
    echo "In"
    whoami
    EOF
    echo "Out"
    whoami
    

未完待续

Nemo Xiong avatar
Nemo Xiong
我永远喜欢妃爱
comments powered by Disqus