架构设计100-实践03-用Docker搭建Hive

简介: 架构设计100-实践03-用Docker搭建Hive

架构设计系列文章,请参见连接。

背景

因为现在很多云都使用PAAS的方式提供大数据存储与计算的功能。作者就在思考他们是怎样实现的,并且提供出动态部署能力的大数据存储与计算过程的。所以,使用Docker进行Hadoop环境的搭建。并且为之后的K8s环境搭建提供一种思路。

在环境构建与使用的过程可以分为几个阶段:准备过程,搭建过程,配置过程,启动过程、测试过程。

准备过程

主要是准备软件包,并为Docker镜像与配置项分离做准备。

  • 准备软件包

    下载以下软件包:

  • 创建目录

    mkdir -p /home/docker/{
         centos_ssh,hadoop,hive,mysql}
    
  • 上传文件
    cd /home/docker/hadoop
    rz 【hadoop-2.7.7.tar.gz,jdk-8u231-linux-x64.rpm】
    cd /home/docker/hive
    rz 【apache-hive-2.3.6-bin.tar.gz,jdk-8u231-linux-x64.rpm,mysql-connector-java-5.1.48.tar.gz】
    
  • 解压并Copy配置
    cd /home/docker/hadoop
    tar -xzvf hadoop-2.7.7.tar.gz
    cp -rf hadoop-2.7.7/etc/hadoop/* ./conf
    cd /home/docker/hive
    tar -xzvf apache-hive-2.3.6-bin.tar.gz
    tar -xzvf mysql-connector-java-5.1.48.tar.gz
    cp -rf apache-hive-2.3.6-bin/conf/ ./conf
    
  • 创建my.cnf
    为Mysql配置my.cfg配置。这个配置是从CDH6.3的配置中拉过来的。
    ```
    [mysqld]
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    transaction-isolation = READ-COMMITTED

    Disabling symbolic-links is recommended to prevent assorted security risks;

    to do so, uncomment this line:

    symbolic-links = 0

key_buffer_size = 32M
max_allowed_packet = 32M
thread_stack = 256K
thread_cache_size = 64
query_cache_limit = 8M
query_cache_size = 64M
query_cache_type = 1

max_connections = 550

expire_logs_days = 10

max_binlog_size = 100M

log_bin should be on a disk with enough free space.

Replace '/var/lib/mysql/mysql_binary_log' with an appropriate path for your

system and chown the specified folder to the mysql user.

log_bin=/var/lib/mysql/mysql_binary_log

In later versions of MySQL, if you enable the binary log and do not set

a server_id, MySQL will not start. The server_id must be unique within

the replicating group.

server_id=1

binlog_format = mixed

read_buffer_size = 2M
read_rnd_buffer_size = 16M
sort_buffer_size = 8M
join_buffer_size = 8M

InnoDB settings

innodb_file_per_table = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 64M
innodb_buffer_pool_size = 4G
innodb_thread_concurrency = 8
innodb_flush_method = O_DIRECT
innodb_log_file_size = 512M

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

sql_mode=STRICT_ALL_TABLES

修改my.cfg权限

chmod 644 my.cnf


# 搭建过程
在这个过程中将上面准备好的包,构建为Docker镜像。

- **搭建Docker+CentOS+SSH环境**

FROM centos:7.2.1511
MAINTAINER wales.kuo

RUN yum install -y wget && mkdir -p /etc/yum.repos.d/repo_bak \
&& mv /etc/yum.repos.d/.repo /etc/yum.repos.d/repo_bak/ \
&& wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo \
&& wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo \
&& yum clean all && yum makecache \
&& yum install -y openssh-server sudo openssh-clients \
&& ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key \
&& ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key \
&& ssh-keygen -t rsa -f /etc/ssh/ssh_host_ecdsa_key \
&& ssh-keygen -t rsa -f /etc/ssh/ssh_host_ed25519_key \
&& echo "root:XXX" | chpasswd && echo "root ALL=(ALL) ALL" >> /etc/sudoers \
&& sed -i 's/.
session.required.pam_loginuid.so./session optional pam_loginuid.so/g' /etc/pam.d/sshd \
&& sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config \
&& sed -i "s/#UsePrivilegeSeparation.
/UsePrivilegeSeparation no/g" /etc/ssh/sshd_config \
&& mkdir /var/run/sshd

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

使用命令构建:

docker build -t centos-ssh .

- **搭建Hadoop环境**

FROM centos-ssh
MAINTAINER wales.kuo

ADD jdk-8u231-linux-x64.rpm /usr/local/
ADD hadoop-2.7.7.tar.gz /usr/local/
RUN yum install -y which gcc && rpm -ivh /usr/local/jdk-8u231-linux-x64.rpm \
&& rm -rf /usr/local/jdk-8u231-linux-x64.rpm
ENV HADOOP_HOME /usr/local/hadoop-2.7.7
ENV JAVA_HOME /usr/java/jdk1.8.0_231-amd64/jre/
ENV PATH $HADOOP_HOME/bin:$PATH

使用命令构建:

docker build -t hadoop:2.7.7 -t centos-hadoop .

- **搭建MetaData的Mysql**

docker pull mysql:5.7.27



- **搭建Hive环境**

FROM centos-hadoop
MAINTAINER wales.kuo

ADD apache-hive-2.3.6-bin.tar.gz /usr/local/
RUN mv /usr/local/apache-hive-2.3.6-bin /usr/local/hive && mkdir /home/hadoop/hive/tmp
ADD mysql-connector-java-5.1.48/mysql-connector-java-5.1.48-bin.jar /usr/local/hive/lib/
ENV HIVE_HOME /usr/local/hive
ENV PATH $HIVE_HOME/bin:$PATH

使用命令构建:

docker build -t hive:2.3.6 -t centos-hive .


# 配置过程
修改Hadoop,Hive的默认参数,准备启动使用。并且因为Hadoop需要免密登录的配置,所以需要先将容器启动,然后再进入容器中免密登录部分。

#### 修改Hadoop参数
hadoop配置修改/home/docker/hadoop/conf/下的配置文件core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml、slaves。

(1)hadoop-env.sh

export JAVA_HOME=/usr/java/jdk1.8.0_231-amd64/jre/

(2)core-site.xml

``` xml
<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://hadoop0:9000</value>
        </property>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/usr/local/hadoop/tmp</value>
        </property>
         <property>
                 <name>fs.trash.interval</name>
                 <value>1440</value>
        </property>
</configuration>

(3)hdfs-site.xml

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

(4)yarn-site.xml

<configuration>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
        <property> 
                <name>yarn.log-aggregation-enable</name> 
                <value>true</value> 
        </property>
        <property>
                <description>The hostname of the RM.</description>
                <name>yarn.resourcemanager.hostname</name>
                <value>hadoop0</value>
        </property>
</configuration>

(5)修改文件名:mv mapred-site.xml.template mapred-site.xml
vi mapred-site.xml

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

(10)slaves
删除原来的所有内容,修改为如下

hadoop1
hadoop2

修改Hive参数

使用hive的默认配置,创建配置文件。并修改配置。
(1)Copy创建配置文件

cp hive-env.sh.template hive-env.sh
cp hive-default.xml.template hive-site.xml
cp hive-log4j2.properties.template hive-log4j2.properties
cp hive-exec-log4j2.properties.template hive-exec-log4j2.properties

(2)修改hive-env.sh

export JAVA_HOME=/usr/java/jdk1.8.0_231-amd64/jre/    ##Java路径
export HADOOP_HOME=/usr/local/hadoop-2.7.7   ##Hadoop安装路径
export HIVE_HOME=/usr/local/hive    ##Hive安装路径
export HIVE_CONF_DIR=/usr/local/hive/conf    ##Hive配置文件路径

(3)修改hive-site.xml

把{system:java.io.tmpdir} 改成 /usr/local/hive/tmp
把 {system:user.name} 改成 {user.name}

并修改以下内容

<property>
    <name>hive.exec.scratchdir</name>
    <value>/user/hive/tmp</value>
</property>
<property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/user/hive/warehouse</value>
</property>
<property>
    <name>hive.querylog.location</name>
    <value>/user/hive/log</value>
</property>

<!--配置 MySQL 数据库连接信息-->
<property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://mysql:3306/metastore?createDatabaseIfNotExist=true&characterEncoding=UTF-8&useSSL=false</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>root123</value>
  </property>

启动容器

version: '3.1'

services:
  db:
    image: mysql:5.7.27
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    ports:
      - 3306:3306
    volumes:
      - /home/docker/mysql/log:/var/log/
      - /home/docker/mysql/my.cnf:/etc/my.cnf
      - /home/docker/mysql/data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: dls123456



docker network create --subnet=172.19.0.0/16 hadoop_default
docker run --name hadoop0 --hostname hadoop0 --net hadoop_default --ip 172.19.0.2 -v /home/docker/hadoop/conf:/usr/local/hadoop-2.7.7/etc/hadoop/ -v /home/docker/hadoop/hadoop0:/usr/local/hadoop/tmp -v /home/docker/hadoop/hadoop0/logs:/usr/local/hadoop-2.7.7/logs/ -d -P -p 50070:50070 -p 8088:8088  centos-hadoop
docker run --name hadoop1 --hostname hadoop1 --net hadoop_default --ip 172.19.0.3 -v /home/docker/hadoop/conf:/usr/local/hadoop-2.7.7/etc/hadoop/ -v /home/docker/hadoop/hadoop1:/usr/local/hadoop/tmp  -v /home/docker/hadoop/hadoop0/logs:/usr/local/hadoop-2.7.7/logs/ -d -P centos-hadoop
docker run --name hadoop2 --hostname hadoop2 --net hadoop_default --ip 172.19.0.4 -v /home/docker/hadoop/conf:/usr/local/hadoop-2.7.7/etc/hadoop/ -v /home/docker/hadoop/hadoop2:/usr/local/hadoop/tmp  -v /home/docker/hadoop/hadoop0/logs:/usr/local/hadoop-2.7.7/logs/ -d -P centos-hadoop
docker run -d --name mysql --hostname mysql --restart=always -p 3306:3306 -v /home/docker/mysql/log:/var/log/ -v /home/docker/mysql/my.cnf:/etc/my.cnf -v /home/docker/mysql/data:/var/lib/mysql --net hadoop_default -e MYSQL_ROOT_PASSWORD=dls123456 mysql:5.7.27 --default-authentication-plugin=mysql_native_password
docker run --name hive --hostname hive --net hadoop_default --ip 172.19.0.6 -p9083:9083 -p 10000:10000 -p 10002:10002 -v /home/docker/hive/conf:/usr/local/hive/conf -v /home/docker/hive/tmp:/usr/local/hive/tmp -v /home/docker/hive/data:/user/hive/ -v /home/docker/hadoop/conf:/usr/local/hadoop-2.7.7/etc/hadoop/ -v /home/docker/hadoop/hadoop0:/usr/local/hadoop/tmp -v /home/docker/hadoop/hadoop0/logs:/usr/local/hadoop-2.7.7/logs/ -d -P centos-hive

创建数据库

create database metastore;

容器内Hadoop配置

(1)设置ssh免密码登录
在hadoop0上执行下面操作

ssh-keygen -t rsa(一直按回车即可)
ssh-copy-id -i localhost
ssh-copy-id -i hadoop0
ssh-copy-id -i hadoop1
ssh-copy-id -i hadoop2

在hadoop1上执行下面操作

ssh-keygen -t rsa(一直按回车即可)
ssh-copy-id -i localhost
ssh-copy-id -i hadoop1

在hadoop2上执行下面操作

ssh-keygen -t rsa(一直按回车即可)
ssh-copy-id -i localhost
ssh-copy-id -i hadoop2

容器内Hive配置

(1)初始化Hive mysql数据库

schematool -dbType mysql -initSchema

启动服务

(1)启动Hadoop服务

cd /usr/local/hadoop-2.7.7/
sbin/start-all.sh

(2)启动Hive服务

hive --service metastore &
hiveserver2

(3)在hdfs 中创建下面的目录 ,并且授权

hdfs dfs -mkdir -p /user/hive/warehouse
hdfs dfs -mkdir -p /user/hive/tmp
hdfs dfs -mkdir -p /user/hive/log
hdfs dfs -chmod -R 777 /user/hive/warehouse
hdfs dfs -chmod -R 777 /user/hive/tmp
hdfs dfs -chmod -R 777 /user/hive/log

测试过程

hadoop测试

使用程序验证集群服务
(1)创建一个本地文件a.txt

hello you
hello me

(2)上传a.txt到hdfs上

hdfs dfs -put a.txt /

(3)执行wordcount程序

cd /usr/local/hadoop-2.7.7/share/hadoop/mapreduce
hadoop jar hadoop-mapreduce-examples-2.7.7.jar wordcount /a.txt /out

(4)查看结果

hdfs dfs -text /out/part-r-00000

参考

Kubernetes-在Kubernetes集群上搭建Hadoop集群
Docker+Hadoop+Hive+Presto 使用Docker部署Hadoop环境和Presto
Install and Configure MySQL for Cloudera Software

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
10月前
|
数据采集 监控 API
移动端性能监控探索:iOS RUM SDK 技术架构与实践
阿里云 RUM SDK 作为一款性能体验监控采集工具,可以作为辅助 App 运维的强有力助手,提升您的问题排查效率。
518 74
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
1433 108
|
11月前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
2583 10
|
10月前
|
存储 运维 分布式计算
零售数据湖的进化之路:滔搏从Lambda架构到阿里云Flink+Paimon统一架构的实战实践
在数字化浪潮席卷全球的今天,传统零售企业面临着前所未有的技术挑战和转型压力。本文整理自 Flink Forward Asia 2025 城市巡回上海站,滔搏技术负责人分享了滔搏从传统 Lambda 架构向阿里云实时计算 Flink 版+Paimon 统一架构转型的完整实战历程。这不仅是一次技术架构的重大升级,更是中国零售企业拥抱实时数据湖仓一体化的典型案例。
680 0
|
11月前
|
数据采集 存储 运维
MyEMS:技术架构深度剖析与用户实践支持体系
MyEMS 是一款开源能源管理系统,采用分层架构设计,涵盖数据采集、传输、处理与应用全流程,支持多协议设备接入与多样化能源场景。系统具备高扩展性与易用性,结合完善的文档、社区、培训与定制服务,助力不同技术背景用户高效实现能源数字化管理,降低使用门槛与运维成本,广泛适用于工业、商业及公共机构等场景。
465 0
|
11月前
|
数据采集 运维 数据可视化
AR 运维系统与 MES、EMA、IoT 系统的融合架构与实践
AR运维系统融合IoT、EMA、MES数据,构建“感知-分析-决策-执行”闭环。通过AR终端实现设备数据可视化,实时呈现温度、工单等信息,提升运维效率与生产可靠性。(238字)
|
算法 物联网 定位技术
蓝牙室内定位技术解决方案:核心技术架构与优化实践
本文探讨了蓝牙iBeacon与Lora结合的室内定位技术,分析其在复杂室内环境中的优势与挑战。通过三层架构实现高精度定位,并提出硬件、算法与部署优化方向,助力智慧仓储、医疗等场景智能化升级。
654 0
蓝牙室内定位技术解决方案:核心技术架构与优化实践
|
11月前
|
缓存 安全 Linux
优化Docker镜像大小的多阶段构建实践
优化Docker镜像大小的多阶段构建实践
595 99
|
10月前
|
存储 SQL 消息中间件
从 ClickHouse 到 StarRocks 存算分离: 携程 UBT 架构升级实践
查询性能实现从秒级到毫秒级的跨越式提升
|
数据采集 人工智能 安全
开源赋能双碳:MyEMS 能源管理系统的架构与实践价值
在全球碳中和趋势与“双碳”目标推动下,能源管理趋向精细化与智能化。MyEMS是一款基于Python开发的开源能源管理系统,具备灵活适配、功能全面的优势,覆盖工厂、建筑、数据中心等多元场景。系统支持能源数据采集、分析、可视化及设备管理、故障诊断、AI优化控制等功能,提供“监测-分析-优化”闭环解决方案。遵循“国家+省级+接入端”三级架构,MyEMS在重点用能单位能耗监测中发挥关键作用,助力实现能源效率提升与政策合规。开源模式降低了技术门槛,推动“双碳”目标落地。
437 0