1 环境介绍
本地安装可分为两个部分,mac软件环境, python开发环境
ps: 安装过程参考chatgpt、csdn文章
1.1 mac软件环境
目标安装的的软件是hive、apache-spark、hadoop,但是这三个软件又依赖java(spark依赖)、ssh(从warn日志看到,具体作用不明,可能是提交计算任务的时候依赖做权限验证)、数据库(hive依赖,postgres 实测问题较少)。zsh命令行解释器,用于执行指令, homebrew软件包管理器,安装卸载软件非常方便。接下来介绍各种软件情况。
1.1.1 环境变量
.zprofile 用来配置mac 用户登录时的环境变量,安装完软件后需要进行配置。 文档末尾提供一个参考示例。环境变量配置后才能方便的通过软件指令来进行操作。 同时python运行pyspark的时候也会使用到java的环境变量,配置错误会导致pyspark运行失败。
我都是把变量放.zprofile的,会比较省事
1.1.2 home-brew
安装过程涉及安装和删除,使用homebrew能解决很多不必要的问题。比如启动postgres
1.1.3 java
macos-sonoma 14.6.1自带hotspot 23版本,但是不满足spark运行环境要求,实测安装java openjdk 1.8 的版本可以使用。
1.1.4 ssh
目测是提交任务时候依赖,需要在~/.ssh 下面创建公钥、密钥同时把公钥备份重新命名才能让hadoop或spark使用到。
1.1.5 hive、spark、hadoop
需要解决的是账号密码、端口等配置,配置正确才能建立通讯。
1.2 Python 环境
1.2.1 miniforge3
python虚拟环境管理,因为公司不允许使用conda,所以用这个代替。 这个软件可以解决版本依赖冲突问题,同时管理python环境也很方便。 python开发环境和airflow 需要使用相同的python环境。
1.2.2 airflow
相当于python的一个组件,调用命令以后就能运行服务。python 代码里也会引用到这个组件。
写好的代码放到 airflow 组件的根目录下的 dags目录下就能被airflow识别。 代码文件复制过去后就会自动刷新调度任务。 可以在airflow上触发调度任务,验证执行结果。
1.2.3 python 开发环境
调试过程就能直接读到airflow的变量数据, 也可以调用pythonspark功能做调试。但是调试airflow不会把任务提交到airflow上。
所以验证要分两个阶段。
- 单独测试调度任务的逻辑 ,如果使用到了python 函数做任务的,参数需要自己设置一下传入。对使用xcom_push的还没实践过。
- 测试airflow dag代码逻辑。 验证就是运行有没有报错,变量取值是否正确。 任务依赖关系还得在airflow页面上查看。
2 安装步骤
经过反复调试成功,可能有些细节忘了。
如有遇到问题可以评论回复。或自行chat-gpt
有些服务启动会导致终端不能再输入指令了,command + T 创建新终端执行新指令,然后 source ~/.zprofile 更新环境变量即可
2.1 mac环境
2.1.1 homebrew
没有安装就用下面指令安装,打开终端
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
安装成功以后终端运行brew 有下面提示即可
2.1.2 ssh
- cd ~/.ssh
- ssh-keygen -t rsa -b 4096 -C "your_email@example.com" 创建公钥
- cat id_rsa.pub >> authorized_keys 复制公钥
- sudo systemsetup -setremotelogin on 启动ssh服务
2.1.3 安装java 1.8
- 执行指令 brew install openjdk@8
- export JAVA_HOME=$(/usr/libexec/java_home -v 1.8) >> ~/.zprofile #这种方式不用自己去找java的目录
- source ~/.zprofile
- java -version #如果有打印java信息就安装成功了
2.1.4 安装postgres
- brew install postgresql@14 #指定版本吧,其他版本没试过
- 目录可能是/usr/local/var/postgresql@14、/opt/homebrew/opt/postgresql@14、/usr/local/opt/postgresql@14 验证一下即可,也可能没有@14,确认以后修改环境变量
- export PATH="/opt/homebrew/opt/postgresql@14/bin:$PATH" >> ~/.zprofile
- source ~/.zprofile
- initdb /opt/homebrew/var/postgresql@14 初始化数据库, 可能没有@14,我装的都没有@14结尾
- brew services start postgresql@14 启动服务
- brew services list 验证服务是否启动
- psql postgres 登录数据库
- 创建hive用户信息
- CREATE DATABASE hive;
- CREATE USER hiveuser WITH PASSWORD 'hivepassword';
- GRANT ALL PRIVILEGES ON DATABASE hive TO hiveuser;
- \q 或者control + c 退出
- psql -U hiveuser -d hive -h localhost -p 5432 登录hiveuser账号,查看
2.1.5 安装hadoop
-
brew install hadoop
-
export HADOOP_HOME=/opt/homebrew/opt/hadoop/libexec >> ~/.zprofile
-
export PATH= H A D O O P H O M E / b i n : HADOOP_HOME/bin: HADOOPHOME/bin:PATH >> ~/.zprofile
-
把下面环境变量写到 ~/.zprofile 文件里
export HADOOP_COMMON_HOME=/usr/local/opt/hadoop/libexec 或者 /opt/homebrew/opt/hadoop/libexec 看实际安装路径
export HADOOP_HOME=HADOOP_COMMON_HOME export HADOOP_HDFS_HOME=HADOOP_COMMON_HOME
export HADOOP_MAPRED_HOME=HADOOP_COMMON_HOME export HADOOP_YARN_HOME=HADOOP_COMMON_HOME
export PATH=PATH:HADOOP_HOME/bin:HADOOP_HOME/sbin export HADOOP_CONF_DIR=HADOOP_HOME/etc/hadoop指定用当前用户启动hdfs 就不用单独创建hdfs了
export HADOOP_NAMENODE_USER={mac登录用户的名字}
export HADOOP_DATANODE_USER={mac登录用户的名字} -
source ~/.zprofile
-
hadoop version 查看安装情况
-
start-dfs.sh 启动hadoop组件
-
jps 查看是否启动成功,应该有ResourceManager
-
HDFS Web 界面:http://localhost:9870
-
YARN Web 界面:http://localhost:8088
-
cd $HADOOP_HOME/etc/hadoop 进入到配置页面
-
vim core-site.xml 我是这样配置的
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> </configuration> -
vim hdfs-site.xml
<configuration> <property> <name>dfs.namenode.name.dir</name> <value>/Users/?自己的用户名?/hdfs/hadoop/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/Users/?自己的用户名?/hdfs/hadoop/tmp/dfs/data</value> </property> <property> <name>dfs.namenode.http-address</name> <value>localhost:9101</value> </property> <property> <name>dfs.datanode.http.address</name> <value>localhost:9102</value> </property> </configuration> -
hdfs namenode 终端启动
-
hdfs datanode
2.1.6 安装hive
-
brew install apache-hive
-
export HIVE_HOME=/opt/homebrew/opt/apache-hive/libexec >> ~/.zprofile
-
export PATH= H I V E H O M E / b i n : HIVE_HOME/bin: HIVEHOME/bin:PATH >> ~/.zprofile
-
source ~/.zprofile
-
下载postgres驱动 https://jdbc.postgresql.org/download/ 。我使用的是42.7.4-java8 版本。 拷贝到$HIVE_HOME/lib目录
-
修改 $HIVE_HOME/conf/hive-site.xml 配置 使用postgres。 拷贝出来到文本编辑器里改方便。根据name来改
<property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:postgresql://localhost:5432/hive</value> <description> JDBC connect string for a JDBC metastore. To use SSL to encrypt/authenticate the connection, provide database-specific SSL flag in the connection URL. For example, jdbc:postgresql://myhost/db?ssl=true for postgres database. </description> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>org.postgresql.Driver</value> <description>Driver class name for a JDBC metastore</description> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>hiveuser</value> <description>Username to use against metastore database</description> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>hivepassword</value> <description>The password for the database user.</description> </property> <property> <name>hive.metastore.uris</name> <value>thrift://localhost:9083</value> <description>Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.</description> </property> -
schematool -dbType postgres -initSchema 初始化数据库
-
hive --service metastore 启动metastore服务
-
hive --version 查看安装成功
-
hive 启动, 如果hadoop的 namenode、datanode没启动会报错。
-
show databases; --如果正常就可以一顿操作了
-
PS: hive的xml配置可能有问题,需要手动删掉特殊字符,3215行
2.1.7 安装spark
- brew install apache-spark
- export SPARK_HOME=/opt/homebrew/opt/apache-spark/libexec >> ~/.zprofile
- export PATH= S P A R K H O M E / b i n : SPARK_HOME/bin: SPARKHOME/bin:PATH >> ~/.zprofile
- source ~/.zprofile
- cp $HIVE_HOME/conf/hive-site.xml $SPARK_HOME/conf/ 把hive配置复制到spark
- /usr/local/opt/apache-spark/libexec/sbin/stop-all.sh 停止spark
- /usr/local/opt/apache-spark/libexec/sbin/start-all.sh 启动spark
- spark-shell --version 验证安装
- spark.sql("SHOW TABLES").show() 执行看看是否能查到hive表
2.1.8 启动服务查看
- 终端输入jps 查看启动的服务有哪些
- 也可通过网页查看spark、 hadoop的情况
2.2 python环境安装
这个相对简单也独立
2.2.1 miniforge3
- https://github.com/conda-forge/miniforge 可以自己下载安装,指定目录 我使用的是 ~/miniforge 好找
- brew install miniforge 这个命令直接安装,之后复制/usr/local/miniforge3 到自己想要的目录。
- echo 'export PATH="/usr/local/miniforge3/bin:$PATH"' >> ~/.zprofile 这个命令把miniforge,如果修改了目录自己改下路径
- source ~/.zprofile 更新环境变量
- conda --version 查看是否安装成功
- conda init zsh 初始化conda环境, 这个命令会把初始化代码放到~/.bashrc 或者 ~/.zshrc 里,复制出来到 ~/.zprofile
- conda create -n data_dev python=3.8 创建一个3.8的环境 环境名字data_dev可以自己改
- conda activate data_dev 激活环境,在这个环境里安装python组件
2.2.2 airflow 安装
- conda install apache-airflow==1.10.12 安装指定版本airflow
- airflow initdb db初始化,1.10x版本
- airflow scheduler 启动调度
- airflow webserver --port 8081 启动页面
- http://localhost:8081 访问页面
- 安装目录在: xxx /miniforge3/envs/data_dev/lib/python3.8/site-packages/airflow, data_dev跟conda创建的环境名一样
- 写完的脚本放到${AIRFLOW_HOME}/dags/下。这里我配置的AIRFLOW_HOME=上一步的安装路径
- ps 使用3.8 可以用conda 安装1.10.12的airflow,可能遇到itsdangerous版本问题,降级 conda install itsdangerous=1.1.0即可
- ps airflow默认使用sqlite3的数据存储方式,似乎不需要安装这个数据库。
2.2.3 python环境
- 指定xxx /miniforge3/envs/data_dev/ 目录下的python环境作为pycharm的python解释器
- 再安装一个pyspark 就行
- 可以直接运行python代码了
3 附录
3.1 启动服务指令
# 可以开启多个终端执行任务
#启动ssh hadoop依赖
# sudo launchctl stop com.openssh.sshd
# sudo launchctl start com.openssh.sshd
# 关闭ssh服务
sudo systemsetup -setremotelogin off
# 开启ssh服务
sudo systemsetup -setremotelogin on
#停止postgres
brew services stop postgresql
#启用
brew services start postgresql
# hadoop 集群服务
/usr/local/opt/hadoop/libexec/sbin/stop-dfs.sh
/usr/local/opt/hadoop/libexec/sbin/stop-yarn.sh
/usr/local/opt/hadoop/libexec/sbin/start-dfs.sh
/usr/local/opt/hadoop/libexec/sbin/start-yarn.sh
#启动hdfs
hdfs namenode
hdfs datanode
#启动hive元数据管理
hive --service metastore
# 启动spark
/usr/local/opt/apache-spark/libexec/sbin/stop-all.sh
/usr/local/opt/apache-spark/libexec/sbin/start-all.sh
#启动airflow在 conda环境执行 data_dev
conda activate data_dev
pkill -f airflow
airflow scheduler
airflow web --port 8081
#jps查看服务 运行的hadoop、hive
jps
#查看postgres服务
brew services list
3.2 环境变量配置
export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)
export HIVE_HOME=/Users/{mac登录用户的名字}/apache-hive-3.1.2-bin
export PATH=$HIVE_HOME/bin:$PATH
export JAVA_OPTS="-Djava.io.tmpdir=/Users/{mac登录用户的名字}/logs -Duser.name={mac登录用户的名字}"
export SPARK_HOME=/usr/local/opt/apache-spark/libexec
export PATH=$PATH:$SPARK_HOME/bin
export HADOOP_COMMON_HOME=/usr/local/opt/hadoop/libexec
export HADOOP_HOME=$HADOOP_COMMON_HOME
export HADOOP_HDFS_HOME=$HADOOP_COMMON_HOME
export HADOOP_MAPRED_HOME=$HADOOP_COMMON_HOME
export HADOOP_YARN_HOME=$HADOOP_COMMON_HOME
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
# 指定用当前用户启动hdfs 就不用单独创建hdfs了
export HADOOP_NAMENODE_USER={mac登录用户的名字}
export HADOOP_DATANODE_USER={mac登录用户的名字}
#export SPARK_SUBMIT_OPTS="-Djava.security.manager=allow"
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/Users/{mac登录用户的名字}/miniforge3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
eval "$__conda_setup"
else
if [ -f "/Users/{mac登录用户的名字}/miniforge3/etc/profile.d/conda.sh" ]; then
. "/Users/yuwang.lin/miniforge3/etc/profile.d/conda.sh"
else
export PATH="/Users/{mac登录用户的名字}/miniforge3/bin:$PATH"
fi
fi
unset __conda_setup
# <<< conda initialize <<<
#这个home因为会放cfg文件,所以不能配置为airflow所在目录
export AIRFLOW_DIR="/Users/{mac登录用户的名字}/miniforge3/envs/data_dev/lib/python3.8/site-packages/airflow"
export AIRFLOW_HOME="/Users/{mac登录用户的名字}/airflow"
export POSTGRESQL_HOME="/usr/local/var/postgresql@14"
export PATH=$POSTGRESQL_HOME/bin:$PATH
export PGDATA='/usr/local/pgsql/data'
~
~