(作者:陈玓玏)
一、前提
二、镜像封装
因为hive是基于hadoop的,而我们已经摆设好了hadoop,以是直接通过现有hadoop的镜像来封装hive的镜像。helm上也有可以直接利用的chart,但是版本可能和我们需要的不一样,以是还是自己封装比较好。
首先查一下我们的镜像,因为我的hadoop是用helm摆设的,需要先明确一下。
- sudo docker images |grep hadoop
复制代码
用的是3.3.2版本,镜像名是farberg/apache-hadoop。
编写dockerfile如下:
- FROM farberg/apache-hadoop:3.3.2
- RUN rm -f /etc/localtime && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone
- RUN export LANG=zh_CN.UTF-8
- RUN wget https://mirrors.aliyun.com/apache/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz
- ENV HIVE_VERSION 3.1.3
- RUN tar -zxvf apache-hive-3.1.3-bin.tar.gz -C /opt/ && mv /opt/apache-hive-3.1.3-bin /opt/hive
- ENV HIVE_HOME=/opt/hive
- ENV PATH=$HIVE_HOME/bin:$PATH
- #这里mysql的jar包的版本要和后面部署的mysql一致
- RUN wget https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/8.0.32/mysql-connector-j-8.0.32.jar && mv mysql-connector-j-8.0.32.jar /opt/hive/lib/
- WORKDIR /opt/
- # Hdfs ports
- EXPOSE 50010 50020 50070 50075 50090 8020 9000
- # Mapred ports
- EXPOSE 19888
- #Yarn ports
- EXPOSE 8030 8031 8032 8033 8040 8042 8088
- #Other ports
- EXPOSE 49707 2122
复制代码 hive的镜像在这里下载比较快:
https://mirrors.aliyun.com/apache/
dockerfile编写好之后,通过以下命令构建镜像:
- sudo docker build -t ccr.ccs.tencentyun.com/cube-studio/hadoop-hive:v3.3.2-3.1.3 .
复制代码 镜像构建后通过以下命令推送:
- sudo docker push ccr.ccs.tencentyun.com/cube-studio/hadoop-hive:v3.3.2-3.1.3
复制代码 推送好之后,在cube studio平台上,新建一个pipeline,利用自界说镜像模板,填写镜像为ccr.ccs.tencentyun.com/cube-studio/hadoop-hive:v3.3.2-3.1.3,debug,检查目录对不对,检查情况变量是否正确,在命令行输入hive命令,看是否能正常执行。
都正常则表明镜像是没题目标,可以进行下一步了。
三、摆设mysql
这里之前写过了怎么在k8s摆设mysql,以是直接用就可以了。文章链接:https://blog.csdn.net/weixin_39750084/article/details/136366800
四、摆设hive
deployment及service等:
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: hive
- spec:
- replicas: 1
- revisionHistoryLimit: 10
- selector:
- matchLabels:
- app: hive
- template:
- metadata:
- labels:
- app: hive
- spec:
- containers:
- - name: hive
- image: ccr.ccs.tencentyun.com/cube-studio/hadoop-hive:v3.3.2-3.1.3
- command: ["bash", "-c", "bash /root/bootstrap/bootstrap.sh"]
- ports:
- - containerPort: 10000
- - containerPort: 10002
- - containerPort: 9083
- env:
- - name: HADOOP_CONF_DIR
- value: /opt/hadoop/etc/hadoop
- volumeMounts:
- - name: hive-custom-config-volume
- mountPath: /root/bootstrap
- readinessProbe:
- initialDelaySeconds: 20
- periodSeconds: 5
- tcpSocket:
- port: 10000
- volumes:
- - name: hive-custom-config-volume
- configMap:
- name: hive-custom-config-cm
- ---
- kind: Service
- apiVersion: v1
- metadata:
- labels:
- app: hive
- name: hive-service
- spec:
- ports:
- - port: 10000
- targetPort: 10000
- name: thrift
- - port: 10002
- targetPort: 10002
- name: webui
- - port: 9083
- targetPort: 9083
- name: metastore
- selector:
- app: hive
- type: NodePort
复制代码 两个希奇的bug:
摆设好之后,我们可以进pod查察一下hive的日志,像我遇到一个情况就是,hive能用,可以查数据库列表,表列表,但不能插入数据,看pod日志发现报错,重启pod时,再次初始化出现错误Error: Table ‘CTLGS‘ already exists (state=42S01,code=1050),需要进入mysql,删除metastore这个库,再重启hive的pod进行初始化。如果再次进入hive时,不能执行命令,报错java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.Session,表示metastore没重启成功,需要进入hive的pod手动执行一下hive --service metastore &。
不能插入数据的题目,后来发现是没有配置hdfs的地点,在yaml内里加上这个配置就没题目了!须要的配置项肯定不能漏掉!!否则就会出现本地能查到数据,但hdfs中查不到的情况,这样换一台呆板就不能用了!
五、验证
登录ui界面,可以验证是否成功。
六、客户端利用hive
- 验证jdk,通过java -version验证已安装jdk,但没有设置JAVA_HOME,vi ~/.bashrc,设置一下JAVA_HOME,export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64,再source ~/.bashrc让其生效,再次验证,jdk版本只能是8,如果是别的版本,记得更换;jdk最好是用java8,如果版本不对,可以先卸载,再安装正确的版本,再设置情况变量。如果不想总修改情况变量,那么设置/etc/profile比设置~/.bashrc更好。
- 下载hive,跟服务端下载同一个版本:https://mirrors.aliyun.com/apache/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz
- 解压,tar -zxvf apache-hive-3.1.3-bin.tar.gz
- 编辑配置项:
- cd apache-hive-3.1.3-bin/conf
- vi hive-site.xml
复制代码 把下面的配置项粘到hive-site.xml:
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
- <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
- <configuration>
-
- <property>
- <name>hive.metastore.warehouse.dir</name>
- <value>/user/hive/warehouse</value>
- </property>
-
- <property>
- <name>hive.metastore.local</name>
- <value>false</value>
- </property>
-
- <property>
- <name>hive.metastore.uris</name>
- <value>thrift://hive-service.default:9083</value>
- </property>
-
- </configuration>
复制代码- vi /etc/profile
- export HIVE_HOME=/mnt/admin/apache-hive-3.1.3-bin
- export HADOOP_HOME=/mnt/admin/hadoop-3.3.6
- export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre
- export HADOOP_CONF_DIR=/mnt/admin/hadoop-3.3.6/etc/hadoop
- export PATH=$PATH::$HIVE_HOME/bin:$HADOOP_HOME/bin:$JAVA_HOME/bin
- source /etc/profile
复制代码 情况变量写在/etc/profile更好,因为~/.bashrc是暂时的,重启一下pod就复原了,但/etc/profile是全局的,避免一直要重复设置。
- 配置hadoop的yarn
把/mnt/admin/hadoop-3.3.6/etc/hadoop/yarn-site.xml配置成以下这样:
- <configuration>
- <property>
- <name>yarn.nodemanager.aux-services</name>
- <value>mapreduce_shuffle</value>
- </property>
- <property>
- <name>yarn.resourcemanager.hostname</name>
- <value>hadoop-hadoop-yarn-rm-0.hadoop-hadoop-yarn-rm.default</value>
- </property>
- <property>
- <name>yarn.resourcemanager.address</name>
- <value>hadoop-hadoop-yarn-rm-0.hadoop-hadoop-yarn-rm.default:8032</value>
- </property>
- <property>
- <name>yarn.resourcemanager.scheduler.address</name>
- <value>hadoop-hadoop-yarn-rm-0.hadoop-hadoop-yarn-rm.default:8030</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_HOME,PATH,LANG,TZ,HADOOP_MAPRED_HOME</value>
- </property>
- </configuration>
复制代码 操纵完之后,执行hive,可以进入就算成功。
执行hive时可能出现一个错误:
- Caused by: com.ctc.wstx.exc.WstxParsingException: Illegal character entity: expansion character (code 0x8
- at [row,col,system-id]: [3219,96,"file:/mnt/admin/apache-hive-3.1.3-bin/conf/hive-site.xml"],
复制代码 这是因为xml模板中有个特殊字符,找到对应位置,去掉即可;
测试语句示例:
- CREATE TABLE test(
- name string,
- num int)
- PARTITIONED BY (`date` string)
- ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' stored as textfile;
- insert into test partition (`date`='20240523') (name,num) values ('cdl',100);
- insert into test partition (`date`='20240522') (name,num) values ('cdl',100);
复制代码 看是否能正确建表,正确插入数据,正确查询,hdfs中也能正确显示。
参考地点
https://www.cnblogs.com/liugp/p/16747557.html#1%E6%9E%84%E5%BB%BA%E9%95%9C%E5%83%8F
https://blog.csdn.net/chenleiking/article/details/82492282
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |