es-spark +docker

Spark provides fast iterative/functional-like capabilities over large data sets, typically by caching data in memory. As opposed to the rest of the libraries mentioned in this documentation, Apache Spark is computing framework that is not tied to Map/Reduce itself however it does integrate with Hadoop, mainly to HDFS. elasticsearch-hadoop allows Elasticsearch to be used in Spark in two ways: through the dedicated support available since 2.1 or through the Map/Reduce bridge since 2.0. Spark 2.0 is supported in elasticsearch-hadoop since version 5.0

Spark 在大型数据集上通过在内存中缓存数据提供快速迭代/函数的功能。Apache Spark 是一个计算框架,它与 Map/Reduce 本身无关,但它确实与 Hadoop 集成,主要是与 HDFS 集成。

在这个镜像中我们采用hadoop的HDFS存储数据,利用spark来处理数据

Dockerfile构建镜像

下面是DockerFile构建镜像

FROM ubuntu:20.04
#FROM:定制的镜像都是基于 FROM 的镜像
RUN apt-get update -y && apt-get install vim -y && apt-get install wget -y && apt-get install ssh -y && apt-get install openjdk-8-jdk -y && apt-get install sudo -y && apt-get install curl -y && apt-get install jq -y
RUN useradd -m elastic && echo "elastic:supergroup" | chpasswd && adduser elastic sudo && echo "elastic     ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && cd /usr/bin/ && sudo ln -s python3 python
# RUN:用于执行后面跟着的命令行命令
#RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。

COPY ssh_config /etc/ssh/ssh_config
#COPY:复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
#它的作用是将本地主机上的ssh_config文件复制到Docker容器中的/etc/ssh/目录下的ssh_config文件中
WORKDIR /home/elastic
#WORKDIR 设置后续指令的工作目录。
#这是一个在Dockerfile中用于设置工作目录的命令。WORKDIR命令会创建一个新的工作目录,并将该目录设置为后续命令执行的默认工作目录。
#在该命令中,/home/elastic是新创建的工作目录的路径。之后的命令将默认在该目录下执行。如果在接下来的命令中需要引用文件或目录,可以使用相对路径来访问它们。例如,如果在该工作目录下有一个名为test.py的文件,可以使用./test.py的方式来执行它。

USER elastic
#USER指定后续指令的用户上下文

ARG HADOOP_VERSION=3.3.1
ARG SPARK_VERSION=3.4.3
ARG SPARK_HADOOP_VERSION=3
ARG ELASTICSEARCH_VERSION=8.6.0
ARG ES_SPARK_SPARK_VERSION=30
ARG ES_SPARK_SCALA_VERSION=2.12
ARG ES_SPARK_ES_VERSION=$ELASTICSEARCH_VERSION
#ARG定义在构建过程中传递给构建器的变量
ARG ES_SPARK_VERSION=${ES_SPARK_SPARK_VERSION}_$ES_SPARK_SCALA_VERSION-$ES_SPARK_ES_VERSION

