构建镜像
创建hive目录,把hived的tar包、hadoop的tar包以及dockerfile都放在目录下面
mkdir hive
编写dockerfile
FROM jdk:alpineRUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g" /etc/apk/repositoriesRUN apk update && apk upgradeRUN apk add openssh vim openrc bash bash-doc bash-completion --no-cacheRUN sed -i "s/#PermitRootLogin.*/PermitRootLogin yes/g" /etc/ssh/sshd_configADD apache-hive-2.3.4-bin.tar.gz /optADD hadoop-2.7.2.tar.gz /optENV HADOOP_CONF_DIR /opt/hadoop-2.7.2/etc/hadoopENV HIVE_HOME /opt/apache-hive-2.3.4-binENV HADOOP_HOME /opt/hadoop-2.7.2ENV PATH $JAVA_HOME/bin:$PATH
基础镜像是我自己基于alpine构建的jdk镜像
构建
docker build -t hive:alpine --squash .#给镜像打标签docker tag hive:alpine 192.168.0.16:5000/hive:alpine#将镜像推送到私仓docker push 192.168.0.16:5000/hive:alpine
构建DB tool镜像
安装gradle并编译DB tool
下载gradle:https://services.gradle.org/distributions/
将下载的gradle-5.1-bin.zip 上传到hive目录
unzip gradle-5.1-bin.zipmkdir /opt/gradlemv gradle-4.10.2 /opt/gradle/add in /etc/profileexport PATH=.:/opt/gradle/gradle-4.10.2/bin:$PATHsource /etc/profilegradle --version
拉取database-tools
git clone https://github.com/chenlein/database-tools.gitcd database-tools/edit build.gradle to remove dm driver#把下面这一行删掉,不然编译的时候会报错"compile group: 'dm', name: 'Dm7JdbcDriver', version: '7.1', classifier: 'jdk17-20170808'"ls build/distributions/database-tools-1.0-SNAPSHOT.tarcp build/distributions/database-tools-1.0-SNAPSHOT.tar ./
编写Dockerfile
FROM jdk:alpineMAINTAINER lbzCMD ["mkdir", "-p", "/opt/db_tools"]WORKDIR /opt/db_toolsADD database-tools-1.0-SNAPSHOT.tar .RUN ["chmod", "+x", "./database-tools-1.0-SNAPSHOT/bin/database-tools"]RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g" /etc/apk/repositoriesRUN apk update && apk upgradeRUN apk add openssh vim openrc bash bash-doc bash-completion procps --no-cacheRUN sed -i "s/#PermitRootLogin.*/PermitRootLogin yes/g" /etc/ssh/sshd_configCMD ["./database-tools-1.0-SNAPSHOT/bin/database-tools"]
编译镜像
docker build -t database-tools:1.0-SNAPSHOT .docker tag database-tools:1.0-SNAPSHOT 192.168.0.16:5000/database-tools:1.0-SNAPSHOTdocker push 192.168.0.16:5000/database-tools:1.0-SNAPSHOT
部署hive
创建pv和pvc
hivepv.yaml
apiVersion: v1kind: PersistentVolumemetadata:name: hive-data-1labels:type: localapp: hivespec:capacity:storage: 20GiaccessModes:- ReadWriteOncehostPath:path: /opt/hivepersistentVolumeReclaimPolicy: Recycle---kind: PersistentVolumeClaimapiVersion: v1metadata:name: hive-dataspec:accessModes:- ReadWriteOnceresources:requests:storage: 20Gi
部署mysql服务
mysql.yaml
apiVersion: v1kind: Secretmetadata:name: hive-metadata-mysql-secretlabels:app: hive-metadata-mysqltype: Opaquedata:mysql-root-password: RGFtZW5nQDc3Nw==---apiVersion: apps/v1kind: Deploymentmetadata:labels:app: hive-metadata-mysqlname: hive-metadata-mysqlspec:replicas: 1revisionHistoryLimit: 10selector:matchLabels:app: hive-metadata-mysqltemplate:metadata:labels:app: hive-metadata-mysqlspec:initContainers:- name: remove-lost-foundimage: busybox:1.29.2imagePullPolicy: IfNotPresentcommand: ["rm", "-rf", "/var/lib/mysql/lost+found"]volumeMounts:- name: datamountPath: /var/lib/mysqlcontainers:- name: mysqlimage: mysql:5.7volumeMounts:- name: datamountPath: /var/lib/mysqlports:- containerPort: 3306protocol: TCPenv:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:name: hive-metadata-mysql-secretkey: mysql-root-passwordvolumes:- name: dataemptyDir: {}---kind: ServiceapiVersion: v1metadata:labels:app: hive-metadata-mysqlname: hive-metadata-mysql-servicespec:ports:- name: tcpport: 3306targetPort: 3306selector:app: hive-metadata-mysqltype: NodePort
部署hive配置
hive-config.yaml
apiVersion: v1kind: ConfigMapmetadata:name: hive-custom-config-cmlabels:app: hivedata:bootstrap.sh: |-#!/bin/bashset -xcd /opt/bootstrap# Apply custom config file contextfor cfg in ./*; doif [[ ! "$cfg" =~ bootstrap.sh ]]; thenecho $cfgcat $cfgcat $cfg > $HIVE_HOME/conf/${cfg##*/}fidone# Replace hive metadata passwordsed -i 's/${HIVE_METADATA_PASSWORD}/'$HIVE_METADATA_PASSWORD'/g' `grep '${HIVE_METADATA_PASSWORD}' -rl $HIVE_HOME/conf`# initSchemaecho "step 1"if [[ ! -e $HADOOP_CONF_DIR/hive-metastore-initialization.out ]]; thenecho "step 2"$HADOOP_HOME/bin/hadoop fs -mkdir -p /tmp$HADOOP_HOME/bin/hadoop fs -mkdir -p /user/hive/warehouse$HADOOP_HOME/bin/hadoop fs -chmod g+w /tmp$HADOOP_HOME/bin/hadoop fs -chmod g+w /user/hive/warehouse$HIVE_HOME/bin/schematool -dbType mysql -initSchema --verbose &> $HADOOP_CONF_DIR/hive-metastore-initialization.outfiecho "step 3"$HIVE_HOME/bin/hiveserver2 &$HIVE_HOME/bin/hive --service metastore &cp $HIVE_HOME/conf/hive-env.sh.template $HIVE_HOME/conf/hive-env.sh && echo "export HADOOP_CLIENT_OPTS=\"-Xmx512m -XX:MaxPermSize=1024m \$HADOOP_CLIENT_OPTS\"" >> $HIVE_HOME/conf/hive-env.sh# keep runningsleep infinityhive-site.xml: |-<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet type="text/xsl" href="configuration.xsl"?><configuration><property><name>javax.jdo.option.ConnectionUserName</name><value>hive</value></property><property><name>javax.jdo.option.ConnectionPassword</name><value>${HIVE_METADATA_PASSWORD}</value></property><property><name>javax.jdo.option.ConnectionURL</name><value>jdbc:mysql://hive-metadata-mysql-service:3306/metastore?createDatabaseIfNotExist=true&useSSL=false</value></property><property><name>javax.jdo.option.ConnectionDriverName</name><value>com.mysql.jdbc.Driver</value></property><property><name>system:java.io.tmpdir</name><value>/tmp</value></property><property><name>system:user.name</name><value>hive</value></property><property><name>hive.server2.authentication</name><value>NOSASL</value></property><property><name>hive.metastore.schema.verification</name><value>false</value></property><property><name>datanucleus.fixedDatastore</name><value>false</value></property><property><name>datanucleus.autoCreateSchema</name><value>true</value></property><property><name>datanucleus.autoCreateTables</name><value>true</value></property><property><name>datanucleus.autoCreateColumns</name><value>true</value></property><property><name>datanucleus.schema.autoCreateAll</name><value>true</value><description>creates necessary schema on a startup if one doesn't exist. set this to false, after creating it once</description></property></configuration>
部署hive
hive-deploy.yaml
apiVersion: v1kind: ConfigMapmetadata:name: hive-metastore-databaselabels:app: hivedata:execute.sql: |--- create databaseCREATE DATABASE IF not EXISTS metastore DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;-- create user and grant authorizationGRANT ALL ON metastore.* TO 'hive'@'%' IDENTIFIED BY '${IDENTIFIED}';---apiVersion: v1kind: Secretmetadata:name: hive-metastore-secretlabels:app: hivetype: Opaquedata:database-dba-password: RGFtZW5nQDc3Nw==database-user-password: RGFtZW5nQDc3Nw==---apiVersion: apps/v1kind: Deploymentmetadata:name: hivespec:replicas: 1revisionHistoryLimit: 10selector:matchLabels:app: hivetemplate:metadata:labels:app: hivespec:initContainers:- name: init-dababaseimage: 192.168.0.16:5000/database-tools:1.0-SNAPSHOTenv:- name: DRIVER_NAMEvalue: "com.mysql.jdbc.Driver"- name: URLvalue: "jdbc:mysql://hive-metadata-mysql-service:3306/mysql?useUnicode=true&characterEncoding=utf8&useSSL=false"- name: USERNAMEvalue: "root"- name: PASSWORDvalueFrom:secretKeyRef:name: hive-metastore-secretkey: database-dba-password- name: IDENTIFIEDvalueFrom:secretKeyRef:name: hive-metastore-secretkey: database-user-passwordvolumeMounts:- name: init-dababase-volumemountPath: /root/db_tools/scriptcontainers:- name: hiveimage: 192.168.0.16:5000/hive:alpinecommand: ["bash", "-c", "cp /opt/bootstrap/bootstrap.sh /tmp/ && chmod +x /tmp/bootstrap.sh && /tmp/bootstrap.sh"]ports:- containerPort: 10000- containerPort: 10002- containerPort: 9083env:- name: HADOOP_CONF_DIRvalue: /opt/hadoop-2.7.2/etc/hadoop- name: HIVE_METADATA_PASSWORDvalueFrom:secretKeyRef:name: hive-metastore-secretkey: database-user-passwordvolumeMounts:- name: hadoop-config-volumemountPath: /etc/hadoop- name: hive-custom-config-volumemountPath: /opt/bootstrapreadinessProbe:initialDelaySeconds: 20periodSeconds: 5tcpSocket:port: 10000volumes:- name: hadoop-config-volumepersistentVolumeClaim:claimName: hive-data- name: hive-custom-config-volumeconfigMap:name: hive-custom-config-cm- name: init-dababase-volumeconfigMap:name: hive-metastore-database---kind: ServiceapiVersion: v1metadata:labels:app: hivename: hive-servicespec:ports:- port: 10000targetPort: 10000name: thrift- port: 10002targetPort: 10002name: webui- port: 9083targetPort: 9083name: metastoreselector:app: hivetype: NodePort
依次启动上面所配置的yaml文件
kubectl create -f hivepv.yamlkubectl create -f mysql.yamlkubectl create -f hive-config.yamlkubectl create -f hive-deploy.yaml
查看部署结果
kubectl get podsNAME READY STATUS RESTARTS AGEhadoop-datanode-1 1/1 Running 0 39hhadoop-datanode-2 1/1 Running 0 39hhadoop-datanode-3 1/1 Running 0 39hhdfs-master 1/1 Running 0 39hhive-7d49bc9cd4-jrg6q 1/1 Running 0 150mhive-metadata-mysql-f675498d5-gjdcf 1/1 Running 0 14hyarn-master 1/1 Running 0 39hyarn-node-1 1/1 Running 0 39hyarn-node-2 1/1 Running 0 39hyarn-node-3 1/1 Running 0 39h
参考
CSDN:在Kubernetes上部署Hive
https://blog.csdn.net/chenleiking/article/details/82492282
