云原生之深入解析Hadoop如何在K8S环境中部署

news2024/9/25 9:29:14

一、准备工作

  • Hadoop 是 Apache 软件基金会下一个开源分布式计算平台,以 HDFS(Hadoop Distributed File System)、MapReduce(Hadoop2.0 加入了 YARN,Yarn 是资源调度框架,能够细粒度的管理和调度任务,还能够支持其他的计算框架,比如 spark)为核心的 Hadoop 为用户提供了系统底层细节透明的分布式基础架构。
  • HDFS 的高容错性、高伸缩性、高效性等优点让用户可以将 Hadoop 部署在低廉的硬件上,形成分布式系统,目前最新版本已经是 3.x 了,具体可以参考:官方文档。
  • HDFS 如下:

在这里插入图片描述

  • YARN 如下:

在这里插入图片描述

二、添加源

  • Hadoop 地址:Hadoop。
helm repo add apache-hadoop-helm https://pfisterer.github.io/apache-hadoop-helm/
helm pull apache-hadoop-helm/hadoop --version 1.2.0
tar -xf hadoop-1.2.0.tgz

三、构建镜像 Dockerfile

FROM myharbor.com/bigdata/centos:7.9.2009

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

# 创建用户和用户组,跟yaml编排里的spec.template.spec.containers. securityContext.runAsUser: 9999
RUN groupadd --system --gid=9999 admin && useradd --system --home-dir /home/admin --uid=9999 --gid=admin admin

# 安装sudo
RUN yum -y install sudo ; chmod 640 /etc/sudoers

# 给admin添加sudo权限
RUN echo "admin ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

RUN yum -y install install net-tools telnet wget

RUN mkdir /opt/apache/

ADD jdk-8u212-linux-x64.tar.gz /opt/apache/

ENV JAVA_HOME=/opt/apache/jdk1.8.0_212
ENV PATH=$JAVA_HOME/bin:$PATH

ENV HADOOP_VERSION 3.3.2
ENV HADOOP_HOME=/opt/apache/hadoop

ENV HADOOP_COMMON_HOME=${HADOOP_HOME} \
    HADOOP_HDFS_HOME=${HADOOP_HOME} \
    HADOOP_MAPRED_HOME=${HADOOP_HOME} \
    HADOOP_YARN_HOME=${HADOOP_HOME} \
    HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop \
    PATH=${PATH}:${HADOOP_HOME}/bin

#RUN curl --silent --output /tmp/hadoop.tgz https://ftp-stud.hs-esslingen.de/pub/Mirrors/ftp.apache.org/dist/hadoop/common/hadoop-${HADOOP_VERSION}/hadoop-${HADOOP_VERSION}.tar.gz && tar --directory /opt/apache -xzf /tmp/hadoop.tgz && rm /tmp/hadoop.tgz
ADD hadoop-${HADOOP_VERSION}.tar.gz /opt/apache
RUN ln -s /opt/apache/hadoop-${HADOOP_VERSION} ${HADOOP_HOME}

RUN chown -R admin:admin /opt/apache

WORKDIR $HADOOP_HOME

# 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
  • 开始构建镜像:
docker build -t myharbor.com/bigdata/hadoop:3.3.2 . --no-cache

### 参数解释
# -t:指定镜像名称
# . :当前目录Dockerfile
# -f:指定Dockerfile路径
#  --no-cache:不缓存
  • 推送到镜像仓库:
docker push myharbor.com/bigdata/hadoop:3.3.2
  • 调整目录结构:
mkdir hadoop/templates/hdfs hadoop/templates/yarn
mv hadoop/templates/hdfs-* hadoop/templates/hdfs/
mv hadoop/templates/yarn-* hadoop/templates/yarn/

四、修改配置

  • hadoop/values.yaml:
image:
  repository: myharbor.com/bigdata/hadoop
  tag: 3.3.2
  pullPolicy: IfNotPresent

...

persistence:
  nameNode:
    enabled: true
    storageClass: "hadoop-nn-local-storage"
    accessMode: ReadWriteOnce
    size: 10Gi
    local:
    - name: hadoop-nn-0
      host: "local-168-182-110"
      path: "/opt/bigdata/servers/hadoop/nn/data/data1"

  dataNode:
    enabled: true
    storageClass: "hadoop-dn-local-storage"
    accessMode: ReadWriteOnce
    size: 20Gi
    local:
    - name: hadoop-dn-0
      host: "local-168-182-110"
      path: "/opt/bigdata/servers/hadoop/dn/data/data1"
    - name: hadoop-dn-1
      host: "local-168-182-110"
      path: "/opt/bigdata/servers/hadoop/dn/data/data2"
    - name: hadoop-dn-2
      host: "local-168-182-110"
      path: "/opt/bigdata/servers/hadoop/dn/data/data3"
    - name: hadoop-dn-3
      host: "local-168-182-111"
      path: "/opt/bigdata/servers/hadoop/dn/data/data1"
    - name: hadoop-dn-4
      host: "local-168-182-111"
      path: "/opt/bigdata/servers/hadoop/dn/data/data2"
    - name: hadoop-dn-5
      host: "local-168-182-111"
      path: "/opt/bigdata/servers/hadoop/dn/data/data3"
    - name: hadoop-dn-6
      host: "local-168-182-112"
      path: "/opt/bigdata/servers/hadoop/dn/data/data1"
    - name: hadoop-dn-7
      host: "local-168-182-112"
      path: "/opt/bigdata/servers/hadoop/dn/data/data2"
   - name: hadoop-dn-8
      host: "local-168-182-112"
      path: "/opt/bigdata/servers/hadoop/dn/data/data3"

...

service:
  nameNode:
    type: NodePort
    ports:
      dfs: 9000
      webhdfs: 9870
    nodePorts:
      dfs: 30900
      webhdfs: 30870
  dataNode:
    type: NodePort
    ports:
      dfs: 9000
      webhdfs: 9864
    nodePorts:
      dfs: 30901
      webhdfs: 30864
  resourceManager:
    type: NodePort
    ports:
      web: 8088
    nodePorts:
      web: 30088
...

securityContext:
  runAsUser: 9999
  privileged: true
  • hadoop/templates/hdfs/hdfs-nn-pv.yaml:
{{- range .Values.persistence.nameNode.local }}
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: {{ .name }}
  labels:
    name: {{ .name }}
spec:
  storageClassName: {{ $.Values.persistence.nameNode.storageClass }}
  capacity:
    storage: {{ $.Values.persistence.nameNode.size }}
  accessModes:
    - ReadWriteOnce
  local:
    path: {{ .path }}
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - {{ .host }}
---
{{- end }}
  • hadoop/templates/hdfs/hdfs-dn-pv.yaml:
{{- range .Values.persistence.dataNode.local }}
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: {{ .name }}
  labels:
    name: {{ .name }}
spec:
  storageClassName: {{ $.Values.persistence.dataNode.storageClass }}
  capacity:
    storage: {{ $.Values.persistence.dataNode.size }}
  accessModes:
    - ReadWriteOnce
  local:
    path: {{ .path }}
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - {{ .host }}
---
{{- end }}
  • 修改 hdfs service:
mv hadoop/templates/hdfs/hdfs-nn-svc.yaml hadoop/templates/hdfs/hdfs-nn-svc-headless.yaml
mv hadoop/templates/hdfs/hdfs-dn-svc.yaml hadoop/templates/hdfs/hdfs-dn-svc-headless.yaml
# 注意修改名称,不要重复
  • hadoop/templates/hdfs/hdfs-nn-svc.yaml:
# A headless service to create DNS records
apiVersion: v1
kind: Service
metadata:
  name: {{ include "hadoop.fullname" . }}-hdfs-nn
  labels:
    app.kubernetes.io/name: {{ include "hadoop.name" . }}
    helm.sh/chart: {{ include "hadoop.chart" . }}
    app.kubernetes.io/instance: {{ .Release.Name }}
    app.kubernetes.io/component: hdfs-nn
spec:
  ports:
  - name: dfs
    port: {{ .Values.service.nameNode.ports.dfs }}
    protocol: TCP
    nodePort: {{ .Values.service.nameNode.nodePorts.dfs }}
  - name: webhdfs
    port: {{ .Values.service.nameNode.ports.webhdfs }}
    nodePort: {{ .Values.service.nameNode.nodePorts.webhdfs }}
  type: {{ .Values.service.nameNode.type }}
  selector:
    app.kubernetes.io/name: {{ include "hadoop.name" . }}
    app.kubernetes.io/instance: {{ .Release.Name }}
    app.kubernetes.io/component: hdfs-nn
  • hadoop/templates/hdfs/hdfs-dn-svc.yaml:
# A headless service to create DNS records
apiVersion: v1
kind: Service
metadata:
  name: {{ include "hadoop.fullname" . }}-hdfs-dn
  labels:
    app.kubernetes.io/name: {{ include "hadoop.name" . }}
    helm.sh/chart: {{ include "hadoop.chart" . }}
    app.kubernetes.io/instance: {{ .Release.Name }}
    app.kubernetes.io/component: hdfs-nn
spec:
  ports:
  - name: dfs
    port: {{ .Values.service.dataNode.ports.dfs }}
    protocol: TCP
    nodePort: {{ .Values.service.dataNode.nodePorts.dfs }}
  - name: webhdfs
    port: {{ .Values.service.dataNode.ports.webhdfs }}
    nodePort: {{ .Values.service.dataNode.nodePorts.webhdfs }}
  type: {{ .Values.service.dataNode.type }}
  selector:
    app.kubernetes.io/name: {{ include "hadoop.name" . }}
    app.kubernetes.io/instance: {{ .Release.Name }}
    app.kubernetes.io/component: hdfs-dn
  • 修改 yarn service:
mv hadoop/templates/yarn/yarn-nm-svc.yaml hadoop/templates/yarn/yarn-nm-svc-headless.yaml
mv hadoop/templates/yarn/yarn-rm-svc.yaml hadoop/templates/yarn/yarn-rm-svc-headless.yaml
mv hadoop/templates/yarn/yarn-ui-svc.yaml hadoop/templates/yarn/yarn-rm-svc.yaml
# 注意修改名称,不要重复
  • hadoop/templates/yarn/yarn-rm-svc.yaml:
# Service to access the yarn web ui
apiVersion: v1
kind: Service
metadata:
  name: {{ include "hadoop.fullname" . }}-yarn-rm
  labels:
    app.kubernetes.io/name: {{ include "hadoop.name" . }}
    helm.sh/chart: {{ include "hadoop.chart" . }}
    app.kubernetes.io/instance: {{ .Release.Name }}
    app.kubernetes.io/component: yarn-rm
spec:
  ports:
  - port: {{ .Values.service.resourceManager.ports.web }}
    name: web
    nodePort: {{ .Values.service.resourceManager.nodePorts.web }}
  type: {{ .Values.service.resourceManager.type }}
  selector:
    app.kubernetes.io/name: {{ include "hadoop.name" . }}
    app.kubernetes.io/instance: {{ .Release.Name }}
    app.kubernetes.io/component: yarn-rm
  • 修改控制器,在所有控制中新增如下内容:
containers:
...
  securityContext:
    runAsUser: {{ .Values.securityContext.runAsUser }}
    privileged: {{ .Values.securityContext.privileged }}
  • hadoop/templates/hadoop-configmap.yaml:
### 1、将/root换成/opt/apache
### 2TMP_URL="http://{{ include "hadoop.fullname" . }}-yarn-rm-headless:8088/ws/v1/cluster/info"

五、开始安装

# 创建存储目录
mkdir -p /opt/bigdata/servers/hadoop/{nn,dn}/data/data{1..3}

helm install hadoop ./hadoop -n hadoop --create-namespace
NAME: hadoop
LAST DEPLOYED: Sat Sep 24 17:00:55 2022
NAMESPACE: hadoop
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
1. You can check the status of HDFS by running this command:
   kubectl exec -n hadoop -it hadoop-hadoop-hdfs-nn-0 -- /opt/hadoop/bin/hdfs dfsadmin -report

2. You can list the yarn nodes by running this command:
   kubectl exec -n hadoop -it hadoop-hadoop-yarn-rm-0 -- /opt/hadoop/bin/yarn node -list

3. Create a port-forward to the yarn resource manager UI:
   kubectl port-forward -n hadoop hadoop-hadoop-yarn-rm-0 8088:8088

   Then open the ui in your browser:

   open http://localhost:8088

4. You can run included hadoop tests like this:
   kubectl exec -n hadoop -it hadoop-hadoop-yarn-nm-0 -- /opt/hadoop/bin/hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.3.2-tests.jar TestDFSIO -write -nrFiles 5 -fileSize 128MB -resFile /tmp/TestDFSIOwrite.txt

5. You can list the mapreduce jobs like this:
   kubectl exec -n hadoop -it hadoop-hadoop-yarn-rm-0 -- /opt/hadoop/bin/mapred job -list

6. This chart can also be used with the zeppelin chart
    helm install --namespace hadoop --set hadoop.useConfigMap=true,hadoop.configMapName=hadoop-hadoop stable/zeppelin

7. You can scale the number of yarn nodes like this:
   helm upgrade hadoop --set yarn.nodeManager.replicas=4 stable/hadoop

   Make sure to update the values.yaml if you want to make this permanent.

在这里插入图片描述

  • 查看:
kubectl get pods,svc -n hadoop -owide

在这里插入图片描述

  • hdfs web:
http://192.168.182.110:30870/

在这里插入图片描述

  • yarn web:
http://192.168.182.110:30088/

在这里插入图片描述

六、测试验证

  • HDFS 测试验证:
