在Vmware虚拟机上搭建Hadoop+Spark集群
本文记录在 Ubuntu Desktop 16.04 环境下,本机作为master节点,使用Vmware Workstation 14创建多个 Ubuntu Server 16.04虚拟机,作为slave节点,搭建hadoop和spark集群的过程。
# 基本环境
# 安装虚拟机
用Vmware创建多个虚拟机,这里创建3个,安装Ubuntu 16服务器版系统,没有图形界面,当作worker机器。
安装后,可使用 FileZilla 等工具,通过SFTP连接到各个虚拟机中,方便主机和虚拟机之间互相传输文件。
本文实验中,通过以下步骤Vmware网卡进行了简单设置:
VMnet1的子网ip设置为192.168.10.0
VMnet8的子网ip设置为192.168.31.0,网关ip设置为192.168.31.2
2
以上网卡设置可能不是必须项。
# 安装ssh server
sudo apt install openssh-server
# 安装oracle的jdk
到oracle官网下载jdk http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
解压jdk压缩包到要放置的目录下。
tar -zxvf jdk.tar.gz
在你的根目录下(root用户是在 /root/下,其他用户 cd ~ )配置环境变量
vi .bashrc
加入这些内容(第一项java home路径根据情况而定)
export JAVA_HOME=/home/anthony/programs/jdk1.8.0_171
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
2
3
4
保存,然后生效
source .bashrc
输入java查看是否成功找到。
可以先在有gui的master用gedit图形编辑器修改,改完后将文件复制一份到共享文件夹里,各个worker节点直接复制覆盖即可。
# 配置hosts文件
配置后,可直接用称呼(如master,worker1)来访问机器,无需记忆ip地址。
sudo vi /etc/hosts
在文件前面插入以下内容(ip根据实际情况定)
192.168.31.1 master
192.168.31.128 vm1
192.168.31.129 vm2
192.168.31.130
2
3
4
# 配置无密码ssh登录
在每台机器 /etc/ssh/sshd_config中,查找并确认开启了下面这一段
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
2
3
在每台机器上,运行
ssh-keygen -t rsa
中间的过程全回车默认即可。然后会在 ~/.ssh/下面生成id_rsa和id_rsa.pub两个文件。
把每台机器上的pub公钥文件收集到同一台机器上,文件里的内容一行一行追加到/.ssh/authorized_keys文件里面,然后把这个文件复制到其他各台机器的~/.ssh/目录下.
补充一个tip,可以使用下面的命令
ssh-copy-id -i id_rsa.pub master
将本机的密钥,发送到远程某台机器(这里是master,需注意,一般应写成 username@ip_address的形式,这里因为各台机器的username相同,又配好了hosts,就直接写成master就行了)的authorized_keys里.
配好以后,各台机器之间可以畅通无阻地互相访问了(首次访问时yes一下信任其fingerprint)。试试
ssh master
exit
ssh vm1
exit
ssh vm2
exit
...
2
3
4
5
6
7
# 配置hadoop
# 下载解压
官网下载 http://hadoop.apache.org/releases.html 或者从清华tuna之类的镜像站下载国内更快一些。
解压到某个目录下
tar -zxvf hadoop-2.9.0.tar.gz
# 配置环境变量
vi .bashrc
# 加入下面的
export HADOOP_HOME=/home/anthony/programs/hadoop-2.9.0
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
# source一下
source ~/.bashrc
2
3
4
5
6
7
8
输入hadoop即可生效。
# 创建一些目录
每台机器的hadoop文件夹下,创建tmp文件夹,创建hdfs/name 和 hdfs/data 文件夹。
# 设置hadoop的配置文件
以下文件均指在hadoop安装文件夹的/etc/hadoop目录下(而不是系统的/etc/下)
core-site.xml 中加入(注意,相关路径和ip地址根据情况自行修改,下面不再赘述此注意事项)
<property>
<name>hadoop.tmp.dir</name>
<value>file:///home/anthony/programs/hadoop-2.9.0/tmp</value>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value><!-- set up NameNode URI on every node-->
</property>
<property>
<name>io.file.buffer.size</name>
<value>131702</value>
</property>
2
3
4
5
6
7
8
9
10
11
12
hdfs-site.xml 中加入(这里只有两个slave节点,所以replication设置为2)
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///home/anthony/programs/hadoop-2.9.0/hdfs/name</value>
</property>
<property>
<name>dfs.datanode.name.dir</name>
<value>file:///home/anthony/programs/hadoop-2.9.0/hdfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:9001</value>
</property>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
复制mapred-site.xml.tempate到mapred-site.xml,编辑:
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value><!-- or yarn-tez, not local-->
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>64</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>128</value>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xms128m -Xmx256m</value>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xms128m -Xmx256m</value>
</property>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
编辑 yarn-site.xml :
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.nodemanager.hostname</name>
<value>localhost</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:9032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:9030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:9031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:9033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:9099</value>
</property>
<property>
<name>yarn.nodemanager.localizer.address</name>
<value>${yarn.nodemanager.hostname}:10222</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>1024</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>512</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>256</value>
</property>
<property>
<name>yarn.app.mapreduce.am.resource.mb</name>
<value>384</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>8</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>1</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
编辑 hadoop-env.sh :
# 找到JAVA_HOME这一行-注意,此处必须设置为路径】
export JAVA_HOME=/home/anthony/programs/jdk1.8.0_171
2
编辑 yarn-env.sh:
# 找到JAVA_HOME这一行【注意,此处保留默认,不设置为路径似乎也可以】
export JAVA_HOME=/home/anthony/programs/jdk1.8.0_171
# 找到 JAVA_HEAP_MAX 这一行
JAVA_HEAP_MAX=-Xmx3072m
2
3
4
修改 masters(没有则创建)文件,加入内容 master
修改 slaves文件,改成
vm1
vm2
2
在某一节点上将上述内容修改完成后,可将这些文件传到其他各台机器上,使用相同配置。
# 提示:复制某文件夹1中的全部文件,到另一文件夹2中
# 如果2不存在,可以直接写
cp -r f1 f2
# 如果2已经存在,则上述写法会导致将f1整个文件夹作为子文件夹复制到f2中,因此要写成
cp -r f1/. f2
2
3
4
5
# 格式化HDFS
第一次使用前需要先格式化HDFS,在master机器上,找到hadoop目录,bin,运行命令
./hdfs namenode -format
# 启动hadoop
切到hadoop下的sbin中
# 一起启动
./start-all.sh
# 分开启动
./start-dfs.sh
./start-yarn.sh
2
3
4
5
同样,对应的还有关闭功能。
# 使用hadoop
访问master的地址master:9099
,9099端口,来监控集群节点和资源。
访问master master:50070
,可以进行文件管理。
在worker节点上,运行命令jps
,可以看到有DataNode和NodeManager进程。
在master节点上,可以看到有ResourceManager,NameNode和SecondaryNameNode进程。
下面尝试一些简单操作,并运行wordcount示例程序:
# 查看hdfs报告
hdfs dfsadmin -report
# 文件夹操作
hdfs dfs -mkdir /input
hdfs dfs -chmod 777 /input
# 上传文本
hdfs dfs -put ./shakespeare.txt /input/
# 运行wordcount
# 要求 /output 目录不能存在,否则可能会报错
hadoop jar /home/anthony/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples2.9.0.jar wordcount /input/shakespeare.txt /output
# 输出结果放在/output 下
hdfs dfs -ls /output
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16