大数据处理之hdfs篇

发布时间:2026/7/17 19:33:26
大数据处理之hdfs篇 1、hdfs的强悍之处海量存储无上限,加机器就能扩容量数据多副本,机器挂了快照不丢分布式并行读写,大任务CK不堵不超时大数据生态原生适配,Flink/Spark开箱即用吞吐碾压单机NFS,高并发状态存储稳如磐石单机NFS是临时玩具,HDFS才是大数据生产级可靠底座。2、不能直接用 HDFS 替代 NFS 做本地 lib 挂载1、HDFS不能挂载成Pod本地文件夹,没法替代NFS放lib依赖2、NFS:直接挂载lib,丢jar即用,不用重启pod3、HDFS存jar:pod启动要下载,更新jar必须全集群重启,麻烦4、分工记死:NFS放lib;HDFS只存checkpoint3、基于k8s的flink集群和hdfs集群交互一、HDFS侧(几乎不用改配置)1、 网络打通:K8s所有Pod能通HDFS NameNode、DataNode IP+端口(9000/8020、50010),防火墙放行2、权限放行:给Flink写入HDFS目录权限(`hdfs dfs -chmod 777 /flink-ck` 或配置用户权限)3、Hadoop核心配置文件(HA集群必配,单节点可简化)把HDFS的 `core-site.xml`、`hdfs-site.xml` 通过ConfigMap挂载到Pod `/etc/hadoop/conf`- 单NN:只需要填fs.defaultFS=hdfs://nnip:9000- HA集群:配置nameservice、多个NN地址、故障转移参数,不挂载会连不上集群设置pv/pvc本地目录路径和权限rm -rf /data/flink/hadoop/nnrm -rf /data/flink/hadoop/dnmkdir -p /data/flink/hadoop/nnmkdir -p /data/flink/hadoop/dnchown -R 1000:1000 /data/flink/hadoopchmod -R 755 /data/flink/hadoop所有文件读写任务,第一步一定通过 9000 端口连接 hdfs-nn Service 找到 NameNode,NN 只负责查元数据、分配数据节点; 真实文件数据流不经过 9000,客户端直接和 DataNode 9866 端口互传; DataNode 依靠配置里的hdfs-nn:9000主动注册、持续上报心跳,维持集群kubectl exec -it hdfs-nn-0 -n test -- bash -------------------------------------- 一、验证 hdfs 的 9000端口 是否正常 1、拿到 HDFS NameNode 访问 IP kubectl get svc hdfs-nn -n test 2、登录 NameNode 或者 DataNode Pod # 进入NameNode Pod kubectl exec -n test -it $(kubectl get pod -n test | grep hdfs-nn | awk '{print $1}') -- bash 3、网络连通检测(9000 端口通不通) nc -zv hdfs-nn 9000pv/pvc.yaml# NN本地PV apiVersion: v1 kind: PersistentVolume metadata: name: hdfs-nn-local-pv spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: local-storage local: path: /data/flink/hadoop/nn nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - k8sworker01 --- # DN本地PV apiVersion: v1 kind: PersistentVolume metadata: name: hdfs-dn-local-pv spec: capacity: storage: 50Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: local-storage local: path: /data/flink/hadoop/dn nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - k8sworker01 --- # NN PVC apiVersion: v1 kind: PersistentVolumeClaim metadata: name: hdfs-nn-pvc namespace: test spec: accessModes: - ReadWriteOnce storageClassName: local-storage resources: requests: storage: 10Gi --- # DN PVC apiVersion: v1 kind: PersistentVolumeClaim metadata: name: hdfs-dn-pvc namespace: test spec: accessModes: - ReadWriteOnce storageClassName: local-storage resources: requests: storage: 50Gihdfs_test.yaml# hdfs-configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: hdfs-conf namespace: test data: core-site.xml: | ?xml version="1.0"? configuration !-- 必须指定默认文件系统,否则 DN 无法识别 NN -- property namefs.defaultFS/name valuehdfs://hdfs-nn:9000/value /property !-- 临时目录(可选) -- property namehadoop.tmp.dir/name value/data/hadoop/tmp/value /property !-- 全局监听 0.0.0.0,跨 Pod 可访问 -- property namedfs.namenode.rpc-bind-host/name value0.0.0.0/value /property property namedfs.namenode.http-bind-host/name value0.0.0.0/value /property /configuration hdfs-site.xml: | ?xml version="1.0"? configuration !-- 单副本 -- property namedfs.replication/name value1/value /property property namedfs.datanode.data.dir/name value/data/dn/value /property property namedfs.namenode.name.dir/name value/data/nn/value /property !-- 显式指定 NameNode RPC 地址,解决 DN 注册失败问题 -- property namedfs.namenode.rpc-address/name valuehdfs-nn:9000/value /property !-- 关键:禁用主机名解析检查 -- property namedfs.namenode.datanode.registration.ip-hostname-check/name valuefalse/value /property /configuration log4j.properties: | log4j.rootLogger=INFO,console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.target=System.out log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n --- # NameNode Service(已是 ClusterIP,无需修改) apiVersion: v1 kind: Service metadata: name: hdfs-nn namespace: test spec: type: NodePort selector: app: hdfs-nn ports: - port: 9000 targetPort: 9000 name: rpc - port: 9870 targetPort: 9870 nodePort: 30070 name: webui # 未设置 clusterIP: None,默认为 ClusterIP --- # DataNode Headless Service(仅用于 DN 自身发现,不影响 NN 连接) apiVersion: v1 kind: Service metadata: name: hdfs-dn namespace: test spec: selector: app: hdfs-dn ports: - port: 9866 targetPort: 9866 name: data clusterIP: None --- # hdfs-nn StatefulSet(不变) apiVersion: apps/v1 kind: StatefulSet metadata: name: hdfs-nn namespace: test spec: replicas: 1 selector: matchLabels: app: hdfs-nn serviceName: hdfs-nn template: metadata: labels: app: hdfs-nn spec: securityContext: