Ubuntu安装hadoop手记
大二那年买了本关于大数据系统搭建的指导书,刚刚开始尝试没多久就开学了,于是hadoop搭建到一半就停了。
过了几个学期,刚刚好遇上大数据技术的选修课,老师让我们帮忙在windows上安装hadoop,遇到的坑贼多,我和几个同学在实验室折腾了很久也还是有connection refuce的报错。才想起了之前在虚拟机上创建的废弃hadoop集群,于是又捡起了这几台机子,并慢慢摸索回之前的进度直到安装完成。
- 过程总览
ubuntu上完整分布式的安装过程比单机安装过程要稍微复杂一点,首先要准备三台机器(一台master,两台slave,这里使用VMware虚拟机),配置要在三台机子上都执行一遍。
在准备好机器之后,分为前期准备和正式安装两个步骤,最后是运行和检测阶段:
前期准备:
1.需要在各台机器上创建hadoop组和用户,并且给组和用户授予和原来用户一样的权限(用户运行sudo与修改/usr/或/etc/等路径下的文件)
2.需要在各台机器上配置相同版本的jdk(为了方便,此处把jdk的安装路径都配置到相同的路径)
3.在各台机器上修改配置文件,使机器被命名为master与slave01/02等语义化的名字,并能像localhost一样被访问到
4.配置ssh登陆的密匙支持登陆,并让master能够免密码访问两个slave节点
正式安装:
1.先在master下载hadoop
2.master下配置hadoop/etc/hadoop下的配置文件
3.将在master配置好的hadoop文件夹复制到slave中
运行和检测:
1.格式化
2.jps
前期准备
- 创建hadoop用户和用户组
1.命令$ sudo addgroup hadoop
可以用于创建hadoop用户组(由于这一步在之前已经添加好了,输入命令后会提示the group hadoop already exist
,可以通过cat /etc/group
查看所有的用户,运行后可以在列表中看到hadoop:x:1001:
的字样表示hadoop已经存在)
2.命令$ sudo adduser ingroup hadoop hadoop
用于创建hadoop用户组下的hadoop用户(同样由于我在之前的操作中已经完成了这一步,我得到的提示是The user hadoop already exists.
如果想查看组hadoop下的用户的话可以用命令cat /etc/passwd
来查询,此命令下会返回一堆的组和用户,这里,组hadoop下面的是hadoop:x:1001:1001::/home/hadoop:
,根据网上的说法,这里每行用冒号隔开,然后1001 是组id,后面可以看到hadoop用户在home文件夹下面 )
3.给hadoop用户添加权限此处通过修改/etc/sudoers文件来修改hadoop用户的权限:$ sudo gedit /etc/sudoers
可以用于打开文件/etc/sudoers,打开了文件之后,直接在root ALL=(ALL:ALL) ALL
下面添加一行hadoop ALL=(ALL:ALL) ALL
就可以让用户hadoop拥有和root一样的权限了)
在运行sudo输入密码后,如果遇到授权不成功的情况可以参考以下解决方案:此时若遇到hadoop is not in the sudoers file. This incident will be reported.
则是hadoop用户权限不够的问题,可以先进入su用户,再修改sudoers文件:先通过gedit /etc/sudoers
去sudoers中hadoop的权限。如果还是遇到su: Authentication failure
报错的话就将用户切换会原来的非hadoop用户,在那里修改sudoers文件(即在里面root下面加hadoop ALL=(ALL:ALL) ALL
)之后再切换回hadoop用户 - 安装配置java
首先来说一下怎么测试java是否安装成功吧,如果打开命令行输入java -version
能够看到jdk的版本,那么电脑上已经安装好了java,可以跳过这一步。
如果还没有安装好java,那么根据下面的步骤,就可以逐步安装了:
1.首先是下载jdk,jdk很容易可以从官网下载,只要对应到电脑版本就好了( * 通过命令echo $JAVA_HOME
可以找到jdk的摆放路径* )
2.在usr下面创建一个放置jdk的目录,此处用sudo mkdir /usr/lib/java
在usr的lib下创建java文件夹(
sudo rm -rf
+路径,可用于删除文件夹)
3.将解压后的jdk文件夹移到新创建的java文件夹下面:先进入Downloads目录,然后用$ sudo mv jdk-8u161-linux-x64-demos.tar.gz /usr/lib/java
移动压缩文件到新创建的java文件夹下。
4.进入创建的java文件夹,一般用命令tar -zxvf
+压缩包名可以解压文件,但是此处已经把压缩包放到了usr文件夹下,需要添加sudo才有权限解压(这里将jdk 用mv命令改名为jdk(当不存在jdk文件夹的时候才能达到改名效果) )
5.接下来就是配置环境变量:其中一种环境变量的配法是将jdk的位置记录在/etc/profile文件下面,所以我们用sudo gedit /etc/profile
打开并修改profile文件(将环境变量记录在profile有一个不好的地方:可能会遇到每次新开一个命令行都要重新source /etc/profile
激活|解决方法是在~/.bashrc里面加一句source /etc/profile,然后记得source ~/.bashrc
),在文件中添加
export JAVA_HOME=/usr/lib/java/jdk
其中JAVA_HOME后面的是jdk放置的位置,后面的JRE_HOME是jdk文件夹下面的jre文件夹路径,剩下两个基本上复制粘贴的就好了。
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
6.最后就是用source /etc/profile
让profile中的配置生效,java -version
查看是否安装成功(此时echo $JAVA_HOME
可以看到jdk安装的位置)
三台机子的java版本要一样,若有一台机子java版本不一样可以参考一下解决方法:
1.首先需要去除原本的JAVA_HOME: 百度到,这一变量暂时知道有三个可能的地方(1. ~/.bashrc 2./etc/profile 3. /etc/environment),通过echo $JAVA_HOME
可以看到之前记录的JAVA_HOME的记录。所以第一步,我们需要进入这三个文件排查之前的JAVA_HOME到底写在了哪一个里面(另外,如果之前是用yum装的,那么应该就在~/.bashrc里面)。找到所在文件上之后,我们把之前写的JAVA_HOME变量注释掉或者删除掉。推出之后记得要用source
+文件名的命令激活修改后的内容
2.删除了之前配置的环境变量和jdk的文件夹之后,便可以按照以上步骤重新安装jdk - 机器名和地址(一台master,两台slave)
1.储存机器名的文件也在/etc/中,利用$ sudo gedit /etc/hostname
就可以修改名字了(其中一台改名为master另外两台改成slave0和slave1),重启生效
2.在机器中记录其他两台机子的ip地址(关于ip地址,一般都是记录在/etc/hosts文件中,平时之所以在浏览器上输入“localhost”可以转到127.0.0.1也是因为被记录在了这个文件里面,所以得将另外两台机子的ip加在这个文件里面),此前先到其他两台机器里面利用$ ifconfig
查看本机的ip地址inet addr:后面的就是IP地址。
记录下master,slave0,slave1的ip地址,输入$ sudo gedit /etc/hosts
进入hosts文件,添加三台机器的ip地址,如下
网上下载的示意图(namenode对应的是master,datanode1/2分别对应slave01/02) - *安装ssh服务
在安装ssh之前要先安装openssh$ sudo apt-get install openssh-server
(由于是在之前装过的此处还没有验证过)
ssh密匙的创建有两种算法,一种是dsa一种是rsa,它们之间的区别可以到百度搜一下,具体的也没有考究过,此处采用dsa:
1.创建dsa密匙:$ ssh-keygen -t dsa -P ""
(创建rsa的命令为$ ssh-keygen -t rsa -P ""
),回车运行后会在 ~/.ssh/文件夹下同时生成id_dsa和id_dsa.pub文件也就是说cd进入 ~/.ssh/文件夹就可以看到这两个文件
2.利用dsa密匙创建授权文件authorized_keys:$ cp ~/.ssh/id_dsa.pub ~/.ssh/authorized_keys
将 id_dsa.pub复制给authorized_keys得到授权文件
(1)此处插入单机ssh测试,看看ssh能不能登陆本机,代码为:$ ssh localhost
,输入$ exit
即可退出。
此时已经可以通过ssh登陆其他机子了,方法如下:进入~/.ssh/,利用命令ssh master
slave01/02已经在/etc/hosts中记录过,输入密码后即可登陆(exit退出)
3.让master节点能够免密码登陆两台slave:此处需要让两台slave都有master的密匙,此处先进入~/.ssh,然后用scp master:~/.ssh/id_dsa.pub ./master_dsa.pub
将master中的id_dsa.pub密匙复制到slave01/02中的~/.ssh/文件夹下。通过cat master_dsa.pub >> authorized_keys
将复制过来的master_dsa.pub写到authorized_keys中。
回到master,打开命令行就可以免密码用ssh slave01
登陆slave01了(exit退出)
正式安装
- 下载hadoop
之前已经下载好了hadooop-2.7.1.tar.gz(虚拟机好像不支持从一台机器把文件复制去另一台虚拟机,我采取的办法是:先将压缩包copy到本机,再从本机复制去另一台虚拟机。) - 移动及解压
用命令$ sudo cp hadoop-2.7.1.tar.gz /usr/local/
把压缩包移到/usr/local/下面,进入/usr/local/
用$ sudo tar -zxvf hadoop-2.7.1.tar.gz
解压hadoop压缩包
用命令$ sudo mv hadoop-2.7.1 hadoop
将文件夹的名字改成hadoop*不改也行,只不过这样看起来比较简介*
用$ sudo chown -R hadoop:hadoop hadoop
将该hadoop文件夹的属主用户设为hadoop 修改配置文件
此版本的hadoop配置文件在hadoop/etc/hadoop文件夹下,进入:gedit hadoop-env.sh
打开并修改文件内的内容:
找到export JAVA_HOME=${JAVA_HOME}
将${JAVA_HOME}
改成本机jdk路径(通过echo $JAVA_HOME
即可看到)$ gedit core-site.xml
打开文件并作修改:
在configuration标签中间添加
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>$ gedit mapred-site.xml.template
打开文件:
在configuration标签中添加
<property>
<name>mapred.job.tracker</name>
<value>hdfs://master:9001</value>
</property>$ gedit hdfs-site.xml
打开文件:
在/usr/local/hadoop/下创建hdfs文件夹,在hdfs下面创建两个文件夹data和name
在configuration标签中添加
<property>
<name>dfs.namenode.name.dir</name>
<value>/usr/local/hadoop/hdfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/usr/local/hadoop/hdfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:9001</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>$ gedit slaves
打开文件:
添加两行slave01与slave02,slave01与slave02的地址已经在/etc/hosts中记录
将配置好的hadoop文件复制到slave机器上
在scp的过程中遇到了报错,暂时没有解决,所以暂时采取压缩后先拉到本机再复制去虚拟机的解决方案(移动到相同的位置$ sudo mv hadoop /usr/local
)
$ sudo chown -R hadoop:hadoop hadoop
修改权限
开启工作
格式化namenode
在master节点上打开命令行,进入/usr/local/hadoop/ 输入命令$ bin/hadoop namenode -format
在2.7版本提示说Use of this script to execute hdfs command is deprecated.
所以如果是2.7版本的话就进入bin目录 用
Instead use the hdfs command for it.hdfs namenode -format
来格式化namenode启动hadoop
在master节点上进入hadoop的sbin运行$ start-all.sh
-检验
master命令行输入jps,返回
10160 NameNode
10296 DataNode
10907 Jps
10510 SecondaryNameNode
slave输入jps,返回
5651 NodeManager
5558 DataNode
5863 Jps
或者在http://master:50070/上看看有没有Hadoop页面
同样2.7版本也是提示This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh
所以这里也改成在sbin下用
./start-dfs.sh
启动hadoop关闭hadoop
关闭的话在2.7版本也用stop-dfs.sh
参考网址https://jingyan.baidu.com/article/e75057f2a62c8aebc91a89b3.html
参考网址http://blog.csdn.net/zstu_zlj/article/details/51027053
参考网址http://blog.csdn.net/antgan/article/details/52067441