本文详细记录基于 Apache Hudi 和 Sedona 的地学数据湖开发环境配置。
针对课题组服务器的开发环境,涉及一些特殊问题。
主要包括配置各种jar包、Pyspark作为开发语言可能遇到的一些麻烦。
环境信息
| 组件 | 版本 |
|---|---|
| Hadoop | 3.3.6 |
| Spark | 3.4.3 |
| Sedona | 1.4.1 |
| Hudi | 1.0.0 |
| Linux | Ubuntu 18.04.6 |
| 开发语言 | PySpark |
整体部署方案
以两个节点为例,额外的节点可以参考一样的方案
- VM_A : Spark Master + HDFS NameNode + DataNode
- VM_B : Spark Worker + HDFS DataNode
- 所有服务以
hadoop用户身份运行
课题组服务器的实际环境是物理机中建多个虚拟机
同一个物理机之间的网络可以用内部的IP直接连接,不用公网IP
第一阶段:基础系统配置
系统更新(所有节点)
1 | sudo apt update |
安装 Java
1 | # 安装 OpenJDK 11 |
配置 JAVA_HOME 环境变量
编辑 ~/.bashrc 或 /etc/environment:
1 | export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 |
运行以下命令生效:
1 | source ~/.bashrc # 或 source /etc/environment |
安装 Scala
实际采用了2.12版本,如果是其他版本后续的各种包需要改为对应版本
1 | sudo apt install scala -y |
安装 Python 3 和 Pip
这里注意pyspark的版本需要和spark集群对应(也影响后续sedona的版本)
1 | sudo apt install python3 python3-pip -y |
配置 SSH 免密登录
在 VM_A 上生成 SSH 密钥对:
1 | ssh-keygen -t rsa # 一直按回车,不设置密码 |
配置本地免密登录:
1 | ssh-copy-id hadoop@localhost |
配置到远程节点的免密登录:
1 | ssh-copy-id hadoop@192.168.1.101 # 复制 SSH 公钥到 VM_B |
验证免密登录:
1 | ssh 192.168.1.100 # 测试本地 |
配置 /etc/hosts(所有节点)
在所有节点的 /etc/hosts 中添加:
1 | 192.168.1.100 master-node vm-a |
第二阶段:部署 HDFS 分布式文件系统
下载和安装 Hadoop
1 | wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz |
配置 Hadoop 环境变量(所有节点,hadoop 用户)
编辑 ~/.bashrc:
1 | export HADOOP_HOME=/opt/hadoop |
创建 HDFS 数据目录
在 VM_A 上:
1 | sudo mkdir -p /home/hadoop/hadoop_data/namenode_metadata |
在 VM_B 上:
1 | sudo mkdir -p /home/hadoop/hadoop_data/datanode_storage |
配置 Hadoop 配置文件(VM_A)
编辑 /opt/hadoop/etc/hadoop/hadoop-env.sh:
1 | export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 |
编辑 /opt/hadoop/etc/hadoop/core-site.xml:
1 | <configuration> |
编辑 /opt/hadoop/etc/hadoop/hdfs-site.xml:
1 | <configuration> |
编辑 /opt/hadoop/etc/hadoop/workers:
1 | 192.168.1.100 |
分发 Hadoop 配置到 VM_B
1 | # 在 VM_A 上,hadoop 用户身份执行 |
格式化 HDFS(仅 VM_A,一次性)
1 | # 在 VM_A 上,hadoop 用户身份执行 |
启动 HDFS 集群
1 | # 在 VM_A 上,hadoop 用户身份执行 |
验证 HDFS
检查进程:
1 | jps # 应看到 NameNode 和 DataNode |
**访问 Web UI:**访问 http://192.168.1.100:9870
测试文件操作:
1 | /opt/hadoop/bin/hdfs dfs -mkdir /test_dir |
第三阶段:部署 Apache Spark
下载和安装 Spark(VM_A)
1 | wget https://dlcdn.apache.org/spark/spark-3.4.3/spark-3.4.3-bin-hadoop3.tgz |
配置 Spark 环境变量(所有节点)
编辑 ~/.bashrc:
1 | export SPARK_HOME=/opt/spark |
配置 Spark(VM_A)
复制模板文件:
1 | cd /opt/spark/conf |
编辑 spark-env.sh:
1 | export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 |
编辑 workers:
1 | 192.168.1.100 |
分发 Spark 到 VM_B
1 | # 在 VM_A 上,hadoop 用户身份执行 |
启动 Spark 集群
1 | # 在 VM_A 上,hadoop 用户身份执行 |
验证 Spark
**访问 Web UI:**访问 http://192.168.1.100:8080
检查进程:
1 | jps # 应看到 Master 和 Worker |
测试 PySpark:
1 | pyspark --master spark://192.168.1.100:7077 |
在 PySpark shell 中:
1 | data = list(range(1000)) |
第四阶段:配置 Apache Hudi 和 Sedona
这部分是手动配置依赖包的做法,需要自行确保各个包的版本匹配
下载依赖包
需要以下 JAR 包:
1 | sedona-spark-shaded-3.4_2.12-1.4.1.jar |
建议放在 Spark home 目录或统一的包管理位置。
启动 PySpark with Hudi & Sedona
1 | pyspark --master spark://192.168.1.100:7077 \ |
或使用本地 JAR
1 | pyspark --master spark://192.168.1.100:7077 \ |
提交 Spark 作业
1 | spark-submit --master spark://192.168.1.100:7077 \ |
环境相关使用方案
WebUI相关
在校园网内的集群,外部可能不能直接访问HDFS和Spark的WebUI
相对简单的方案是ssh转发端口到服务器配置过密钥的设备本地
在本地cmd执行
1 | ssh -i D:\key -L 8080:192.168.1.100:8080 root@GATEWAY_IP -p 21040 |
之后可以通过本地端口访问
hdfs的WebUI可以通过可视化的界面删除一些实验后不需要的大数据文件
集群重启
Hadoop:/opt/hadoop/sbin
Spark: /opt/spark/sbin
在里面找相关的脚本即可
比如关闭Spark集群可以分别执行stop-workers.sh和stop-master.sh
GeoMesa
论文中做了GeoMesa的对比试验,相关环境配置也有一定麻烦
Hadoop和Spark集群基础不变
GeoMesa对于一些jar包的版本依赖不同
最终用了下面两个包可以对上目前的Hadoop和Spark环境
/root/geomesa-gt-spark-runtime_2.12-5.1.0.jar
/root/geomesa-fs-spark-runtime_2.12-5.1.0.jar
另外注意python虚拟环境中的版本也要对上,Sedona可能要用1.8.1(Hudi环境用的1.4.1)
Log相关
spark集群运行的时候会有很多log,建议都采取下述方法打印到log file里方便查阅,也不会在terminal产生过多输出
1 | spark-submit ...... >> log_route/log_file_name.log 2>&1 |