RUN wget --no-check-certificate https://repo.huaweicloud.com/apache/hadoop/common/hadoop-$HADOOP_VERSION/hadoop-$HADOOP_VERSION.tar.gz && tar zxvf hadoop-$HADOOP_VERSION.tar.gz && rm hadoop-$HADOOP_VERSION.tar.gz
RUN wget https://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-$SPARK_VERSION/spark-$SPARK_VERSION-bin-hadoop$SPARK_HADOOP_VERSION.tgz && tar zxvf spark-$SPARK_VERSION-bin-hadoop$SPARK_HADOOP_VERSION.tgz && rm spark-$SPARK_VERSION-bin-hadoop$SPARK_HADOOP_VERSION.tgz
RUN wget -q https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-$ELASTICSEARCH_VERSION-linux-x86_64.tar.gz && tar zxvf elasticsearch-$ELASTICSEARCH_VERSION-linux-x86_64.tar.gz && rm elasticsearch-$ELASTICSEARCH_VERSION-linux-x86_64.tar.gz
RUN wget -q https://artifacts.elastic.co/downloads/kibana/kibana-$ELASTICSEARCH_VERSION-linux-x86_64.tar.gz && tar zxvf kibana-$ELASTICSEARCH_VERSION-linux-x86_64.tar.gz && rm kibana-$ELASTICSEARCH_VERSION-linux-x86_64.tar.gz
RUN wget -q -O ./elasticsearch-spark-$ES_SPARK_VERSION.jar https://search.maven.org/remotecontent?filepath=org/elasticsearch/elasticsearch-spark-${ES_SPARK_SPARK_VERSION}_$ES_SPARK_SCALA_VERSION/$ES_SPARK_ES_VERSION/elasticsearch-spark-$ES_SPARK_VERSION.jar
RUN ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa && cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys && chmod 0600 ~/.ssh/authorized_keys
#这个命令的作用是让 Docker 容器能够使用 SSH 远程连接到其他主机,通常用于开发和调试时方便与远程主机交互。生成 SSH 密钥对的原理是使用非对称加密算法,生成一对公私钥,其中私钥必须妥善保存在本地,不可以泄露出去,而公钥可以安全地公开。这样,在需要远程登录到另一个主机时,可以将本地的公钥文件添加到对方的 ~/.ssh/authorized_keys 文件中,从而免密登录到对方主机。

#ENV在容器内部设置环境变量
ENV HDFS_NAMENODE_USER elastic
ENV HDFS_DATANODE_USER elastic
ENV HDFS_SECONDARYNAMENODE_USER elastic

ENV YARN_RESOURCEMANAGER_USER elastic
ENV YARN_NODEMANAGER_USER elastic

ENV HADOOP_HOME /home/elastic/hadoop-$HADOOP_VERSION
ENV HADOOP_CONF_DIR=/home/elastic/hadoop-$HADOOP_VERSION/etc/hadoop/
ENV ES_HOME /home/elastic/elasticsearch-$ELASTICSEARCH_VERSION
ENV KIBANA_HOME /home/elastic/kibana-$ELASTICSEARCH_VERSION
RUN echo "export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64" >> $HADOOP_HOME/etc/hadoop/hadoop-env.sh
RUN echo "server.host: 0.0.0.0" >> $KIBANA_HOME/config/kibana.yml
RUN echo "xpack.security.enabled: false" >> $ES_HOME/config/elasticsearch.yml
RUN echo 'alias es-spark="/home/elastic/spark-'$SPARK_VERSION'-bin-hadoop'$SPARK_HADOOP_VERSION'/bin/spark-shell --master yarn --deploy-mode client --jars /home/elastic/elasticsearch-spark-'$ES_SPARK_VERSION'.jar"' >> ~/.bashrc
RUN echo 'alias es-pyspark="/home/elastic/spark-'$SPARK_VERSION'-bin-hadoop'$SPARK_HADOOP_VERSION'/bin/pyspark --master yarn --deploy-mode client --jars /home/elastic/elasticsearch-spark-'$ES_SPARK_VERSION'.jar"' >> ~/.bashrc
COPY core-site.xml $HADOOP_HOME/etc/hadoop/
COPY hdfs-site.xml $HADOOP_HOME/etc/hadoop/
COPY yarn-site.xml $HADOOP_HOME/etc/hadoop/
COPY docker-entrypoint.sh $HADOOP_HOME/etc/hadoop/

# :$HADOOP_HOME/bin:$HADOOP_HOME/sbin:这个变量表示需要将 Hadoop 的 bin 和 sbin 目录添加到 PATH 环境变量中,以便在 Docker 容器中可以使用 Hadoop 的命令行工具。
ENV PATH $PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
# EXPOSE声明容器运行时监听的特定网络端口
EXPOSE 50070 50075 50010 50020 50090 8020 9000 9864 9870 10020 19888 8088 8030 8031 8032 8033 8040 8042 22 9200 9300 5601
#ENTRYPOINT	设置容器创建时的主要命令(不会被docker run时指定的参数覆盖)
#ENTRYPOINT ["${HADOOP_HOME}/etc/hadoop/docker-entrypoint.sh"]
ENTRYPOINT "${HADOOP_HOME}/etc/hadoop/docker-entrypoint.sh"
#这个指令用于设置容器启动时的入口点,指定了一个脚本文件 docker-entrypoint.sh,该脚本文件位于 Hadoop 的 etc/hadoop 目录下,用于在容器启动时执行一些初始化操作。

RUN apt-get update -y && apt-get install vim -y && apt-get install wget -y && apt-get install ssh -y && apt-get install openjdk-8-jdk -y && apt-get install sudo -y && apt-get install curl -y && apt-get install jq -y

更新Ubuntu操作系统的软件包列表(apt-get update -y)。
安装vim编辑器(apt-get install vim -y)。
安装wget下载工具(apt-get install wget -y)。
安装ssh客户端和服务器(apt-get install ssh -y)。
安装Java开发工具包JDK(apt-get install openjdk-8-jdk -y)。
安装sudo命令(apt-get install sudo -y)。
安装curl命令行工具(apt-get install curl -y)。
安装jq命令行JSON处理工具(apt-get install jq -y)。
这些软件包都是在Linux操作系统中非常常用的工具,对于一些需要在Docker容器中运行的应用程序而言,这些工具的安装是必须的。


RUN useradd -m elastic && echo "elastic:supergroup" | chpasswd && adduser elastic sudo && echo "elastic     ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && cd /usr/bin/ && sudo ln -s python3 python

创建一个名为elastic的用户,并且在创建用户的同时为其创建一个home目录(-m选项)。设置elastic用户的密码为supergroup。将elastic用户添加到sudoers列表中,使其具有sudo权限。允许elastic用户在执行sudo命令时不需要输入密码(NOPASSWD选项)。在/usr/bin/目录下创建一个名为python的软链接,该软链接指向python3。
这些命令用于在Linux系统上创建一个新的用户,并为该用户配置一些基本的系统设置。在这个例子中,这些命令是为了在一个新的Linux虚拟机上设置一个Elastic用户,以便在该用户下运行一些Spark任务。

ssh的配置文件为:

Host *
   StrictHostKeyChecking no
   UserKnownHostsFile=/dev/nul

Host *: 表示适用于所有的SSH主机。
StrictHostKeyChecking no: 表示在连接SSH主机时,不进行Host Key检查,直接信任主机。Host Key是SSH主机的公钥,用于验证SSH主机的身份,通过Host Key检查可以防止中间人攻击。但在某些场景下,如自动化脚本或CI/CD流水线中,需要自动连接多个SSH主机,如果每次都需要手动验证Host Key,会显著降低效率,因此可以通过设置StrictHostKeyChecking no来跳过Host Key检查。
UserKnownHostsFile=/dev/null: 表示将User Known Hosts文件设置为空,User Known Hosts文件是用于存储SSH主机公钥的本地文件,当首次连接一个SSH主机时,会将其公钥保存到User Known Hosts文件中,之后每次连接时都会验证该公钥。通过将UserKnownHostsFile设置为空,可以避免保存SSH主机公钥,从而进一步降低连接SSH主机的交互和复杂度。

USER elastic

Dockerfile 中设置容器进程所使用的用户身份的命令。这条命令告诉 Docker 在运行容器时,使用 elastic 用户身份运行容器进程。这样可以避免容器进程以 root 用户身份运行,从而提高容器的安全性。
Docker 中的安全策略要求在生产环境中禁止容器以 root 用户身份运行。因为容器进程以 root 用户运行的话,它将拥有对整个主机的完全控制权,这会使得攻击者在容器内部获得了 root 权限后,可以轻松地攻击主机。因此,为了避免这种情况的发生,我们需要为容器进程指定一个非 root 用户身份。
在这里,USER elastic 命令将容器进程的用户身份设置为 elastic 用户。

ARG HADOOP_VERSION=3.3.1
ARG SPARK_VERSION=3.4.3
ARG SPARK_HADOOP_VERSION=3
ARG ELASTICSEARCH_VERSION=8.6.0

这些参数可以在构建镜像时通过 --build-arg 参数来覆盖默认值,例如:
docker build --build-arg SPARK_VERSION=3.1.2 -t myimage .
这里将 SPARK_VERSION 的值覆盖为 3.1.2,然后构建名为 myimage 的 Docker 镜像。

ENV HDFS_NAMENODE_USER elastic
ENV HDFS_DATANODE_USER elastic
ENV HDFS_SECONDARYNAMENODE_USER elastic
ENV YARN_RESOURCEMANAGER_USER elastic
ENV YARN_NODEMANAGER_USER elastic
ENV HADOOP_HOME /home/elastic/hadoop-$HADOOP_VERSION

这段代码为一些 Hadoop、Elasticsearch 和 Kibana 相关的环境变量设置了默认值,其中包括:
HDFS_NAMENODE_USER:HDFS NameNode 进程的运行用户。
HDFS_DATANODE_USER:HDFS DataNode 进程的运行用户。
HDFS_SECONDARYNAMENODE_USER:HDFS SecondaryNameNode 进程的运行用户。
YARN_RESOURCEMANAGER_USER:YARN ResourceManager 进程的运行用户。
YARN_NODEMANAGER_USER:YARN NodeManager 进程的运行用户。
通过设置这些用户,可以使 HDFS 和 YARN 的进程以指定的用户身份运行,从而提高安全性和管理性。
HADOOP_HOME:Hadoop 的安装路径。
HADOOP_CONF_DIR:Hadoop 配置文件的路径。
ES_HOME:Elasticsearch 的安装路径。
KIBANA_HOME:Kibana 的安装路径。
这些环境变量可以在 Docker 容器启动时通过 -e 参数传入,如果没有指定则使用默认值。这种方式可以方便地修改容器的配置,而不需要修改 Dockerfile 和重新构建镜像。这些环境变量可以在 Docker 容器启动时通过 -e 参数传入,如果没有指定则使用默认值。这种方式可以方便地修改容器的配置,而不需要修改 Dockerfile 和重新构建镜像。

RUN echo "export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64" >> $HADOOP_HOME/etc/hadoop/hadoop-env.sh
RUN echo "server.host: 0.0.0.0" >> $KIBANA_HOME/config/kibana.yml
RUN echo "xpack.security.enabled: false" >> $ES_HOME/config/elasticsearch.yml

这是在 Dockerfile 中进行一些配置,具体作用如下:
设置 Java 环境变量:由于 Hadoop 和 Spark 是 Java 编写的,因此需要设置 JAVA_HOME 环境变量,将其指向 Java 安装路径。
修改 Kibana 配置:将 Kibana 的监听地址设置为 0.0.0.0,表示可以接受来自任何 IP 地址的请求。
关闭 Elasticsearch 安全验证:将 Elasticsearch 的 xpack.security.enabled 参数设置为 false,关闭 Elasticsearch 的安全验证机制。

RUN echo 'alias es-pyspark="/home/elastic/spark-'$SPARK_VERSION'-bin-hadoop'$SPARK_HADOOP_VERSION'/bin/pyspark --master yarn --deploy-mode client --jars /home/elastic/elasticsearch-spark-'$ES_SPARK_VERSION'.jar"' >> ~/.bashrc

这一行命令的作用是将一个别名 (alias) 添加到当前用户的 shell 配置文件 ~/.bashrc 中,方便用户在命令行中启动 PySpark。

具体来说,这一行命令实现的功能如下:
在命令行中执行 pyspark 命令时,会自动设置 Spark 的主节点地址为 yarn,并将应用程序的部署模式设置为 client。
添加了 --jars 选项,将 Elasticsearch 的 Spark Connector (即 elasticsearch-spark.jar) 添加到 PySpark 的 classpath 中。
将别名设置为 es-pyspark,这样用户可以通过在命令行中输入 es-pyspark 来启动 PySpark,并自动加载 Elasticsearch 的 Spark Connector。
将这个别名添加到当前用户的 shell 配置文件 ~/.bashrc 中,这样每次登录时都会自动加载该别名,不需要再手动添加。
这样用户在登录到容器后,只需要打开一个新的终端窗口,输入 es-pyspark 命令即可启动 PySpark 并自动加载 Elasticsearch 的 Spark Connector。

COPY core-site.xml $HADOOP_HOME/etc/hadoop/
COPY hdfs-site.xml $HADOOP_HOME/etc/hadoop/
COPY yarn-site.xml $HADOOP_HOME/etc/hadoop/
COPY docker-entrypoint.sh $HADOOP_HOME/etc/hadoop/
具体来说,它们的作用如下:
COPY core-site.xml $HADOOP_HOME/etc/hadoop/:将本地文件系统中的 core-site.xml 文件复制到 Hadoop 的配置目录 $HADOOP_HOME/etc/hadoop/ 下。core-site.xml 文件是 Hadoop 的核心配置文件,它包含了访问 HDFS 的配置信息,如 HDFS 的命名节点地址、副本数量等。
COPY hdfs-site.xml $HADOOP_HOME/etc/hadoop/:将本地文件系统中的 hdfs-site.xml 文件复制到 Hadoop 的配置目录 $HADOOP_HOME/etc/hadoop/ 下。hdfs-site.xml 文件包含了 HDFS 的配置信息,如数据块的大小、副本数量等。
COPY yarn-site.xml $HADOOP_HOME/etc/hadoop/:将本地文件系统中的 yarn-site.xml 文件复制到 Hadoop 的配置目录 $HADOOP_HOME/etc/hadoop/ 下。yarn-site.xml 文件包含了 YARN 的配置信息,如 YARN 的资源管理器地址、节点管理器地址等。
COPY docker-entrypoint.sh $HADOOP_HOME/etc/hadoop/:将本地文件系统中的 docker-entrypoint.sh 文件复制到 Hadoop 的配置目录 $HADOOP_HOME/etc/hadoop/ 下。docker-entrypoint.sh 文件是 Docker 容器的入口脚本,它会在容器启动时自动执行,并完成一些初始化的操作,如启动 SSH 服务、格式化 HDFS 等。```
core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>

fs.defaultFS:这个属性指定了 Hadoop 文件系统的默认名称。fs.defaultFS 是一个 Hadoop 配置属性,用于指定默认的文件系统 URI,即 NameNode 的地址。
hdfs://localhost:9000:这个属性的值是 NameNode 的地址,即 Hadoop 文件系统的默认 URI。在这里,NameNode 的地址是 hdfs://localhost:9000,表示 Hadoop 文件系统运行在本地,监听在 9000 端口上。

hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>

    <property>
        <name>dfs.permissions</name>
        <value>false</value>
    </property>
</configuration>

dfs.replication1:dfs.replication这个属性的值是数据块的副本数量。在这里,数据块的副本数量是 1,即每个数据块只有一个副本。
dfs.permissions:这个属性指定了 HDFS 的权限控制。dfs.permissions 是一个 Hadoop 配置属性,用于指定是否启用 HDFS 的权限控制。
false:这个属性的值是 HDFS 的权限控制状态。

yarn-site.xml
<?xml version="1.0"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->
<configuration>

<!-- Site specific YARN configuration properties -->

    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.env-whitelist</name>
        <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
    </property>i

</configuration>

yarn.nodemanager.aux-services:这个属性指定了 YARN NodeManager 的辅助服务。yarn.nodemanager.aux-services 是一个 Hadoop 配置属性,用于指定 YARN NodeManager 的辅助服务。
mapreduce_shuffle:这个属性的值是 YARN NodeManager 的辅助服务名称。在这里,辅助服务名称是 mapreduce_shuffle。
yarn.nodemanager.env-whitelist:这个属性指定了 YARN NodeManager 可以使用的环境变量列表。yarn.nodemanager.env-whitelist 是一个 Hadoop 配置属性,用于指定 YARN NodeManager 可以使用的环境变量列表。
JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME:这个属性的值是 YARN NodeManager 可以使用的环境变量列表。在这里,YARN NodeManager 可以使用的环境变量包括 JAVA_HOME、HADOOP_COMMON_HOME、HADOOP_HDFS_HOME、HADOOP_CONF_DIR、CLASSPATH_PREPEND_DISTCACHE、HADOOP_YARN_HOME 和 HADOOP_MAPRED_HOME。

docker-entrypoint.sh
#!/bin/bash
sudo service ssh start
if [ ! -d "/tmp/hadoop-hduser/dfs/name" ]; then
        $HADOOP_HOME/bin/hdfs namenode -format
fi
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
nohup $ES_HOME/bin/elasticsearch &> elasticsearch.out &
nohup $KIBANA_HOME/bin/kibana &> kibana.out &
bash
这是一个 Bash 脚本,主要作用是启动 Hadoop、Elasticsearch 和 Kibana。具体来说,它的含义如下:
#!/bin/bash:这是脚本文件的声明部分,用于指定脚本使用 Bash 解释器。
sudo service ssh start:这个命令启动 SSH 服务,以便在集群节点之间进行通信。
if [ ! -d "/tmp/hadoop-hduser/dfs/name" ]; then ... fi:这是一个 if 语句,用于检查 Hadoop NameNode 是否已经格式化。如果 Hadoop NameNode 还没有格式化,则执行格式化操作。
$HADOOP_HOME/bin/hdfs namenode -format:这个命令格式化 Hadoop NameNode。
$HADOOP_HOME/sbin/start-dfs.sh:这个命令启动 Hadoop 分布式文件系统。
$HADOOP_HOME/sbin/start-yarn.sh:这个命令启动 YARN(Yet Another Resource Negotiator),用于管理 Hadoop 集群中的计算资源。
nohup $ES_HOME/bin/elasticsearch &> elasticsearch.out &:这个命令启动 Elasticsearch,将输出日志写入 elasticsearch.out 文件中,并将 Elasticsearch 进程放在后台运行。
nohup $KIBANA_HOME/bin/kibana &> kibana.out &:这个命令启动 Kibana,将输出日志写入 kibana.out 文件中,并将 Kibana 进程放在后台运行。
bash:这个命令是为了让脚本在运行完所有命令后继续保持 Shell 进程的状态,以便用户可以在 Shell 中继续执行其他操作。
总之,这个脚本用于启动 Hadoop、Elasticsearch 和 Kibana 等服务,以便用户可以在集群中进行数据处理和分析。

Docker-Compose编排容器

yml文件如下,规定每个容器的镜像,名称,数据卷挂载,环境以及端口映射等信息

version: '2' 

services:

  namenode:

    image: bde2020/hadoop-namenode:1.1.0-hadoop2.8-java8

    container_name: namenode

    volumes:

      - ./data/namenode:/hadoop/dfs/name

    environment:

      - CLUSTER_NAME=test

    env_file:

      - ./hadoop-hive.env

    ports:

      - 50070:50070

      - 8020:8020

  resourcemanager:

    image: bde2020/hadoop-resourcemanager:1.1.0-hadoop2.8-java8

    container_name: resourcemanager

    environment:

      - CLUSTER_NAME=test

    env_file:

      - ./hadoop-hive.env

    ports:

      - 8088:8088

  historyserver:

    image: bde2020/hadoop-historyserver:1.1.0-hadoop2.8-java8

    container_name: historyserver

    environment:

      - CLUSTER_NAME=test

    env_file:

      - ./hadoop-hive.env

    ports:

      - 8188:8188

  datanode:

    image: bde2020/hadoop-datanode:1.1.0-hadoop2.8-java8

    depends_on: 

      - namenode

    volumes:

      - ./data/datanode:/hadoop/dfs/data

    env_file:

      - ./hadoop-hive.env

    ports:

      - 50075:50075

  nodemanager:

    image: bde2020/hadoop-nodemanager:1.1.0-hadoop2.8-java8

    container_name: nodemanager

    hostname: nodemanager

    environment:

      - CLUSTER_NAME=test

    env_file:

      - ./hadoop-hive.env

    ports:

      - 8042:8042

  hive-server:

    image: bde2020/hive:2.1.0-postgresql-metastore

    container_name: hive-server

    env_file:

      - ./hadoop-hive.env

    environment:

      - "HIVE_CORE_CONF_javax_jdo_option_ConnectionURL=jdbc:postgresql://hive-metastore/metastore"

    ports:

      - "10000:10000"

  hive-metastore:

    image: bde2020/hive:2.1.0-postgresql-metastore

    container_name: hive-metastore

    env_file:

      - ./hadoop-hive.env

    command: /opt/hive/bin/hive --service metastore

    ports:

      - 9083:9083

  hive-metastore-postgresql:

    image: bde2020/hive-metastore-postgresql:2.1.0

    ports:

      - 5432:5432

    volumes:

      - ./data/postgresql/:/var/lib/postgresql/data

  spark-master:

    image: bde2020/spark-master:2.1.0-hadoop2.8-hive-java8

    container_name: spark-master

    hostname: spark-master

    volumes:

      - ./copy-jar.sh:/copy-jar.sh

    ports:

      - 8080:8080

      - 7077:7077

    env_file:

      - ./hadoop-hive.env


  spark-worker:

    image: bde2020/spark-worker:2.1.0-hadoop2.8-hive-java8

    depends_on:

      - spark-master

    environment:

      - SPARK_MASTER=spark://spark-master:7077

    ports:

      - "8081:8081"

    env_file:

      - ./hadoop-hive.env

  mysql-server:

    image: mysql:5.7

    container_name: mysql-server

    ports:

      - "3306:3306"

    environment:

      - MYSQL_ROOT_PASSWORD=zhangyang517

    volumes:

      - ./data/mysql:/var/lib/mysql

  elasticsearch:

    image: elasticsearch:6.5.3

    environment:

      - discovery.type=single-node

    ports:

      - "9200:9200"

      - "9300:9300"

    networks: 

      - es_network

  kibana:

    image: kibana:6.5.3

    ports:

      - "5601:5601"

    networks: 

      - es_network

networks:

  es_network:

    external: true

在hadoop-hive.env文件中,主要是一些配置信息:

HIVE_SITE_CONF_javax_jdo_option_ConnectionURL=jdbc:postgresql://hive-metastore-postgresql/metastore
HIVE_SITE_CONF_javax_jdo_option_ConnectionDriverName=org.postgresql.Driver
HIVE_SITE_CONF_javax_jdo_option_ConnectionUserName=hive
HIVE_SITE_CONF_javax_jdo_option_ConnectionPassword=hive
HIVE_SITE_CONF_datanucleus_autoCreateSchema=false
HIVE_SITE_CONF_hive_metastore_uris=thrift://hive-metastore:9083
HIVE_SITE_CONF_hive_metastore_warehouse_dir=hdfs://namenode:8020/user/hive/warehouse

CORE_CONF_fs_defaultFS=hdfs://namenode:8020
CORE_CONF_hadoop_http_staticuser_user=root
CORE_CONF_hadoop_proxyuser_hue_hosts=*
CORE_CONF_hadoop_proxyuser_hue_groups=*

HDFS_CONF_dfs_webhdfs_enabled=true
HDFS_CONF_dfs_permissions_enabled=false

YARN_CONF_yarn_log___aggregation___enable=true
YARN_CONF_yarn_resourcemanager_recovery_enabled=true
YARN_CONF_yarn_resourcemanager_store_class=org.apache.hadoop.yarn.server.resourcemanager.recovery.FileSystemRMStateStore
YARN_CONF_yarn_resourcemanager_fs_state___store_uri=/rmstate
YARN_CONF_yarn_nodemanager_remote___app___log___dir=/app-logs
YARN_CONF_yarn_log_server_url=http://historyserver:8188/applicationhistory/logs/
YARN_CONF_yarn_timeline___service_enabled=true
YARN_CONF_yarn_timeline___service_generic___application___history_enabled=true
YARN_CONF_yarn_resourcemanager_system___metrics___publisher_enabled=true
YARN_CONF_yarn_resourcemanager_hostname=resourcemanager
YARN_CONF_yarn_timeline___service_hostname=historyserver
YARN_CONF_yarn_resourcemanager_address=resourcemanager:8032
YARN_CONF_yarn_resourcemanager_scheduler_address=resourcemanager:8030
YARN_CONF_yarn_resourcemanager_resource__tracker_address=resourcemanager:8031

这段配置代码是一些关于 Hive、Hadoop 和 YARN 的配置信息,主要包括以下内容:

Hive的配置信息:
javax.jdo.option.ConnectionURL:Hive 元数据存储在 PostgreSQL 数据库中,这里指定了连接字符串。
javax.jdo.option.ConnectionDriverName:指定了使用的 JDBC 驱动。
javax.jdo.option.ConnectionUserName:指定连接数据库的用户名。
javax.jdo.option.ConnectionPassword:指定连接数据库的密码。
datanucleus.autoCreateSchema:指定是否自动创建元数据表。
hive.metastore.uris:指定了 Hive 元数据服务的地址。
hive.metastore.warehouse.dir:指定了 Hive 的数据仓库地址。
Hadoop的配置信息:
fs.defaultFS:指定了 Hadoop 集群的文件系统地址。
hadoop.proxyuser.hue.hosts:指定了允许使用 Hue 用户进行代理访问的主机地址。
hadoop.proxyuser.hue.groups:指定了允许使用 Hue 用户进行代理访问的用户组。
YARN的配置信息:
yarn.log-aggregation-enable:开启日志聚合功能。
yarn.resourcemanager.recovery.enabled:开启 ResourceManager 的故障恢复功能。
yarn.resourcemanager.store.class:指定 ResourceManager 的状态存储方式。
yarn.resourcemanager.fs-state-store.uri:指定了状态存储在 HDFS 中的路径。
yarn.nodemanager.remote-app-log-dir:指定了 NodeManager 的应用日志目录。
yarn.timeline-service-enabled:开启 Timeline Service 功能。
yarn.timeline-service-generic-application-history-enabled:开启 Timeline Service 的应用历史记录功能。
yarn.resourcemanager-system-metrics-publisher-enabled:开启 ResourceManager 的系统指标发布功能。
yarn.resourcemanager.hostname:指定了 ResourceManager 的主机名。
yarn.timeline-service.hostname:指定了 Timeline Service 的主机名。
yarn.resourcemanager.address:指定了 ResourceManager 的地址。
yarn.resourcemanager.scheduler.address:指定了 ResourceManager 的调度器地址。
yarn.resourcemanager.resource-tracker.address:指定了 ResourceManager 的资源追踪器地址。
这些配置信息可用于 Hive、Hadoop 和 YARN 的性能优化和调试。

关于Docker的安装参考这篇标准答案

posted @ 2024-06-13 14:37  PostMan_Zc  阅读(13)  评论(0编辑  收藏  举报