ubuntu18.04下hadoop3.0.2+spark2.4.3分布式集群配置及测试
背景:
这学期课设要用sparkmlib的聚类和分类算法做一个文本分类模型,前期环境上做了很多工作,现在做一下总结,本来网上的资料足够多了,但是水平参此不齐,很容易掉进坑里,加上自己也有很多发现,所以还是写一篇吧。
对了,有一点就是大家在查资料还是用谷歌吧,尽量去看一下比较官方的资料,比如官方文档,大学实验室,机构等的那种,记得货比三家,抱着质疑的态度,理解了再采用,少走一些弯路,我在学习的过程中经常看厦门大学实验室的这个网站,感觉还不错。
不足之处,请多多指正!
1.集群基本环境
1.1.版本
ubuntu18.04 jdk1.8.0_211 hadoop-3.0.2 spark-2.4.3-bin-hadoop2.7 scala-2.11.8
1.2.用户
注意分布式的集群每个机器要有一个统一的用户。
此次我的主机名为aiden,即管理节点;同学的为wang1234,即数据节点:
hadoop@adien(master)
hadoop@wang1234(slaves)
本文就以这两台主机为例
/etc/hosts为
127.0.0.1 localhost
#127.0.1.1 aiden
192.168.43.200 aiden
192.168.43.155 wang1234
1.3.软件安装目录和环境变量
软件安装目录和环境变量也要一样(不知道叫软件合适不合适…),如果你是一个人作分布式,配好一个分发给节点,这个问题是不存在的。我们小组8个人刚开始是先自己搞自己的,结果最后在测试的时候会有类似于JAVA_HOME */ */ * / NOT EXISTS 等之类的情况,我们把上述目录统一以后,环境变量统一以后就ok了,不过不知道还有其他的解决办法没有,因为后续还有东西做,就先不管了。
1.3.1.安装目录
我们的结构:软件统一放在/opt/bigdata下面:
1.3.2. 环境变量
hadoop用户下 ~/.bashrc添加
#java
export JRE_HOME=${JAVA_HOME}/jre
export JAVA_HOME=/opt/bigdata/jdk1.8.0_211
export CLASSPATH=.:$JAVA_HOME/lib/
export PATH=$PATH:$JAVA_HOME/bin
export JAVA_HOME PATH CLASSPATH
#hadoop
export HADOOP_HOME=/opt/bigdata/hadoop-3.0.2
export PATH=$PATH:$HADOOP_HOME/sbin
export PATH=$PATH:$HADOOP_HOME/bin
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_YARN_HOME=$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_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
#scala
export SCALA_HOME=/opt/bigdata/scala-2.11.8
export PATH=$PATH:$SCALA_HOME/bin
#spark
export SPARK_HOME=/opt/bigdata/spark-2.4.3-bin-hadoop2.7
export PATH=$PATH:$SPARK_HOME/bin
2.添加集群用户及免密登录
2.1.添加hadoop用户赋予权限
2.1.1添加用户
sudo adduser hadoop
2.1.2赋予权限
注意很多人因为新生成的用户权限低,直接就把它提成root级的了,在sudoers里面添加进去,这是非常危险的!!!
以我的文件目录结构为例,应该只给它使用sudo命令的权限,以及/opt/bigdata下的所有文件操作权限,就足够了。
切换到root用户
su
给hadoop用户使用sudo的权限
usermod hadoop -a -G sudo
切换到hadoop用户
su hadoop
给hadoop用户/opt/bigdata下的所有文件操作权限
sudo chmod -R 700 /opt/bigdata
2.2.hadoop免密登录
过程原理(图片来自网友的文章):
2.2.1.自身免密登录
hadoop用户在adein(master)主机下
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
权限设置(权限过高可能会报错的,也很危险)
chmod 600 ~/.ssh/authorized_keys
同理hadooop用户在wang1234(slaves)主机下操作
2.2.2.互相免密登录(这点我们做的不好,用QQ相互发送的,很笨,大家可以找更好的办法)
如果要实现hadoop用户在master免密登录slaves,那么这样操作:
2.2.2.1 在adein(master)主机hadoop用户下,复制显示的内容
cat ~/.ssh/id_rsa.pub
2.2.2.2 在wang1234(slaves)主机hadooop用户下,打开密钥库,将复制内容拷贝到slaves的密钥库中
sudo gedit ~/.ssh/authorized_keys
3.hadoop集群配置
3.1.hadoop配置
进入/opt/bigdata/hadoop-3.0.2/etc/hadoop给配置文件追加配置
3.1.1 hadoop-env.sh
export JAVA_HOME=/opt/bigdata/jdk1.8.0_211
export HADOOP_HOME=/opt/bigdata/hadoop-3.0.2
3.1.2 hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/bigdata/hadoop-3.0.2/dfs/name</value>
<final>true</final>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/bigdata/hadoop-3.0.2/dfs/data</value>
<final>true</final>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
3.1.3 core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://aiden:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/bigdata/hadoop-3.0.2/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
</configuration>
3.1.4 mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>
${HADOOP_HOME}/etc/hadoop,
${HADOOP_HOME}/share/hadoop/common/*,
${HADOOP_HOME}/share/hadoop/common/lib/*,
${HADOOP_HOME}/share/hadoop/hdfs/*,
${HADOOP_HOME}/share/hadoop/hdfs/lib/*,
${HADOOP_HOME}/share/hadoop/mapreduce/*,
${HADOOP_HOME}/share/hadoop/mapreduce/lib/*,
${HADOOP_HOME}/share/hadoop/yarn/*,
${HADOOP_HOME}/share/hadoop/yarn/lib/*
</value>
</property>
</configuration>
3.1.5 yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>aiden</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>aiden:8088</value>
</property>
</configuration>
3.1.6 workers
workers相当于老版本的slaves,里面写入数据节点的主机名,一行一个,我这里的是同学的wang1234
wang1234
4.hadoop集群测试
4.1.启动haoop集群
namenode初始化
hdfs namenode -format
在adien(master)主机/opt/bigdata/hadoop-3.0.2/sbin下
./start-all.sh
启动之后在各个主机用jps命令查看启动的模块是否正常
jps
4.2.hdfs文件系统操作
创建目录
hadoop fs -mkdir /input
本地创建一个文件,随便写点东西
vim a.txt
上传文件
hadoop fs -put a.txt /input
查看文件
hadoop fs -cat /input/a.txt
4.3.webui查看
上述配置中是缺省端口配置的,所以是默认的端口
namenode节点查看,浏览器地址栏aiden:9870
datanode节点查看,浏览器地址栏wang1234:9864
资源管理查看,浏览器地址栏aiden:8088
4.4.单词统计测试
进入/opt/bigdata/hadoop-3.0.2/share/hadoop/mapreduce
hadoop jar hadoop-mapreduce-examples-3.0.2.jar wordcount /input /output
查看结果(不详细写了)
hadoop fs -cat /output/p*
5.spark集群配置
5.1.spark配置
/opt/bigdata/spark-2.4.3-bin-hadoop2.7/conf
spark-env.sh
export SCALA_HOME=${SCALA_HOME}
export JAVA_HOME=${JAVA_HOME}
export SPARK_MASTER_IP=aiden
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
slaves
wang1234
6.spark集群测试
6.1.启动spark
/opt/bigdata/spark-2.4.3-bin-hadoop2.7/sbin
./start-all.sh
6.2.spark-shell下单词统计
进入spark-shell
spark-shell
单词统计
val textFile = sc.textFile("hdfs://aiden:9000/input/a.txt")
val wordCounts = textFile.flatMap(line=>line.split(" ")).map(word=>(word,1)).reduceByKey((a,b)=>a+b)
wordCounts.collect();