kubectl exec -it hadoop-hadoop-hdfs-nn-0 -n hadoop -- bash
[root@local-168-182-110 hadoop]# kubectl exec -it hadoop-hadoop-hdfs-nn-0 -n hadoop -- bash
bash-4.2$
bash-4.2$
bash-4.2$ hdfs dfs -mkdir /tmp
bash-4.2$ hdfs dfs -ls /
Found 1 items
drwxr-xr-x   - admin supergroup          0 2022-09-24 17:56 /tmp
bash-4.2$ echo "test hadoop" >test.txt
bash-4.2$ hdfs dfs -put test.txt /tmp/
bash-4.2$ hdfs dfs -ls /tmp/
Found 1 items
-rw-r--r--   3 admin supergroup         12 2022-09-24 17:57 /tmp/test.txt
bash-4.2$ hdfs dfs -cat /tmp/
cat: `/tmp': Is a directory
bash-4.2$ hdfs dfs -cat /tmp/test.txt
test hadoop
bash-4.2$

在这里插入图片描述

  • Yarn 的测试验证等后面讲到 hive on k8s 再来测试验证。

七、卸载


helm uninstall hadoop -n hadoop

kubectl delete pod -n hadoop `kubectl get pod -n hadoop|awk 'NR>1{print $1}'` --force
kubectl patch ns hadoop -p '{"metadata":{"finalizers":null}}'
kubectl delete ns hadoop --force
  • git 下载地址如下,有需要的小伙伴可以下载部署玩玩:
https://gitee.com/hadoop-bigdata/hadoop-on-k8s
  • 在 k8s 集群中 yarn 会慢慢被弱化,直接使用 k8s 资源调度,而不再使用 yarn 去调度资源,这里只是部署了单点,仅限于测试环境使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/712855.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java8中Lambda表达式和方法引用

一、Lambda表达式 1.1 函数式编程思想 1)概念 ​ 面向对象思想需要关注用什么对象完成什么事情。而函数式编程思想就类似于我们数学中的函数。它主要关注的是对数据进行了什么操作。 2)优点 代码简洁,开发快速接近自然语言,易…

1-n范围内的质数查找:埃拉托斯特尼筛法

文章目录 质数查找思路质数定义代码思路 写法重要逻辑&#xff1a;第一层for循环结束条件是i * i < n而不是i<n第二层循环如何筛查i所有倍数 完整版&#xff1a;返回0-n正整数中所有质数时间复杂度例题参考资料&#xff1a; 质数查找思路 质数定义 质数是一个自然数&am…

操作系统之调度算法总结

目录 一、进度调度算法 二、内存调度算法 一、先来先服务调度算法 二、最短寻道时间优先调度算法 三、扫描算法 四、循环扫描算法 五、LOOK和C-LOOK算法 三、内存页面置换算法 一、进度调度算法 常见的进度调度算法以及特点如下&#xff1a; 二、磁盘调度算法 一、先…

【大数据】初步认识StarRocks

StarRocks是什么 StarRocks 是新一代极速全场景 MPP 数据库。 StarRocks 充分吸收关系型 OLAP 数据库和分布式存储系统在大数据时代的优秀研究成果&#xff0c;在业界实践的基础上&#xff0c;进一步改进优化、升级架构&#xff0c;并增添了众多全新功能&#xff0c;形成了全新…

数据挖掘18大算法实现以及其他相关经典DM算法:决策分类,聚类,链接挖掘,关联挖掘,模式挖掘、图算法,搜索算法等

【机器学习入门与实践】入门必看系列&#xff0c;含数据挖掘项目实战&#xff1a;模型融合、特征优化、特征降维、探索性分析等&#xff0c;实战带你掌握机器学习数据挖掘 专栏详细介绍&#xff1a;【机器学习入门与实践】合集入门必看系列&#xff0c;含数据挖掘项目实战&…

TiDB(1):TiDB简介

1 从MySQL到TiDB 1.1 场景引入 假设现在有一个高速发展的互联网公司,核心业务库MySQL的数据量已经近亿行,且还在不断增长中,公司对于数据资产较为重视,所有数据要求多副本保存至少5年,且除了有对历史数据进行统计分析的离线报表业务外,还有一些针对用户数据实时查询的需求,如用…

软件测试技能,JMeter压力测试教程,签名sign(BeanShell 预处理程序)(二十)

前言 一般公司对外的接口都会用到sign签名&#xff0c;对不同的客户提供不同的apikey ,这样可以提高接口请求的安全性&#xff0c;避免被人抓包后乱请求 之前讲过用python代码实现sign签名&#xff0c;这次介绍jmeter上如何实现sign签名&#xff0c;思路都是差不多的 一、si…

Java框架之springboot基础

写在前面 本文看下springboot相关的基础内容。 1&#xff1a;从spring到springboot 在工作中&#xff0c;如果是我们想要引入某个框架&#xff0c;比如引入springMVC&#xff0c;就需要在web.xml中配置DispatcherServlet&#xff0c;在springmvc的配置文件中配置视图解析器等…

App自动化测试|Appium+Python自动化测试环境搭建

windows下搭建pythonappium环境 搭建过程步骤如下&#xff1a; 安装jdk并配置好环境变量&#xff08;jdk版本1.8以上&#xff09;安装android-sdk并配置好环境变量&#xff1b;具体步骤见&#xff1a;Android Studio安装(推荐使用这种方法安装SDK) - 环境配置 - 测试人社区安…

ASEMI代理海矽美SFP3012, 快恢复二极管SFP3012参数

编辑-Z SFP3012参数描述&#xff1a; 型号&#xff1a;SFP3012 最大反向重复峰值电压VRRM&#xff1a;1200V 平均整流正向电流IF&#xff1a;30A 反向恢复时间TRR&#xff1a;≤65nS 正向峰值浪涌电流IFSM&#xff1a;1602A 工作接点温度TJ&#xff1a;-40&#xff5e;1…

【数据挖掘】时间序列教程【七】

4.3 分布式滞后模型 考虑响应时间序列 y t 和输入(或“曝光”)时间序列 X t 。可能还有其他值得考虑的协变量,我们暂时忽略它们并在下一节中讨论它们的包含情况。我们将考虑以下形式的模型 在哪里 ε 表示独立同分布噪声过程。在连续时间设置中,该模型可以写为: …

VS上配置docker步骤记录

1:VS里安装Remote Development 2:运行 sudo usermod -aG docker $USER。#将当前用户添加到docker用户组中 sudo newgrp docker#更新,运行这个切到了root用户,获取权限 docker ps #列出正在运行的容器。它会显示容器的相关信息&#xff0c;如容器ID、镜像名称、创建时间、状态…

Linux 用户名称高亮和最近路径显示

1、通常情况下&#xff0c;Linux中的路径名称会不断叠加显示&#xff0c;如下图&#xff0c;这样看起来会很长。 2、为了设置路径只是当前最近的文件路径&#xff0c;先进入自己的家目录&#xff0c;然后进入.bashrc&#xff1a; 3、在.bashrc文件中的最后一行加入以下内容…

C# int[,] 和 int[,,]

如标题&#xff1b; 在C#中这两个是定义二维和三维数组的&#xff1b;这和C语言的写法不同&#xff1b; C语言定义二维数组是&#xff0c; int a[5][3]; 看下C#的多维数组&#xff1b;输出数组其中一个值&#xff1b; using System;class Program {static void Main(string[…

STM32 Proteus UCOSII系统拔河小游戏LED模拟-0053

STM32 Proteus UCOSII系统拔河小游戏LED模拟-0053 Proteus仿真小实验&#xff1a; STM32 Proteus UCOSII系统拔河小游戏LED模拟-0053 功能&#xff1a; 硬件组成&#xff1a;STM32F103R6单片机 1个选手1按键1个选手2按键1个重新开始按键7个LED灯1个蜂鸣器 1.单片机程序使用…

迷迷糊糊?似懂非懂?一文让你从此对SPI了如指掌

迷迷糊糊&#xff1f;似懂非懂&#xff1f;一文让你从此对SPI了如指掌 前言一、SPI 与 API1. SPI 在生活中的类比2. SPI 在代码上的例子3. API 与 SPI 的关系 二、JAVA 的 SPI 机制1. JAVA 中的 SPI 例子2. SPI 机制的四大组件3. SPI 机制的实现4. JAVA SPI的不足 前言 你是不…

CICD集合(四):Jenkins配置JDK,Maven,Allure报告

在Jenkins上面配置Jdk以及Maven环境 Maven和JDK Allure报告配置 当然配置Allure,得先安装Allure插件&#xff1a;

【Java项目】SpringBoot项目如何从自研配置中心拉取配置

文章目录 前言思路 前言 先简单说一下这个题目的意思是什么。 我们知道&#xff0c;如果我们的项目是SpringCloud的项目&#xff0c;我们是可以把我们的本地配置写到云端的的配置中心的&#xff0c;比如集成SpringCloud Alibaba&#xff0c;你就可以使用Nacos&#xff0c;然后…

科技云报道:智能化潮起,物联网产业链安全和效率问题何解?

科技云报道原创。 黑灯瞎火的夜。一胖一瘦两个小伙分别拿着平板和手机&#xff0c;在某知名新能源汽车周围鬼鬼祟祟地打转。 不到一分钟的时间&#xff0c;其中的瘦小伙很轻易地就用手机解开了车门锁。另外一名胖小伙&#xff0c;却用了两分钟&#xff0c;花了老大的力气&…

网站建设如何快速建站_网站建设快速建站有哪些方法

网站建设快速建站方法 1、JavaScript 压缩和模块打包 JavaScript 应用是以源码形式进行分发的&#xff0c;而源码解析的效率是要比字节码低的。对于一小段脚本来说&#xff0c;区别可以忽略不计。但是对于更大型的应用&#xff0c;脚本的大小会对应用启动时间有着负面的影响。…