2018年9月29日
阅读本文档者需要具备一定的linux、大数据平台架构经验,关键一点你需要一个VPN账号和堡垒机账号(单位管理规定)。
因为产品上线,临时申请了三台云服务器(有点措手不及),从晚上8点开始,和同事(小韩)一块进行服务器配置和应用部署,到第二天凌晨3点多,完全部署完成,并进行了服务测试,一切ok!有点小兴奋,晚上吃了个饭,到凌晨5点才在会议室睡着了(是不是有点贱)。
下面记录一下整个流程,以便自己后续遇到类似情况少犯错误(服务器平台环境不同,还是会遇到新的问题),另外,也希望能够帮助有需要的小伙伴。
整体的内容包括(1)云服务器配置(因为每个人用到服务器及服务器安装的软件、系统配置是不一样的,仅供参考)、(2)集群搭建之前的设置、(3)安装zookeeper、(4)安装hadoop集群、(5)安装spark集群、(6)安装kafka、(7)安装redis、(8)配置深度学习环境。
云服务器配置
搭建过程中可能需要在线安装一些软件,服务器首先要配置上网代理,并进行磁盘挂载操作。
1. 上网代理设置
上网代理设置比较简单,打开终端并执行下述命令即可:
echo -e "export http_proxy=http://ip:port\nexport http_proxy" >> /etc/profile && source /etc/profile
echo -e "export https_proxy=http://ip:port\nexport https_proxy" >> /etc/profile && source /etc/profile
2. 服务器磁盘挂载
新分配的云服务器的数据盘需要手动挂载,过程稍微复杂一些,这里参考运维中心提供的操作说明。
- 查看数据盘是否需要挂载
在终端输入df -h命令,如果看不到数据盘(在没有分区和格式化数据盘之前,是看不到数据盘),执行fdisk -l命令,如果发现存在/dev/vdb,则表示存在需要挂载的数据盘,否则,表示没有数据盘需要挂载,具体操作如下图所示,显示信息因服务器不同会有所差别,比如vdb是待挂载数据盘名称,也有可能是其他名称。
- 对数据盘进行分区
运行 fdisk /dev/vdb,对数据盘进行分区操作。根据提示,依次输入 n,p,1,两次回车,wq,分区就开始了。
- 查看新的分区
运行 fdisk -l 命令,查看新的分区。如果新分区 vdb1 已经创建好,会显示如下面示例中的/dev/vdb1。
- 对新分区进行格式化
运行 mkfs.ext3 /dev/vdb1,对新分区进行格式化。格式化所需时间取决于数据盘大小。您也可自主决定选用其他文件格式,如 ext4 等。
- 写入新分区信息
运行 echo /dev/xvdb1 /mnt ext3 defaults 0 0 >> /etc/fstab 写入新分区信息。完成后,可以使用 cat /etc/fstab 命令查看。
- 挂载新分区
运行 mount /dev/vdb1 /mnt 挂载新分区,然后执行 df -h 查看分区。如果出现数据盘信息,说明挂载成功,可以使用新分区了。
集群搭建之前的准备工作
这一步主要是对服务器做必要的设置,方便后续集群搭建工作。主要包括服务器主机名修改,添加主机名和IP地址映射,设置主机之间的免口令登陆,安装JDK。
首先,确定三台主机的主机名分别为:risbigdata5、risbigdata6、risbigdata7;
其次,在risbigdata5的/mnt目录下,新建software文件夹,用来存在相关软件(本人习惯);
再次,将搭建集群所需要的软件拷贝到risbigdata5的/mnt/software下,接下来开始其它的工作。
1. 设置主机名
查看当前的主机名,在终端输入hostname;
设置新的主机名,在终端输入hostname risbigdata5,主机名被设置为risbigdata5。其它修改主机名的方法如下:
- 也可以通过编辑network文件,来修改主机名,不过这种情况下需要重启服务器才能生效。具体操作如下:
vi /etc/systconfig/network
添加或修改的内容为:HOSTNAME=risbigdata5
- 通过编辑hosts文件,给127.0.0.1添加主机名来实现。具体操作如下:
vi /etc/hosts
添加或修改的内容为:127.0.0.1 localhost localhost.localdomain localhost6 localhost6.localdomain6 risbigdata5
2. 添加主机名和IP地址映射
打开终端,编辑/etc/hosts,添加集群中所有主机的ip和主机名映射(每一台主机的设置相同),本文配置的三台主机的ip和主机名设置如下:
3. 设置主机之间的免口令登陆
- 关闭selinux防火墙
通过vi /etc/selinux/config打开文件编辑,将SELINUX=enforcing修改为SELINUX=disabled, 重启机器可生效。最好执行一下防火墙停止命令(有不可以预知的原因),systemctl stop firewalld.service --停止firewall。
- 设置免口令登陆
生成ssh密钥
查看当前账户下是否存在.ssh目录(通过cd ~/.ssh,如果没有,会提示不存在,可通过mkdir创建,也可以不创建,在执行ssh-keygen -t rsa时会自动生成),然后通过ssh-keygen -t rsa为每个主机生成ssh密钥,遇到提示,直接按entor健就可以了。
生成授权文件
进入.ssh目录,cd ~/.ssh,通过密钥文件生成授权文件:cat id_rsa.pub>>authorized_keys,此时可以通过使用ssh无密码登陆本机了。
生成所有主机的授权文件
将三台主机的密钥都加入到授权文件authorized_keys中,然后将授权文件分发到每台主机的.ssh目录下。可以使用远程拷贝命令scp,需要知道主机的密码。
在每台主机上,执行ssh 主机名命令,如果不需要输入密码,则表示ssh无密码登陆设置成功。
4. 安装并配置Java运行环境
将准备好的jdk文件解压到/usr/local目录下,在终端执行tar -zxvf /mnt/software/jdk1.8.0_91.tar.gz命令,然后配置jdk环境变量,通过编辑/etc/profile,在done这一行的下一行添加如下内容:
export JAVA_HOME=/usr/local/jdk1.8.0_91
ClASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/jre/lib/tools.jar
export JAVA_HOME=$PATH:$JAVA_HOME/bin
然后,将profile和jak1.8.0_91文件将拷贝到risbigdata6、risbigdata7对应目录下,通过在终端执行java -version来验证安装配置是否正确,如果能够显示java版本信息表示安装配置正常。
Zookeeper集群搭建
1. 在/mnt下新建program目录,用来放置安装文件(深受windows影响)。
2. 将zookeeper文件解压到/usr/local目录下,在终端执行如下命令:
tar -zxvf /mnt/software/zookeeper-3.4.10.tar.gz -C /mnt/program
3. 配置zookeeper
- 通过zoo_sample.cfg新建一个zoo.cfg文件,在终端执行cp zoo_sample.cfg zoo.cfg命令;
- 修改zoo.cfg文件内容,具体修改如下:
其中,tickTime表示Zookeeper服务器心跳时间,单位毫秒
dataDir表示数据持久化路径,存储内存数据库快照、日志等数据
clientPort=2181 连接端口
server.1=risbigdata5:2888:3888 集群中第一个节点
server.2=risbigdata6:2888:3888 集群中第二个节点
server.3=risbigdata7:2888:3888 集群中第三个节点
server.1、server.2、server.3表示了不同的zookeeper服务器的自身标识,作为集群的一部分,每一台服务器应该知道其他服务器的信息。用户可以从“server.id=host:port:port” 中读取到相关信息。
- 创建myid文件,设置zookeeper服务器唯一标志
在zkdata目录下,创建myid文件,设置一行内容,指定的是自身的id值。比如,服务器“1”应该在myid文件中写入“1”。这个id必须在集群环境中服务器标识中是唯一的,且大小在1~255之间。本次配置中,三台服务器的myid分别设置为1、2和3。
注意:一定要把防火墙关闭掉。(经常会忽落掉,泪!)
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl status firewalld.service (查看关闭状态)
4. 配置环境变量
在/etc/profile文件中添加如下内容:
export ZOOKEEPER_HOME=/mnt/program/zookeeper3410
export PATH=$PATH:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf
5. 检查安装配置是否成功
- 将/etc/profile和/mnt/program/zookeeper3410拷贝到其它两个主机对应目录下。
- 打开终端,在zookeeper安装目录下,执行下列命令:
启动zookeeper
./bin/zkServer.sh start
#正常启动将会显示如下信息
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper3.4.10/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
通过JPS查看zookeeper线程
查看zookeeper状态
./bin/zkServer.sh status
#正常情况下会显示如下信息
ZooKeeper JMX enabled by default
Using config: /mnt/program/zookeeper3410/bin/../conf/zoo.cfg
Mode: follower(三台机器应该有一台是Leader)
停止zookeeper
./bin/zkServer.sh stop
#正常情况下会显示如下信息
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper3.4.10/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
Hadoop集群搭建
虽然只有三台机器,还是搭建了一个hadoop ha集群,规划如下:risbigdata5、risbigdata6规划为namenode节点,risbigdata6、risbigdata7规划为datanode节点。Hadoop HA的原理图为(插入个别人的图):
1. Hadoop安装配置
将hadoop文件解压到/mnt/program目录下,修改名称为hadoop27。然后,依次修改etc/hadoop目录下的hadoop-env.sh、mapred-env.sh、yarn-env.sh、slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml文件。
第一步,在hadoop-env.sh、mapred-env.sh、yarn-env.sh文件中,加上本机jdk的路径,具体修改内容如下:
编辑hadoop-env.sh文件,在# The java implementation to use.这一行后面加上export JAVA_HOME=/usr/local/jdk1.8.091;
编辑mapred-env.sh文件,找到# export JAVA_HOME=/home/y/libexec/jdk1.6.0/,将#去掉,并将=后面的内容修改为你自己的jdk路径,比如/usr/local/jdk1.8.091;
编辑yarn-env.sh文件,找到# some Java parameters这一行,在改行后面添加内容:export JAVA_HOME=/usr/local/jdk1.8.091
第二步,编辑slaves文件,添加作为datanode节点的主机名,内容如下:
risbigdata5
risbigdata6
risbigdata7
第三步,配置core-site.xml
<configuration>
<property>
<!--其它临时目录的根目录 -->
<name>hadoop.tmp.dir</name>
<value>file:/mnt/program/hadoop27/tmp</value>
<description>Abase for other temporary directies.</description>
</property>
<property>
<!--默认文件系统名称 -->
<name>fs.defaultFS</name>
<value>hdfs://amend</value>
</property>
<property>
<!--配置checkpoint删除周期,单位为分钟 -->
<name>fs.trash.interval</name>
<value>10080</value>
</property>
<property>
<!--zookeeper集群配置 -->
<name>ha.zookeeper.quorum</name>
<value>risbigdata5:2181,risbigdata6:2181,risbigdata7:2181</value>
</property>
</configuration>
第四步,配置hdfs-site.xml
<configuration>
<property>
<!--DFS name node存储路径-->
<name>dfs.namenode.name.dir</name>
<value>file:/mnt/program/hadoop27/dfs/name</value>
</property>
<property>
<!--DFS data node存储路径-->
<name>dfs.datanode.data.dir</name>
<value>file:/mnt/program/hadoop27/dfs/data</value>
</property>
<property>
<!--HDFS是否进行权限检查-->
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<property>
<!--namenode服务器 -->
<name>dfs.nameservices</name>
<value>amend</value>
</property>
<property>
<!--namenode服务器 -->
<name>dfs.ha.namenodes.amend</name>
<value>ris5,ris6</value>
</property>
<property>
<!--namenode服务器 -->
<name>dfs.namenode.rpc-address.amend.ris5</name>
<value>risbigdata5:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.amend.ris6</name>
<value>risbigdata6:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.amend.ris5</name>
<value>risbigdata5:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.amend.ris6</name>
<value>risbigdata6:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name> <value>qjournal://risbigdata5:8485;risbigdata6:8485;risbigdata7:8485/amend</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/mnt/program/hadoop27/journal</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.amend</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>ha.zookeeper.parent-znode</name>
<value>/hadoop-amend</value>
</property>
<property>
<name>dfs.client.block.write.replace-datanode-on-failure.enable</name>
<value>true</value>
</property>
<property>
<name>dfs.client.block.write.replace-datanode-on-failure.policy</name>
<value>NEVER</value>
</property>
</configuration>
第五步,mapred-site.xml
<configuration>
<property>
<!--The runtime framework for executing MapReduce jobs. Can be one of local, classic or yarn.-->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<!--The amount of memory to request from the scheduler for each reduce task.-->
<name>mapreduce.reduce.memory.mb</name>
<value>1024</value>
</property>
<property>
<!--The amount of memory to request from the scheduler for each map task.-->
<name>mapreduce.map.memory.mb</name>
<value>1024</value>
</property>
</configuration>
第六步,yarn-site.xml
<configuration>
<property>
<!--A comma separated list of services where service name should only contain a-zA-Z0-9_ and can not start with numbers-->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle,spark_shuffle</value>
</property>
<property>
<!--执行Hadoop MR作业-->
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property>
<property>
<!--执行spark作业,需要将${SPARK_HOME}/lib/spark-X.X.X-yarn-shuffle.jar拷贝到“${HADOOP_HOME}/share/hadoop/yarn/lib/目录下”-->
<name>yarn.nodemanager.aux-services.spark_shuffle.class</name>
<value>org.apache.spark.network.yarn.YarnShuffleService</value>
</property>
<property>
<!--Shuffle服务监听数据获取请求的端口-->
<name>spark.shuffle.service.port</name>
<value>7337</value>
</property>
<property>
<!--Enable RM high-availability. -->
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<!--Whether virtual memory limits will be enforced for containers.-->
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<property>
<!--Name of the cluster. -->
<name>yarn.resourcemanager.cluster-id</name>
<value>amend_cluster</value>
</property>
<property>
<!--The list of RM nodes in the cluster when HA is enabled. See description of yarn.resourcemanager.ha .enabled for full details on how this is used.-->
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>risbigdata5,risbigdata6</value>
</property>
<property>
<!--RM主机名>
<name>yarn.resourcemanager.hostname.risbigdata5</name>
<value>risbigdata5</value>
</property>
<property>
<!--RM主机名>
<name>yarn.resourcemanager.hostname.risbigdata6</name>
<value>risbigdata6</value>
</property>
<property>
<!--RM HTTP访问地址,查看集群信息-->
<name>yarn.resourcemanager.webapp.address.risbigdata5</name>
<value>risbigdata5:8088</value>
</property>
<property>
<!--RM HTTP访问地址,查看集群信息-->
<name>yarn.resourcemanager.webapp.address.risbigdata6</name>
<value>risbigdata6:8088</value>
</property>
<property>
<!--使用ZK集群保存状态信息-->
<name>yarn.resourcemanager.zk-address</name>
<value>risbigdata5:2181,risbigdata6:2181,risbigdata7:2181</value>
</property>
<property>
<!--Enable RM to recover state after starting. If true, then yarn.resourcemanager.store.class must be specified.-->
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<property>
<!--The class to use as the persistent store.-->
<name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<property>
<!--Amount of physical memory, in MB, that can be allocated for containers. -->
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value>
</property>
<property>
<!--The minimum allocation for every container request at the RM in MBs-->
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>256</value>
</property>
<property>
<!--The maximum allocation for every container request at the RM in MBs. -->
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>2048</value>
</property>
<property>
<!--The address of the container manager in the NM-->
<name>yarn.nodemanager.address</name>
<value>0.0.0.0</value>
</property>
</configuration>
第七步,设置环境变量,修改/etc/profile文件,添加如下信息:
export HADOOP_HOME=/mnt/program/hadoop27
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_COMMON_LIB_NATIVE_DIR"
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
最后一步,将risbigdata5上配置好的hadoop拷贝到risbigdata6、risbigdata7对应目录下,将/etc/profile同步到risbigdata6、risbigdata7主机上,并在每台主机上分别执行source /etc/profile操作。
至此,整个hadoop安装和配置基本完成,另外,为了执行spark作业,别忘了把将“${SPARK_HOME}/lib/spark-X.X.X-yarn-shuffle.jar”拷贝到“${HADOOP_HOME}/share/hadoop/yarn/lib/目录下”。
上述配置方式,仅仅只是一种可以用方式,如果想更好的使用hadoop集群,还需要深入学习一下各个变量如何更好的设置,才能使得集群达到最优,并能更好满足业务的需要。
2. Hadoop启动并验证
安装并配置好每个节点hadoop之后,接下来就是调试(因为可能会遇到各种问题,所以我称之为调试,而不是启动。)
首先,确定每个节点正常启动应该执行的进程,上述部署方法每个节点启动的进程如下:
risbigdata5 | risbigdata6 | risbigdata7 |
NameNode ResourceManager JournalNode DFSZKFailoverController DataNode NodeManager | NameNode ResourceManager DataNode NodeManager JournalNode DFSZKFailoverController | DataNode NodeManager JournalNode
|
启动方式,网上有很多人写,但是真正好用的不是很好找(因为每个搭建集群时的hadoop版本、操作系统配置等等不尽相同),最终,还是需要自己去尝试,去解决遇到的各种问题。下面是一个较为通用的一个流程(感谢小郭提供的资料),主要包括启动和验证的操作方法。
启动HDFS
- -formatZK操作
因为是搭建的hadoop-ha集群,所以首先要做的就是在ZK上创建一个父目录,以便后续fc把nn的状态写到该目录下。可以在集群的任意一个nn节点上执行下面的操作,并且该操作只需要执行一次就可以。
hdfs zkfc -formatZK
需要注意的是:默认情况下会在zookeeper集群上创建一个名为hadoop-ha的节点,为了便于多个集群共用一个zookeeper集群,最好给每个hadoop-ha集群起一个不同的名字。
验证方法:查看是否有异常日志,查看是否zookeeper上是否创建了hadoop-[*]目录,[*]为你所设定的名称,对应于hdfs-site.xml中dfs.nameservices。
- 启动JournalNode
在hadoop2配置高可用集群时,会同时启动2个nn节点,其中一个处于工作状态(active),一个处于非工作状态(standby)。JournalNode可以实现nn之间的数据同步。在每个主机上执行下面的命令,即可启动JournalNode进程。
hadoop-daemon.sh start journalnode
- 格式化NameNode
在hadoop2的集群配置中,因为是双nn节点,需要在每个nn节点上进行格式化操作,并启动NameNode进程。
首先,在确定为Active的主机上,执行hdfs namenode -format命令,进行格式化操作,然后,通过hadoop-daemon.sh start namenode命令来启动该nn节点;
其次,在确定为Standby的主机上,执行hdfs namenode -bootstrapStandby操作,然后,通过hadoop-daemon.sh start namenode命令启动该nn节点。
- 启动ZKFC
在两个NameNode的节点执行下面的命令来启动ZKFC进程
hadoop-daemon.sh start zkfc
- 启动DataNode
在所有需要启动DataNode的节点上,执行下面的命令来启动DataNode服务进程。
hadoop-daemon.sh start datanode
验证HDFS
- 通过jps命令,查看各个进程是否启动;
- 在HDFS中创建目录
hdfs dfs -mkdir /user/demo/input/wordcount (hdfs上的目录)
hdfs dfs -mkdir /user/demo/output
- 导入数据到HDFS
hdfs dfs -put /home/hadmin/Hadoop/README.txt(本地文件) /user/demo/input/wordcount(hdfs上的目录)
- 查看HDFS目录
hdfs dfs -ls /user/demo/input/wordcount (hdfs上的目录)
- 查看HDFS中的文件
hdfs dfs -cat /user/demo/input/wordcount/README.txt
- 访问HDFS NameNode的监控界面,主机不一定安装图形界面,如果服务器支持或者远程可连接主机,可以打开浏览器,在浏览器中输入:
http://namenode1:50070
http://namenode2:50070
如果上述操作都可以执行成功,说明HDFS启动成功,可以进行下一步了。
启动YARN
- 启动ResourceManager
在risbigdata5节点上启动ResourceManager,执行下面的命令:
yarn-daemon.sh start resourcemanager
在risbigdata6节点上启动ResourceManager,执行下面的命令:
yarn-daemon.sh start resourcemanager
- 启动NodeManager
在risbigdata5、risbigdata6、risbigdata7节点上启动NodeManager,分别执行下面的命令:
yarn-daemon.sh start nodemanager
验证YARN
- 通过jps命令查看上述步骤启动进程是否启动;
- 查看ResourceManager服务状态
yarn rmadmin -getServiceState risbigdata5 显示为active
yarn rmadmin -getServiceState risbigdata6 显示为standby
- 执行MapReduce的WordCount程序
hadoop jar /home/hadmin/demo/hadoop/WordCount-1.0.jar com.tod.demo.WordCount
hdfs:///user/demo/input/wordcount/README.txt hdfs:///user/demo/output/wordcount
- 查看MapReduce的WordCount程序的执行结果
hadoop fs -cat hdfs:///user/demo/output/wordcount/part-r-00000
- 访问YARN ResourceManager的监控界面,主机不一定安装图形界面,如果服务器支持或者远程可连接主机,可以打开浏览器,在浏览器中输入:
http://risbigdata5:8088
http://risbigdata6:8088
如果上述操作都可以执行成功,说明YARN启动成功。
至此,整个hadoop集群搭建成功!!!
Spark集群搭建
下面开始安装和配置Spark,相对于Hadoop-ha要简单不少,涉及到的配置也不多,由于spark依赖scala库,需要安装并配置scala,本次安装的是scala2.1.10版本,并在/etc/profile中添加环境变量:
export SCALA_HOME=/usr/local/scala2110
Export PATH=$PATH:$SCALA_HOME/bin
-
- Spark安装和配置
首先,还是要将spark安装文件解压到/mnt/program目录下,便于管理,都放在一个目录下。将解压后的文件夹,修改名称,比如修改后为spark23127(为了便于记住使用的spark版本及其所对应的hadoop版本)。
其次,需要修改spark的conf目录下的slaves和spark-env.sh文件,如果不存在就创建。
- 编辑slaves文件
将作为worker节点的主机名称,添加到该文件中,本次配置中,将 risbigdata5、risbigdata6、risbigdata7都作为worker节点
- 编辑spark-env.sh文件,添加如下配置:
export SPARK_PID_DIR=/mnt/program/spark23127/spark_pids
export SCALA_HOME=/usr/local/scala2110
export JAVA_HOME=/usr/local/jdk1.8.091
export HADOOP_HOME=/mnt/program/hadoop27
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export SPARK_MASTER_HOST=risbigdata5
export SPARK_WORKER_MEMORY=20G
export SPARK_WORKER_CORES=16
export SPARK_WORKER_INSTANCES=1
export SPARK_EXECUTOR_CORES=16
export SPARK_EXECUTOR_MEMORY=1G
export SPARK_WORKER_DIR=/mnt/program/spark23127/work
export SPARK_LOG_DIR=/mnt/applog/sparklog
- 添加环境变量,编辑/etc/profile,并添加如下信息:
export SPARK_HOME=/mnt/program/spark23127
export PATH=$PATH:$SPARK_HOME/bin
另外,因为要使用sparkStreaming+kafka的模式,还需要将spark-streaming-kafka-0-10_2.11_2.3.1.jar和kafka-clients-0.10.0.1.jar拷贝到spark安装目录下的jars文件夹下。
最后,将scala、spark安装目录拷贝到risbigdata6,risbigdata7对应目录下,同步/etc/profile文件,并执行source /etc/profile操作。
-
- Spark启动和验证
- 启动spark
在spark的master节点risbigdata5上,到spark安装目录下,执行下面命令,就可以启动整个spark集群了。
./bin/start-all.sh
- 集群验证
- 通过jps查看进程情况;
- 运行spark自带的example,执行命令如下:
spark-submit --class org.apache.spark.examples.JavaSparkPi --master spark://risbigdata5:7077 ../examples/jars/spark-examples_2.11-2.3.1.jar 1
- Kafka集群搭建
- Kafka安装配置
将kafka安装文件解压到/mnt/program目录下,重名为kafka211100,然后编辑conf目录下的server.properties文件,主要设置如下信息:
broker.id=0
port=9092
log.dir=/usr/local/kafka2111/log
listeners=PLAINTEXT://risbigdata5:9092
advertised.listeners=PLAINTEXT://risbigdata5:9092
zookeeper.connect=risbigdata5:2181,risbigdata6:2181,risbigdata7:2181
将kafka211100拷贝到risbigdata6、risbigdata7两台主机的相应目录下,修改broker.id分别为1,2;修改listeners、advertised.listeners为本主机的主机名。
- 启动和验证
- 启动kafka,在每个主机节点执行
在kafka安装目录下,执行./bin/kafka-server-start.sh conf/server.properties
- 创建一个topic,包含有1个Partition分区和1个备份的broker
./bin/kafka-topic.sh --create --zookeeper xhp1:2181 --replica 1 --partition 1 --topic test
- 启动Producer发送消息
定义一个发送给多个broker的Producer
./bin/kafka-console-producer.sh --broker-list risbigdata5:9092, risbigdata6:9093,xhp1:9094 --topic test
- 启动一个消费者来消费消息
./bin/kafka-console-consumer.sh --zookeeper risbigdata5:2181 --topic test--from-beginning
如果上述操作都能正常执行,表明kafka集群安装完成。
- Redis安装
- 下载安装包
在Centos下 执行下述命令,直接从网站下载安装包:
wget http://download.redis.io/releases/redis-4.0.2.tar.gz
解压安装包并安装
tar -zxvf redis-4.0.2.tar.gz
cd redis-4.0.2
make
make install
make test
Redis没有其他外部依赖,安装过程很简单。编译后在Redis源代码目录的src文件夹中可以找到若干个可执行程序,安装完 后,在/usr/local/bin目录中可以找到刚刚安装的redis可执行文件。如下图:
1)直接运行redis安装目录下的redis-server即可启动Redis
[root@localhost bin]# redis-server
- 深度学习环境配置
深度学习环境配置主要针对深度学习任务来进行配置的,如果不需要运行深度学习任务,该部分可以不用进行配置。
深度学习环境主要涉及到anaconda安装,及python库安装(包括pyspark、kafka、jieba、tensorflow、keras)。
-
- anconda安装
第一步,下载Anconda(耗时较久,如果有下载好Anconda安装包,可以直接拷贝使用),在终端执行下面的命令:
wget https://repo.continuum.io/archive/Anaconda2-5.1.0-Linux-x86_64.sh
第二步,安装Anaconda程序,安装命令如下:
bash Anaconda2-5.1.0-Linux-x86_64.sh
注:安装时全部选择yes和enter,直至直至“VSCode安装”前
第三步,把anaconda的bin所在目录加入系统环境变量,即编辑/etc/profile,在最后加入下面语句:
export PATH=~/anaconda2/bin:$PATH
注:安装过程中,可以设置anaconda的安装目录,默认情况下安装在~/目录下,安装完成后会自动在~/.bashrc中为当前用户添加环境变量,为了登陆本机的所有用户都可以使用,可以设置/etc/profile。
第四步,查看python的默认路径是否存在
[root@risbigdata5 ~]# which python
/root/anaconda2/bin/python
第五步,查看python的版本
[root@risbigdata5 ~]# python
Python 2.7.15 |Anaconda, Inc.| (default, May 1 2018, 23:32:55)
[GCC 7.2.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
正确显示第四步、第五步的信息,说明anaconda安装正确。
-
- 安装python库
- 查看Anaconda安装包默认安装的工具包及其版本,使用下面命令:
conda list
确认scikit-learn, numpy, scipy和pandas等均已安装;
- 若需要更新工具包版本,使用下面命令:
conda update PACKAGE_NAME
PACKAGE_NAME是指要更新的包名;
- 若需要安装其他工具包
conda install PACKAGE_NAME
可以依次将PACKAGE_NAME替换为pyspark、kafka、jieba、tensorflow、keras,实现这些python包的安装;
- 若需要删除某工具包
conda uninstall PACKAGE_NAME