赞
踩
前言:绝知此事要躬行。
Spark官网下载 : https://spark.apache.org/downloads.html
Hdoop官网下载: https://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-3.2.0/hadoop-3.2.0.tar.gz
JDK下载地址: https://www.oracle.com/java/technologies/downloads/#java8
百度云链接
链接:https://pan.baidu.com/s/1SbvMo7FeeZ50YiEERMsI4g
提取码:qwer
环境:两台Centos7.6(一台腾讯云、一台百度云)
## 1.创建hadoop用户 > adduser hadoop # 所有操作在hadoop用户下完成 > passwd hadoop > su hadoop ## 2.配置用户sudo权限 # 2.1 root用户下 > chmod +w /etc/sudoers # 增加写权限 > vim /etc/sudoers # 增加sudo用户 ''' hadoop ALL=(ALL) NOPASSWD: ALL # 无密码使用sudo ''' > chmod -w /etc/sudoers # 关闭写权限 ## 3. 主机名配置 > sudo vim /etc/hosts 添加 ''' xx.xx.26.53 hadoop01 hadoop01 xx.xx.80.134 hadoop02 hadoop02 ''' ## 4. ssh免密登录 # 4.1 密钥生成 > ssh-keygen # 4.2密钥分发 > ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop01 # 本机也需分发,本机同属namenode和datanode,在逻辑上属于两台机器 > ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop02 # 4.3验证免密登录 > ssh hadoop02
## 1. 卸载本机openjdk环境(腾讯云自带) > yum list installed | grep java > yum -y remove java-1.7/8.0-openjdk* > yum -y remove tzdata-java* ## 2. 安装JDK1.8 > tar -zxvf jdk-8u333-linux-x64.tar.gz # --> /home/hadoop/app/jdk1.8.0_333 ## 3. 添加环境变量 > sudo vim /etc/profile ''' export JAVA_HOME=/home/hadoop/app/jdk1.8.0_333 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH ''' > source /etc/profile # 使配置生效 > java -version # jave 版本验证
## 1. 解压(即安装) > tar -zxvf hadoop-3.2.0.tar.gz # --> /home/hadoop/app/hadoop-3.2.0 > cd hadoop-3.2.0 > ll ''' drwxr-xr-x 2 1001 1002 4096 Jan 8 2019 bin # 可执行二进制文件 hdfs的客户端操作命令 drwxr-xr-x 3 1001 1002 4096 Jan 8 2019 etc # hadoop配置文件 drwxr-xr-x 2 1001 1002 4096 Jan 8 2019 include drwxr-xr-x 3 1001 1002 4096 Jan 8 2019 lib drwxr-xr-x 4 1001 1002 4096 Jan 8 2019 libexec -rw-rw-r-- 1 1001 1002 150569 Oct 19 2018 LICENSE.txt -rw-rw-r-- 1 1001 1002 22125 Oct 19 2018 NOTICE.txt -rw-rw-r-- 1 1001 1002 1361 Oct 19 2018 README.txt drwxr-xr-x 3 1001 1002 4096 Jan 8 2019 sbin # hdfs yarn 组件启停命令 drwxr-xr-x 4 1001 1002 4096 Jan 8 2019 share # doc说明文档、jar包 ''' ## 2. 配置环境变量 > sudo vim /etc/profile ''' export HADOOP_HOME=/home/hadoop/app/hadoop-3.2.0 export PATH=${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH ''' > source /etc/profile # 使配置生效 ## 3. 修改hdoop配置信息 # 3.1 hadoop-env.sh 环境配置 > cd /home/hadoop/app/hadoop-3.2.0/etc/hadoop/ # 3.1 进入配置目录下,修改文件以下配置 > vim ./hadoop-env.sh 'export JAVA_HOME=/home/hadoop/app/jdk1.8.0_333/' 'export HADOOP_PID_DIR=/home/hadoop/pid/hadoop' # 3.2 core-site.xml 核心配置 > vim ./core-site.xml ''' <configuration> <property> <!--指定 namenode 的 hdfs 文件系统的通信地址--> <name>fs.defaultFS</name> <value>hdfs://hadoop01:8020</value> </property> <property> <!--指定 hadoop运行时 存储临时文件的目录--> <name>hadoop.tmp.dir</name> <value>/home/hadoop/tmp</value> </property> </configuration> ''' # 3.3 hdfs-site.xml 指定副本系数和文件存储位置 > vim ./hdfs-site.xml ''' <configuration> <property> <!-- secondary namenode http服务器地址和端口。--> <name>dfs.namenode.secondary.http-address</name> <value>hadoop02:9868</value> </property> <property> <!--namenode 存放namenode的名称表(fsimage)的目录,可以指定多个目录实现容错,多个目录用逗号分隔--> <name>dfs.namenode.name.dir</name> <value>/home/hadoop/namenode/data</value> </property> <property> <!--datanode 节点数据(即数据块)的存放位置,可以指定多个目录实现容错--> <name>dfs.datanode.data.dir</name> <value>/home/hadoop/datanode/data</value> </property> <property> <!--由于我们这里搭建是2台及其,所以指定 dfs 的副本系数为 2,默认3份吧--> <name>dfs.replication</name> <value>2</value> </property> </configuration> ''' ## 4. 进行yarn资源管理器配置 # 4.1 yarn-site.xml > vim yarn-site.xml '' <configuration> <property> <!--配置 NodeManager 上运行的附属服务。需要配置成 mapreduce_shuffle 后才可以在Yarn 上运行 MapReduce 程序。--> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <!--resourcemanager 的主机名--> <name>yarn.resourcemanager.hostname</name> <value>hadoop01</value> </property> <property> <!-- 开启日志聚集功能 --> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <property> <!-- 日志聚集hdfs中主路径 --> <name>yarn.nodemanager.remote-app-log-dir</name> <value>/app-logs</value> # 路径必须提前存在 </property> <property> <!-- 日志聚集hdfs中路径后缀 ${yarn.nodemanager.remote-app-log-dir}/${user}/${thisParam}--> <name>yarn.nodemanager.remote-app-log-dir-suffix</name> <value>logs</value> # 默认参数 </property> <property> <!-- 日志有效期 --> <name>yarn.log-aggregation.retain-seconds</name> <value>604800</value> # 日志保存近7天 </property> <property> <!--mapreduce 历史服务器地址--> <name>yarn.log.server.url</name> <value>http://hadoop01:19888/jobhistory/logs</value> # 可以选择不启动 </property> <property> <!--RM可调度CPU资源,不设置该参数,yarn UI界面VCores Total 将显示16--> <name>yarn.nodemanager.resource.cpu-vcores</name> <value>8</value> # 默认为8核,可设置节点实际物理cpu核心数 </property> <property> <!--RM可调度内存资源,不设置该参数,yarn UI界面Memory Total 将显示16--> <name>yarn.nodemanager.resource.memory-mb</name> <value>8192</value> # 默认为8G,可设置节点实际Mem*0.8 </property> <property> <!--就虚拟 CPU 内核而言,RM 中每个容器请求的最小分配,低于此值设为此值--> <name>yarn.scheduler.minimum-allocation-vcores</name> <value>1</value> # 默认值1核 </property> <property> <!--RM 上每个容器请求的最大分配(以虚拟 CPU 内核计),高于此值报错--> <name>yarn.scheduler.maximum-allocation-vcores</name> <value>4</value> # 默认值4核 </property> <property> <!--RM 中每个容器请求的最小分配(以 MB 为单位),低于此值设为此值--> <name>yarn.scheduler.minimum-allocation-mb</name> <value>1024</value> # 默认值1G </property> <property> <!--RM 中每个容器请求的最大分配量(以 MB 为单位),高于此值报错--> <name>yarn.scheduler.maximum-allocation-mb</name> <value>8192</value> # 默认值8G </property> </configuration> '' # 4.2 mapred-site.xml > vim ./mapred-site.xml ''' <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration> ''' ##5. 从属节点配置,分发hadoop解压包和hadoop环境配置变量 # 5.1 添加从属节点workers > vim ./workers '' hadoop01 hadoop02 '' # 5.2 分发hadoop > scp -r /home/hadoop/app/hadoop-3.2.0 hadoop02:/home/hadoop/app # 5.3 分发hadoop配置变量 > scp -r /home/hadoop/app/hadoop-3.2.0/etc/hadoop/* hadoop02:/home/hadoop/app/hadoop-3.2.0/etc/hadoop/ ##6. hadoop集群的启动与查验 # 6.1 初始化 > hdfs namenode -format # 6.2 启动hdfs和yarn服务 > cd /home/hadoop/app/hadoop-3.2.0/sbin > ./start-dfs.sh > ./start-yarn.sh > ./mr-jobhistory-daemon.sh start historyserver # 6.3 验证是否启动成功 # 6.3.1 验证hadoop是否启动成功 # 方式1:>> jps # 方式2:查看web UI界面,端口9870(hadoop2 是50070) # 浏览器输入 xx.xx.xx.xx:9870,正常情况下能看到hadoop服务的overview页面 # 6.3.2 验证yarn服务是否启动成功 # 方式一:>> jps # 方式二:查看yarn Web UI界面,端口号为8088 ##7. 其他 # 关闭防火墙,不关闭防火墙可能导致无法访问 Hadoop 的 Web UI 界面: > systemctl status firewalld # 查看防火墙(云服务器在供应商控制台界面操作) > systemctl status firewalld # 关闭防火墙 ##8. 集群对内外端口开放(云服务器端口默认关闭状态,在供应商控制台界面防火墙打开对应端口) -- 启用hadoop集群后端口使用 腾讯云(主节点): 9870(hdfs web UI)# Namenode 8020(namenode RPC) 9864(dfs.datanode.http.address),# DataNode 9866(dfs.datanode.address), 9867(dfs.datanode.ipc.address) 19888(yarn.log.server.url) # 历史服务器 百度云(从节点): 9868(dfs.namenode.secondary.http-address)# SecondaryNameNode 9864(dfs.datanode.http.address),# DataNode 9866(dfs.datanode.address), 9867(dfs.datanode.ipc.address) -- 启动yarn服务端口使用 腾讯云(主节点): 8088(yarn.resourcemanager.webapp.address)、# Resourcemanager 8030(yarn.resourcemanager.scheduler.address)、 8031(yarn.resourcemanager.resource-tracker.address)、 8032(yarn.resourcemanager.address ipc)、 8033(yarn.resourcemanager.admin.address) 8040(yarn.nodemanager.localizer.address)、#Nodemanager 8042(yarn.nodemanager.webapp.address)、 百度云(从节点):8040(yarn.nodemanager.localizer.address)、# Nodemanager 8042(yarn.nodemanager.webapp.address)
发生问题及解决:
# 问题1:‘nodemanager did not stop gracefully after 5 seconds’
# 解决方案: 开放namenode 8031端口,
# 问题2:‘hadoop web 界面 Summary 数值为空’
# 解决方案:以前有报错,删除hadoop.tmp.dir临时启动文件和dfs.name.dir和data.dir下的文件,重启初始化hdfs namenode -format,重新启动hdfs
# 问题3:接问题2‘hadoop web 只显示本机datanode 从节点datanode服务已开启,但不显示; 从节点下datanode文件夹下没有current文件夹,没有集群版本信息’
# 查看日志datanode节点‘Retrying connect to server: hadoop01/xxxx:8020. Already tried 0time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)’
# 解决方案: 修改/etc/hosts配置文件,远程节点IP地址写公网IP,本机IP写内网IP(不能写127.0.0.1)
## 1. 解压(即安装) > tar -xzvf ./spark-3.1.3-bin-hadoop3.2.tgz # --》/home/hadoop/app/spark-3.1.3-bin-hadoop3.2 ## 2. 配置主机环境变量 > vim /etc/profile ''' export SPARK_HOME=/home/hadoop/app/spark-3.1.3-bin-hadoop3.2 export PATH=${SPARK_HOME}/bin:$PATH ''' > source /etc/profile # 使配置生效 ## 3. 配置spark环境变量 > vim /home/hadoop/app/spark-3.1.3-bin-hadoop3.2/conf/spark-env.sh # 添加 ' # 指定hadoop/yarn的配置目录,这些配置用于写入 HDFS 并连接到 YARN ResourceManager, # 目录中包含的配置将分发到 YARN 集群,以便应用程序使用的所有容器使用相同的配置。如果配置引用了不受 YARN 管理的 Java 系统属性或环境变量,它们也应该在 Spark 应用程序的配置(驱动程序、执行程序和以客户端模式运行时的 AM)中进行设置(python环境)。 export HADOOP_CONF_DIR=/home/hadoop/app/hadoop-3.2.0/etc/hadoop/ export YARN_CONF_DIR=/home/hadoop/app/hadoop-3.2.0/etc/hadoop/ # 指定python环境 export PYSPARK_DRIVER_PYTHON=/home/hadoop/app/anaconda3/bin/python3 export PYSPARK_PYTHON=/home/hadoop/app/anaconda3/bin/python3 ' ## 4. 配置SPARK历史服务器 # 修改spark-defaults.conf文件 > vim spark-defaults.conf ''' spark.eventLog.enabled true spark.eventLog.dir hdfs://hadoop01:8020/spark/eventLogs # hdfs 该目录需提前存在 spark.history.fs.logDirectory=hdfs://hadoop01:8020/spark/eventLogs # 历史服务读取日志目录 spark.eventLog.compress true # 是否压缩记录的事件 spark.yarn.historyServer.address hadoop01:18080 # Spark 历史服务器的地址,当 Spark 应用程序完成,将应用程序从 ResourceManager UI 链接到 Spark 历史服务器 UI 时,此地址将提供给 YARN ResourceManager。 spark.yarn.historyServer.allowTracking true ''' > scp -r /home/hadoop/app/spark-3.1.3-bin-hadoop3.2/conf/* hadoop02:/home/hadoop/app/spark-3.1.3-bin-hadoop3.2/conf/ # 分发spark配置 ## 5. spark历史服务器启动 > cd /home/hadoop/app/spark-3.1.3-bin-hadoop3.2/sbin > ./start-history-server.sh # 开启历史服务的日志存储${SPARK_HOME}/logs/,有报错可查看。 ## 6. Spark提交案例(通过spark历史服务器查看实际运行环境,见附录2) > spark-submit \ --master yarn \ --deploy-mode cluster \ --num-executors 3 \ /home/hadoop/app/spark-3.1.3-bin-hadoop3.2/examples/src/main/python/pi.py 100 # 自定义指定python运行环境 -- conf spark.yarn.dist.archives=hdfs://***/***/***/env/project_env.zip#project_env\ --conf spark.pyspark.driver.python=./project_env/bin/python \ --conf spark.pyspark.python=./project_env/bin/python \ ## 7. spark-submit提交参数 见附录1
## 1. spark pre-build with hadoop 和 no-hadoop 版本区别
## 2. spark历史服务器 和 yarn日志聚集 之间联系
## 3. spark是否需要分发(主要是环境配置)。
提交脚本格式 | |
---|---|
Usage: spark-submit [options] "app jar | python file | R file" [app arguments] | |
Options: | 注释 |
--master MASTER_URL | spark://host:port, mesos://host:port, yarn,k8s://https://host:port,local (Default: local[*]). |
--deploy-mode DEPLOY_MODE | 运行模式 'client/cluster '(Default: client) |
--class CLASS_NAME | 您的应用程序的主类(用于 Java / Scala 应用程序,python应该不需要)。 |
--name NAME | 应用程序的名称。 |
--packages | 要包含在驱动程序和执行程序类路径中的 jar 的 maven 坐标的逗号分隔列表。 |
--py-files PY_FILES | 逗号分隔的 .zip、.egg 或 .py 文件列表,提交的python文件和入口文件在同一目录下,这里面包括Python应用主程序,这些文件将被交付给每一个执行器来使用。 |
--files FILES | 逗号分隔的文件列表,放置在每个执行器的工作目录中。这些文件在执行器中的文件路径可以通过 SparkFiles.get(fileName) 访问。 |
--archives ARCHIVES | 要提取到每个执行程序的工作目录中的以逗号分隔的档案列表。 |
--conf, -c PROP=VALUE | 任意 Spark 配置属性 |
--properties-file FILE | 加载额外属性的文件路径。如果未指定,默认查找 conf/spark-defaults.conf |
--driver-memory MEM | driver程序内存(例如 1000M,2G)(默认值:1024M)。 |
--executor-memory MEM | 每个executor的内存(例如 1000M,2G)(默认值:1G) |
仅集群部署模式: | |
--driver-cores NUM | drive使用的核心数(默认值:1)。 |
--executor-cores | 每个executor可以使用的cpu核心(Yarn和K8S默认1,standalone默认worker可利用的全部核心) |
Spark 仅适用于 YARN 和 Kubernetes: | |
--num-executors NUM | 要启动的执行程序数量(默认值:2)。 如果启用了动态分配,则执行器的初始数量将至少为 NUM。 |
--principal PRINCIPAL | 用于登录 KDC 的主体。 |
--keytab KEYTAB | 包含以上指定主体的密钥表的文件的完整路径。 |
Spark 仅适用于 YARN: | |
--queue QUEUE_NAME | 要提交到的 YARN 队列(默认值:“default”)。 |
Runtime Information
Name | Value |
---|---|
Java Home | /home/hadoop/app/jdk1.8.0_333/jre |
Java Version | 1.8.0_333 (Oracle Corporation) |
Scala Version | version 2.12.10 |
Spark Properties
Name | Value |
---|---|
spark.app.id | application_1657586020314_0003 |
spark.app.name | PythonPi |
spark.app.startTime | 1658107682961 |
spark.driver.host | hadoop01 |
spark.driver.port | 36601 |
spark.eventLog.compress | true |
spark.eventLog.dir | hdfs://hadoop01:8020/spark/eventLogs |
spark.eventLog.enabled | true |
spark.executor.id | driver |
spark.executor.instances | 3 |
spark.executorEnv.PYTHONPATH | {{PWD}}/pyspark.zip{{PWD}}/py4j-0.10.9-src.zip |
spark.history.fs.logDirectory | hdfs://hadoop01:8020/spark/eventLogs |
spark.master | yarn |
spark.org.apache.hadoop.yarn.server.webproxy.amfilter.AmIpFilter.param.PROXY_HOSTS | hadoop01 |
spark.org.apache.hadoop.yarn.server.webproxy.amfilter.AmIpFilter.param.PROXY_URI_BASES | http://hadoop01:8088/proxy/application_1657586020314_0003 |
spark.rdd.compress | True |
spark.scheduler.mode | FIFO |
spark.serializer.objectStreamReset | 100 |
spark.submit.deployMode | cluster |
spark.submit.pyFiles | |
spark.ui.filters | org.apache.hadoop.yarn.server.webproxy.amfilter.AmIpFilter |
spark.ui.port | 0 |
spark.yarn.app.container.log.dir | /home/hadoop/app/hadoop-3.2.0/logs/userlogs/application_1657586020314_0003/container_1657586020314_0003_01_000001 |
spark.yarn.app.id | application_1657586020314_0003 |
spark.yarn.historyServer.address | hadoop01:18080 |
spark.yarn.historyServer.allowTracking | true |
spark.yarn.isPython | true |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。