从3月22日到4月1日,整整十一天,hadoop搭建从入门到放弃,终于在愚人节完成了【开心.jpg】——Happy Fool's Day
目录
3.1 Hadoop2.7.3完全分布式集群搭建和测试(如果一切再重来)
3.2 The authenticity of host 'localhost (127.0.0.1)' can't be established的处理方法( stpeace)
3.3 linux下如何查询jdk的安装路径(stpeace)
3.4 Vmware虚拟机设置静态IP地址(麦兜日常学习笔记)
4.4 配置虚拟机网络,使虚拟机系统之间以及和host主机之间可以通过相互ping通
4.6.7 完成之后,在master上执行下面操作,检查免密码登录是否成功。
4.7 配置hadoop(现在master上配置完,然后发给子节点)
4.7.4 配置文件(所有配置文件都在/usr/hadoop/etc/hadoop目录中)
4.7.7 将hadoop传输到子节点的usr/hadoop目录
1、环境搭建
虚拟机:
VMware Worstation 15 (https://www.baidu.com/link?url=lUpoe9j2Gpnpg6pKsyG2saoSRYNZQuJHCEd8IozSFG8eiaf323AtDxMK1VCsFXVFQmWwOj6GLpVKq9yJLfXKwEKwzqP8kSv0svFCqiTwWPm&wd=&eqid=cbcfe22f00000b54000000025c9ed9a8)
系统:
Ubuntu-16.04.6-server-amd64(http://releases.ubuntu.com/)
节点:
Master:192.168.115.135
Slave1:192.168.115.136
Slave2:192.168.115.137
2、相关软件版本
以下软件都不需要单独下载,直接使用ubuntu内的命令下载
Hadoop:hadoop-2.7.3
Spark:spark-2.0.2-bin-hadoop2.7
Java:java(1.8.0_191)
Scala:scala 2.11.6
3、主要参考文章
3.1 Hadoop2.7.3完全分布式集群搭建和测试(如果一切再重来)
3.2 The authenticity of host 'localhost (127.0.0.1)' can't be established的处理方法( stpeace)
3.3 linux下如何查询jdk的安装路径(stpeace)
3.4 Vmware虚拟机设置静态IP地址(麦兜日常学习笔记)
3.5 在Ubuntu下搭建Spark群集
4、搭建步骤
4.1 安装虚拟机
为了给每个节点配置静态ip地址,安装ubuntu系统前需要先安装Vmware Workstation并配置好网络适配器
进入虚拟网络编辑器
选择NAT模式,勾选“将主机虚拟适配器链接到此网络”,取消“使用本地DHCP服务将IP地址分配给虚拟机”,同时在该页面可以看到子网ip和子网掩码
点击NAT设置,可以看到网关IP,一般不做修改
下面这一步很重要,影响到能否使用主机web访问虚拟机端口
检查宿主机VM8 网卡设置,打开网络和共享中心→ 更改适配器设置→,在VMware Network Adapter VMnet8上单击右键,选择属性按钮打开属性对话框。
安装三个系统(master、slave1、slave2)以master为例,slave安装方法相同
新建虚拟机,选择提前下载好的ubuntu-16.04.6-server-amd64进行安装,命名为master,为了方便,密码都设为123456.
之后选项可以直接点下一步,直至完成,也可以根据硬盘容量更换存储地址。
系统开始正式安装,由于是静态配置ip地址,会进入如下界面:
按回车<Enter>确认
选第三项
输入要设置的ip地址
输入子网掩码(在虚拟网络编辑器可以查看)
输入网关(在虚拟网络编辑器可以查看)
DNS可以设置成8.8.8.8
4.2 修改hostname与hosts文件
以master上机器为例,打开终端
可以先查看一下目前的ip是不是我设置的那样
~$ ifconfig #查看ip信息
执行如下的操作
把hostname修改成master:
~$ sudo vi /etc/hostname #打开hostname
将ubuntu改成master
把hosts修改成如下所示的样子:
~$ sudo vi /etc/hosts #打开hosts文件
同样地,在slave1和slave2机器上做相似的操作,分别更改主机名为slave1和slave2,然后把hosts文件更改和master一样。
4.3 创建hadoop用户与hadoop用户
# 创建hadoop组
~$ sudo addgroup hadoop
# 在hadoop组创建hadoop用户
~$ sudo adduser -ingroup hadoop hadoop
# 给hadoop用户添加权限
~$ sudo vi /etc/sudoers #打开sudoers文件
在root ALL=(ALL:ALL) ALL下添加hadoop ALL=(ALL:ALL) ALL,给hadoop用户赋予root用户同样的权限(这里一般会遇到即使用sudo命令打开依然没有修改权限的情况,用<:wq!>指令强制写入然后关闭)
接下来各台主机都用hadoop账户登录进行操作( su + <主机名> )
4.4 配置虚拟机网络,使虚拟机系统之间以及和host主机之间可以通过相互ping通
如果前面安装系统的时候已经选择了NAT模式,那么这里只需要使用 ping + <主机名>指令进行测试即可。分别在3台机器上都进行测试,出现以下情况则表示能连通。
按< Ctrl + C >终止命令,退出连通状态
4.5 配置Java
Java的安装这个不要单独下载jdk文件配置,而直接使用以下三条命令安装:
~$ sudo apt-get update
~$ sudo apt-get install openjdk-8-jdk
~$ java -version #查看java版本,确认是否安装成功
配置ssh前建议先将之前调试好的三个系统进行备份,后面的步骤容易出错!!!
4.6 配置ssh
以下步骤三个系统都要做
4.6.1 安装ssh
~$ sudo apt-get install openssh-server
已有ssh或者安装成功了的输入命令
~$ ps -e | grep ssh
4.6.2 验证ssh是否成功安装输入
~$ ssh localhost
如果出现以下提示说明安装成功
但是笔者一般会遇到以下提示
The authenticity of host 'localhost ( : :1)' can't be established.
看似输完yes后能够输密码登录,实则会对后期产生影响
解决方案如下:
~$ hadoop@ubuntu:/home/master$ cd ~/.ssh
# 进入 .ssh 文件夹
~$ hadoop@ubuntu:~/.ssh$ sudo chmod 777 /etc/ssh/ssh_config
# 修改ssh_config文件权限
~$ hadoop@ubuntu:~/.ssh$ vi /etc/ssh/ssh_config
# 打开ssh_config文件
在ssh_config文件最后加上以下两行内容:
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
再次输入<ssh localhost>
没有初出现The authenticity of host 'localhost ( : :1)' can't be established. 说明问题已解决。
4.6.3 生成秘钥对
~$ ssh-keygen -t rsa #命令前不要加sudo!!
# 输入之后一直选择enter即可。生成的秘钥位于 ~/.ssh文件夹下。可用cd 命令进入查看。
4.6.4 导入authorized_keys
~$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
这样,<ssh localhost>就可以不输密码登录了
4.6.5 把master上的authorized_keys拷贝到其他主机的相应目录下,实现远程无密码登录
~$ cd ~/.ssh #进 入master的.ssh目录,执行复制操作
~/.ssh$ scp authorized_keys hadoop@slave1:~/.ssh/
~/.ssh$ scp authorized_keys hadoop@slave2:~/.ssh/
4.6.6 修改各台主机上authorized_keys文件的权限
所有机器上,均执行命令:
~$ chmod 600 ~/.ssh/authorized_keys
4.6.7 完成之后,在master上执行下面操作,检查免密码登录是否成功。
~$ ssh slave1
~$ ssh slave2
至此,ssh配置完成,可以保存备份一下。
4.7 配置hadoop(现在master上配置完,然后发给子节点)
4.7.1 直接通过wget命令安在线下载
~$ wget https://archive.apache.org/dist/hadoop/core/hadoop-2.7.3/hadoop-2.7.3.tar.gz
4.7.2 解包移动
# 解压hadoop包到当前目录
~$ tar -zxvf hadoop-2.7.3.tar.gz 解压
# 将安装包移到/usr目录下
~$ sudo mv hadoop-2.7.3 /usr/hadoop
4.7.3 新建文件夹
# 在/usr/hadoop目录下新建如下目录(root)
~$ cd /usr/hadoop #切换到/usr/hadoop作为当前目录
/usr/hadoop$ mkdir dfs
/usr/hadoop$ mkdir dfs/name
/usr/hadoop$ mkdir dfs/data
/usr/hadoop$ mkdir tmp
4.7.4 配置文件(所有配置文件都在/usr/hadoop/etc/hadoop目录中)
由于前面java环境安装使用通过apt-get install openjdk-8-jdk,因此这里的JAVA_HOME环境变量值可以通过以下命令获得:
~$ ls -l /etc/alternatives/java # 获取java路径
4.7.4.1 配置文件:hadoop-env.sh
修改JAVA_HOME值(改为export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64)
4.7.4.2 配置文件:yarn-env.sh
修改JAVA_HOME值(改为export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64)
4.7.4.3 配置文件:slaves
将内容修改为:
slave1
slave2
4.7.4.4 配置文件:core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
</configuration>
4.7.4.5 配置文件:hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:9001</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/hadoop/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/hadoop/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
4.7.4.6 配置文件:yarn-site.xml
<configuration>
<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>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>
</configuration>
4.7.6.7 配置文件:mapred-site.xml
先根据文件 mapred-site.xml.template 创建文件 mapred-site.xml
~$ cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
然后修改 mapred-site.xml 文件
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
</configuration>
4.7.7 将hadoop传输到子节点的usr/hadoop目录
(如果传输时报错说 :权限拒绝,先把文件传送到非/usr目录下,然后在node上把这个文件再移动到/usr/hadoop)
如笔者正是将hadoop先传输到了子节点的/tmp目录下
~$ scp -r /usr/hadoop hadoop@slave1:/tmp
~$ scp -r /usr/hadoop hadoop@slave2:/tmp
# 然后,再分别从slave1和slave2上,将hadoop文件夹分别放到各自的/usr/hadoop中
# 在slave1机器:
~$ sudo mv /tmp/hadoop /usr/hadoop
# 在slave2机器:
~$ sudo mv /tmp/hadoop /usr/hadoop
4.8 配置环境变量
4.8.1 每个子节点都要配置以下一样的环境变量
# 编辑/etc/profile
~$ sudo gedit /etc/profile
在后边添加就可以
#hadoop
export HADOOP_HOME=/usr/hadoop
export PATH=$PATH:$HADOOP_HOME/sbin
export PATH=$PATH:$HADOOP_HOME/bin
执行< source /etc/profile >使更新的配置生效
配置完成的话可以通过< hadoop version >查看hadoop版本
4.8.2 启动hadoop
进入hadoop安装目录
~$ cd /usr/hadoop
格式化之前需要对 /usr/hadoop 目录权限进行修改
# 修改权限
/usr/hadoop$ sudo chmod -R 777 /usr/hadoop
# 格式化
/usr/hadoop$ bin/hdfs namenode -format
# 启动hadoop
/usr/hadoop$ sbin/start-all.sh
4.8.3 查看hadoop是否完全启动
# 输入jps查看状态
~$ jps
正常情况下应显示如下情况
4.9 配置Scala
4.9.1 安装Scala
~$ sudo apt-get install scala
4.9.2 查看Scala版本
~$ scala -version
4.9.3 查看Scala路径
由于前面java环境安装使用通过apt-get install scala,因此scala的路径可以通过以下命令获得:
# 获取scala路径
~$ ls -l /etc/alternatives/scala
4.10 配置spark
4.10.1 下载Spark 2.0.2
~$ wget https://archive.apache.org/dist/spark/spark-2.0.2/spark-2.0.2-bin-hadoop2.7.tgz
文件会下载到当前目录下,不确定的话可以查看一下目录下有没有该文件。
4.10.2 下载完毕后解压文件
~$ tar xvf spark-2.0.2-bin-hadoop2.7.tgz
4.10.3 将解压的文件移动到hadoop用户下
(这里我们可以在hadoop用户下先建一个spark文件夹,也可以不建,直接移到 /usr/hadoop 里,这个路径没有过多要求)
~$ sudo mv spark-2.0.2-bin-hadoop2.7 /usr/hadoop/spark
4.10.4 进入spark-2.0.2-bin-hadoop2.7文件夹下的 conf 文件夹,里面有个spark-env.sh.template 文件,是spark环境变量设置的目标,我们可以复制一个出来
/usr/hadoop/spark/spark-2.0.2-bin-hadoop2.7/conf$ cp spark-env.sh.template spark-env.sh
打开该文件
/usr/hadoop/spark/spark-2.0.2-bin-hadoop2.7/conf$ vi spark-env.sh
在文件末尾添加以下内容
export SCALA_HOME=/usr/share/scala-2.11
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export HADOOP_HOME=/usr/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
SPARK_MASTER_IP=master
SPARK_LOCAL_DIRS=/usr/hadoop/spark/spark-2.0.2-bin-hadoop2.7
SPARK_DRIVER_MEMORY=1G
export LD_LIBRARY_PATH=/usr/hadoop/lib/native/:$LD_LIBRARY_PATH
# 这里的内容是根据我虚拟机的环境来的,如果安装的版本和路径不一样,可以根据实际情况更改。
4.10.5 接下来设置slaves文件
/usr/hadoop/spark/spark-2.0.2-bin-hadoop2.7/conf$ cp slaves.template slaves
/usr/hadoop/spark/spark-2.0.2-bin-hadoop2.7/conf$ vi slaves
slave1
slave2
将内容改为
Spark在一台机器上就算配置完毕,接下来在另外两台机器上也做一模一样的配置即可。
4.10.6 启动Spark
# 启动spark前要先启动hadoop,然后再spark-2.0.2-bin-hadoop2.7文件夹下执行以下命令启动spark
/usr/hadoop/spark/spark-2.0.2-bin-hadoop2.7$ sbin/start-all.sh
运行jps看看Java进程,发现比Hadoop启动的时候多了Master进程。
切换到slave01节点上,运行JPS,看看进程,这里比Hadoop的时候多了一个Worker进程。说明我们的Spark群集已经启动成功。
5、测试
5.1 启动Hadoop群集与Spark群集
5.1.1启动hadoop
~$ /usr/hadoop/sbin/start-all.sh
5.1.2启动spark
~$ /usr/hadoop/spark/spark-2.0.2-bin-hadoop2.7$ sbin/start-all.sh
5.1.3检查能否通过浏览器访问webapp
hdfs管理界面 192.168.230.150:50070
yarn管理界面 192.168.230.150:8088
spark管理界面 192.168.230.150:8080
5.2 hadoop测试——wordcount
~$ cd /usr/hadoop
# 进入本地hadoop目录(/usr/hadoop)
/usr/hadoop$ bin/hdfs dfs -mkdir -p /data/input
# 在虚拟分布式文件系统上创建一个测试目录/data/input
/usr/hadoop$ bin/hdfs dfs -put README.txt /data/input
# 将当前目录下的README.txt 文件复制到虚拟分布式文件系统中
/usr/hadoop$ bin/hdfs dfs-ls /data/input
# 查看文件系统中是否存在我们所复制的文件
# 运行如下命令向hadoop提交单词统计任务
/usr/hadoop$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount /data/input /data/output/result
# 查看result,结果在result下面的part-r-00000中
/usr/hadoop$ bin/hdfs dfs -cat /data/output/result/part-r-00000