虚拟机环境搭建
工作环境:CentOS7
工作任务:配置四台虚拟机的工作环境
工作时间:2019/03/06-2019/03/15
Java环境:JAVA_HOME=/usr/java/jdk1.8.0_181
文章目录
I.集群配置
1.虚拟机配置
四台虚拟机配置:
用户名 | 名称 | IP | 配置 | 密码 | Hostname |
---|---|---|---|---|---|
hadoop | hadoop_cluster-1 | *.58 | 4核 8GB 300GB | * | hadoop-cluster-1.novalocal |
hadoop | hadoop_cluster-2 | *.59 | 4核 8GB 300GB | * | hadoop-cluster-2.novalocal |
hadoop | hadoop_cluster-3 | *.68 | 4核 8GB 300GB | * | hadoop-cluster-3.novalocal |
hadoop | hadoop_cluster-4 | *.75 | 4核 8GB 300GB | * | hadoop-cluster-4.novalocal |
集群配置
cluster-1 | cluster-2 | cluster-3 | cluster-4 | |
---|---|---|---|---|
Namenode | √ | |||
SecondaryNamenode | √ | |||
Datanode | √ | √ | √ | √ |
ResourceManager | √ | |||
NodeManger | √ | √ | √ | √ |
Spark | √ | |||
Python3.6 | √ | √ | √ | √ |
用户与组配置:
- 超级管理员:root
- Hadoop用户组:
- hadoop:组管理员
- spark
- …
- Hadoop用户组:
2.软件配置
安装路径 Web | UI | URL |
---|---|---|
Java-jdk1.8.0_181 | /usr/java/jdk1.8.0_181 | / |
Python-3.6 | /usr/Python-3.6.8 | / |
Scala | /bigdata/usr/scala-2.12.8 | / |
Hadoop-2.7.2 | /bigdata/usr/hadoop-2.7.2 | HDFS: http://.58:50070 Yarn: http://.68:8088 |
Spark | /bigdata/usr/spark-2.3.3-bin-hadoop2.7 | http://*.58:8042(不确定) |
Jupyter Notebook | yum install | http://*.58:8088(不确定) |
II.流程:
1.前期准备:
-
ssh远程登录:
# vi /etc/ssh/sshd_config PasswordAuthentication yes # service sshd restart
-
挂载硬盘
使用的云平台下,需要手动挂载硬盘。使用300G中的200G,挂载在/bigdata下
-
无秘钥登录设置
# vi /etc/hosts
添加以下内容:
*.58 hadoop-cluster-1 *.59 hadoop-cluster-2 *.68 hadoop-cluster-3 *.75 hadoop-cluster-4
设置Namenode免密登录,生成server58的秘钥,并将公钥添加到其他3台服务器上:
生成master(server47)公钥# ssh-keygen -t rsa
将公钥追加到root用户的授权keys中。
# ssh-copy-id username@ip
注:root权限和hadoop权限都要执行一次。为了方便操作,所有的秘钥都互相添加。
-
修改环境变量:
# vi /etc/profile
export JAVA_HOME=//usr/java/jdk1.8.0_181 export HADOOP_HOME=/bigdata/usr/hadoop-2.7.2 export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar export PATH=$PATH:${JAVA_HOME}/bin:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin
# source /etc/profile
-
关闭防火墙
永久性生效
开启:chkconfig iptables on
关闭:chkconfig iptables off
即时生效,重启后失效
开启:service iptables start
关闭:service iptables stop
2. Hadoop-2.2.7
-
解压到/bigdata/usr/下
-
配置相关文件:
(1) 核心配置文件
core-site.xml<!-- 指定HDFS中NameNode的地址--> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop102:9000</value> </property> <!-- 指定hadoop运行时产生文件的存储目录--> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop-2.7.2/data/tmp</value> </property>
(2) hdfs配置文件
export JAVA_HOME=/opt/module/jdk1.8.0_144
hdfs-site.xml
<property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.namenode.secondary.http-address</name> <value>hadoop104:50090</value> </property>
(3)yarn配置文件
export JAVA_HOME=/opt/module/jdk1.8.0_144
yarn-site.xml
<!-- reducer获取数据的方式--> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定YARN的ResourceManager的地址--> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop103</value> </property>
(4)mapreduce配置文件
mapred-env.shexport JAVA_HOME=/opt/module/jdk1.8.0_144
mapred-site.xml
# cp mapred-site.xml.template mapred-site.xml
<!-- 指定mr运行在yarn上--> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
3.将hadoop文件夹分发给各个虚拟机,随后修改文件夹所有者和组
# chown -R hadoop /bigdata/usr/hadoop-2.7.2
# chgrp -R hadoop /bigdata/usr/hadoop-2.7.2
4.启动
第一次启动需要格式化NameNode
# hdfs namenode -format
启动
# start-dfs.sh
在ResouceManager所在的机器上启动yarn
# start-yarn.sh
在浏览器查看:*.58:50090
3. Python-3.6.8 & Scala-2.12.8
Scala
下载scala-2.12.8,在相关位置解压之后修改/etc/profile,添加相关路径。新建用户spark,所属组为hadoop。将scala的用户与组改为spark hadoop。
检查:
# scala -version
Scala code runner version 2.12.8 -- Copyright 2002-2018, LAMP/EPFL and Lightbend, Inc.
Python
CentOS自带的Python版本是Python 2.7.5,新安装一个Python3.x版本适配PySpark。不要删除原系统的python2.x版本,因为有一些软件依赖python2.x,删除则会导致这些软件无法使用。因此就涉及到如何将两个版本的python分开的问题。
安装Python和编译依赖的环境
# yum install openssl -y
# yum install openssl-devel -y
# yum install zlib
# yum install zlib-devel
# yum install gcc
# yum install sqlite-devel(为了以后可以安装jupyter notebook)
去官网下载3.6.8源代码;解压在/usr下
# cd /usr/Python-3.6.8
# ./configure
# make
# make install
检查:
# python3 --version
Python 3.6.8
# python --version
Python 2.7.5
测试pip(一般安装完成之后会自动安装好pip,注意应使用pip3才能作用于python3.x)
如果没有自动安装好pip,则需要手动安装。
# pip3 install numpy
# pip3 install matplotlib
# python
Python 3.6.8 (default, Mar 16 2019, 11:59:26)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>import numpy # 添加gdal库
4. Spark-2.3.3
官网下载Spark2.3.3版本的二进制包,解压到/bigdata/usr,在/etc/profile中添加相关的环境变量之后source。
测试:
#Spark-shell
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.3.3
/_/
Using Scala version 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_181)
Type in expressions to have them evaluated.
Type :help for more information.
在这里,我选择依赖yarn运行spark。需要修改spark-env.sh
# cd /bigdata/usr/spark-2.3.3-bin-hadoop2.7/conf
# cp cp spark-env.sh.template spark-env.sh
# vi spark-env.sh
添加:
export HADOOP_CONF_DIR=/bigdata/usr/hadoop-2.7.2/etc/Hadoop
export PYSPARK_PYTHON=/usr/local/bin/python3.6
由于是Yarn启动,只需要将Hadoop的信息添加上去即可,具体的任务将有yarn分配给集群去完成。第二个是为了告诉Spark使用非系统默认的Python。
随后,修改yarn-env.xml,添加一下内容:
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
如果不设置,会导致内存分配不足的问题,随后将yarn-env.xml分发给每个机器,重启hadoop所有服务。
通过yarn开启spark
# spark-shell --master yarn-client
或者spark-shell
pyspark --master yarn --deploy-mode client
结果:
# spark-shell --master yarn --deploy-mode client
2019-03-16 13:50:46 WARN NativeCodeLoader:62 - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
2019-03-16 13:50:51 WARN Client:66 - Neither spark.yarn.jars nor spark.yarn.archive is set, falling back to uploading libraries under SPARK_HOME.
Spark context Web UI available at http://hadoop-cluster-1.novalocal:4040
Spark context available as 'sc' (master = yarn, app id = application_1552192848930_0003).
Spark session available as 'spark'.
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.3.3
/_/
Using Scala version 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_181)
Type in expressions to have them evaluated.
Type :help for more information.
scala>
其中,发现两条有用的信息:
- 通过http://hadoop-cluster-1.novalocal:4040可以访问Spark的WebUI,但是由于我无法修改虚拟机的hostname和对应关系。只能通过访问ip地址来访问。将所有的hostname改为对应的IP地址即可。实际上它会转跳到位于ResourceManager所在的虚拟机上,同样的,修改成IP即可。
- 提供的语言是Scala,下面开始将Scala替换为Python3.x,并使用PySpark。
5. Jupyter Notebook
# pip3 install jupyter
# jupyter notebook --allow-root –ip 0.0.0.0
随后,可以登录提示的网址登录(其他主机需要将0.0.0.0换成虚拟机ip地址),如:
http://.58:8888 密码:
修改默认code目录:/bigdata/code
# vim /root/.jupyter/jupyter_notebook_config.py
c.NotebookApp.notebook_dir = '/bigdata/code'
注:如果需要使用集群,即使使用yarn启动,也需要在其他服务器上安装python环境
修改系统环境变量,添加以下内容:
export PYTHONPATH=$SPARK_HOME/python/:$PYTHONPATH
export PYTHONPATH=$SPARK_HOME/python/lib/py4j-0.10.7-src.zip:$PYTHONPATH
export PYSPARK_PYTHON=python3
export PYSPARK_DRIVER_PYTHON=jupyter
export PYSPARK_DRIVER_PYTHON_OPTS="notebook --ip=0.0.0.0 --allow-root"
-
通过以下指令开启yarn模式
pyspark --master yarn --deploy-mode client –name 项目名称
注意:在这种模式之下,只能同时运行一个项目
测试代码:
lis = [1,2,3,4,5,6] print(type(lis)) vec = sc.parallelize(lis) print(type(vec)) print(vec.collect()) print(vec.count())
输出
<class 'list'> <class 'pyspark.rdd.RDD'> [1, 2, 3, 4, 5, 6] 6
-
通过以下指令开启local模式
jupyter notebook --allow-root --ip 0.0.0.0
进入WebUI之后,通过运行如下代码,开启本地运行模式
import os import sys spark_name = os.environ.get('SPARK_HOME',None) print (spark_name) if not spark_name: raise ValueErrorError('spark环境没有配置好') sys.path.insert(0,os.path.join(spark_name,'python3')) sys.path.insert(0,os.path.join(spark_name,'python3/lib/py4j')) exec(open(os.path.join(spark_name,'python/pyspark/shell.py',)).read()) # SparkContext available as 'sc' # SparkSession available as 'spark'.
问题:为什么yarn只启动了两台服务器?
如何分配yarn的资源?
6. GDAL库
需要编译GDAL源代码,下载相关源文件,安装g++编译环境
# yum install gcc-c++ libstdc++-devel
在/bigdata/usr/gdal-2.3.3中编译文件(编译的过程十分漫长,因为使用c++进行编译):
# ./configure
# make
# make install
编译完成之后在…/swig/python下:
sudo python3 setup.py build
sudo python3 setup.py install
测试:
# python3
>>> import gdal
可能出现的问题:
ImportError: libgdal.so.20: cannot open shared object file: No such file or directory
查找该文件所在路径
sudo find / -name libgdal.so.20
将路径添加到~/.bashrc中
export LD_LIBRARY_PATH=/bigdata/usr/gdal-2.3.3/.libs/