Linux下Hadoop3.0.0-alpha4 伪分布式配置
刚刚开始学习Hadoop,从官网下载了最新的版本,尝试安装Hadoop3.0,按照网上找到的教程(大多是Hadoop2.x版本的)进行配置,过程中发生了一些错误,将安装过程和错误记录如下:
- 安装java并配置环境
- 安装Hadoop3.0.0
- 安装ssh
- 配置伪分布式环境
一、 安装java并配置环境
从官网下载Jdk1.8,地址为:
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
按照操作系统选择对应的安装包,如果使用RedHat/CentOS系统可以选择rpm包下载,安装时使用rpm -ivh jdk-8u144-linux-x64.rpm
命令安装即可,注意最后一个参数是实际下载到的rpm包的文件名,安装完成后,环境变量已经自动设置完毕,不需要手动设置。
我使用的是deepin系统,由于官方不提供deb包,只好下载了tar.gz包,下载到的文件名:jdk-8u144-linux-x64.tar.gz,使用tar -xzvf jdk-8u144-linux-x64.tar.gz
命令解压,将解压后得到的目录复制到了/usr/local/目录下sudo cp -r jdk1.8.0_144/ /usr/local/
,此时java的环境变量还没有配置。
进入/etc/profile.d/目录,使用vim java_path.sh
新建文件并写入下面的内容:
# 路径要根据jdk实际的存放位置写
export JAVA_HOME=/usr/local/jdk1.8.0_144
export PATH=$PATH:$JAVA_HOME/bin
#千万不要忘记最开始的那个'.'!!!,第一个点代表当前路径
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
之后执行source /etc/profile
可以使刚刚新建的java_path.sh文件生效,此时执行java -version
应该可以打印出jdk的版本信息,大概三、四行的样子。
至此jdk的环境配置完毕。
二、 安装Hadoop3.0.0
下载地址:
http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-3.0.0-alpha4/hadoop-3.0.0-alpha4.tar.gz
下载到的文件是tar.gz包,使用tar命令解压,同样将解压得到的目录复制到/usr/local目录:
tar -xzvf hadoop-3.0.0-alpha4.tar.gz
sudo cp -r hadoop-3.0.0-alpha4/ /usr/local/
为了方便,我在local中修改了目录的名字:
截图中有tomcat和eclipse,请忽略,这两个不必须。
最好为hadoop新建用户,并将hadoop目录的所有者修改为hadoop,刚刚复制到/usr/local的目录的所有者应该是root:
sudo useradd -mUs /bin/bash hadoop
sudo passwd hadoop
chown -R hadoop:hadoop hadoop3.0.0/
此时进入到/usr/local/hadoop3.0.0/目录下执行./bin/hadoop version
如果输出了hadoop的版本信息,说明hadoop已经安装完成,hadoop默认以非分布式模式运行。
到此为止,非分布模式的hadoop已经配置完成,如果不需要伪分布模式运行,可以不执行下面的步骤。
三、 安装并配置ssh
要使用分布式的hadoop必须安装ssh服务,伪分布式同样需要安装ssh,否则启动hdfs时会报错,后面再说。
我使用的系统使用apt-get作为包管理器,安装ssh只需要执行sudo apt-get install openssh-server
命令即可,安装完成后执行ps -e | grep ssh
检查ssh服务是否已经启动,如果列出的结果中只有ssh-agent说明ssh服务还没有运行,执行sudo service ssh start
命令启动ssh服务,之后再次检查ssh服务是否已经启动,此时应该能够看到sshd字样,说明已经成功启动。
切换到刚刚新建的hadoop用户,尝试登录ssh:
su hadoop
#输入hadoop用户的密码
ssh localhost
第一次登录时可能会有如下提示,输入yes按回车即可。成功登录后运行w命令可以看到登录的用户,执行exit退出ssh:
为hadoop用户设置免密码登录,这一步也是必须的,否则也会在启动hadoop时报错:
cd ~/.ssh
#如果没有这个目录,再执行一遍ssh localhost
ssh-keygen -t rsa
#一路回车下去
cat id_rsa.pub >> ./authorized_keys
此时再登录ssh就不需要输入密码了:
四、 配置伪分布式环境
配置伪分布式环境主要是要修改hadoop的配置文件,进入hadoop目录下的etc/hadoop/目录(注意是hadoop安装目录下的etc目录,不是根目录下的)要修改的配置文件主要有两个,默认情况下这两个文件的只有<configuration>
根节点,修改后的配置文件如下:
配置文件内容参考的是:http://www.powerxing.com/install-hadoop/
core-site.xml
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop3.0.0/tmp</value>
<description>Abase for other temporary directipons.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop3.0.0/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop3.0.0/tmp/dfs/data</value>
</property>
</configuration>
配置完成后将Namenode格式化,在此之前最好确定hdfs-site.xml文件中dfs.namenode.name.dir、dfs.datanode.data.dir节点中配置的路径存在(我没有试过如果不存在会不会报错)。
/usr/local/hadoop3.0.0/bin/hdfs namenode -format
执行该命令时有确认提示,这里要输入’Y’,注意是大写的,输入小写的这里也能通过,但是据说在查看NameNode的http服务的端口时会有打不开的现象http://www.codeweblog.com/%E6%97%A0%E6%B3%95%E8%BF%9E%E6%8E%A5http-localhost-50070%E9%97%AE%E9%A2%98%E5%A4%84%E7%90%86/
格式化完成后会有成功的提示,不在最后一行,需要找一下:
进入hadoop的安装目录,执行./sbin/start-dfs.sh
,开启 NameNode 和 DataNode 守护进程,启动完成后可以使用jps
命令查看进程,正常情况下应该列出图中的四个:
错误处理
1、 权限拒绝Permission denied
执行./sbin/start-dfs.sh
时报错,出现Permission denied (publickey,password).
检查当前登录用户的权限(经过前面的操作,权限一般是满足要求的),可能是用户权限不够引起的。
更有可能的原因是没有使用ssh登录,这也是为什么分布式hadoop必须要安装ssh的原因!!!
按照上面ssh配置的方法进行配置,当执行ssh localhost
能够实现免密码登录的时候,再启动守护进程即可成功,
2、 没有找到JAVA_HOME
启动守护进程时报错:Error: JAVA_HOME is not set and could not be found. 提示JAVA_HOME没有找到,此时使用echo $JAVA_HOME
检查是否真的没有配置JAVA_HOME环境变量,如果没有输出任何结果,应按照Java配置一节中的方法配置环境变量。
参考http://wlb.wlb.blog.163.com/blog/static/467413201501451724327/
如果已经配置了JAVA_HOME,依然报这个错误就需要修改etc/hadoop/hadoop-env.sh
文件,在文件最后添加:
export JAVA_HOME=/usr/local/jdk1.8.0_144
3、 Datanode没有启动
某些情况下可能发现没有Datanode,这可能是因为Datanode和Namenode的clusterID不一致导致的,发生这种情况时Datanode启动会失败,失败原因会输出到日志中,但是终端中没有任何提示。将Datanode的clusterID手动修改为Namenode的即可:
重新启动守护进程,问题应该已经解决了。
4、 NameNode的http服务端口
在hadoop2.x版本中,NameNode 和 DataNode 守护进程启动后,在浏览器中输入localhost:50070可以打开监控页面,查看 NameNode 和 Datanode 信息。在hadoop3.0版本中,访问该地址会显示localhost拒绝了连接请求,这时需要执行start-all.sh启动两个manager进程。
另外,3.0版本与2.x版本的端口不一致:https://issues.apache.org/jira/browse/HDFS-9427
localhost:50070在3.0版本中对应的地址是http://localhost:9870
部分变更的端口对照表:
组件 | 节点 | 2.x 默认端口 | 3.0 默认端口 | 配置 | 用途说明 |
---|---|---|---|---|---|
HDFS | NameNode | 50470 | 9871 | dfs.namenode.https-address | https服务的端口 |
HDFS | NameNode | 50070 | 9870 | dfs.namenode.https-address | http服务的端口 |
HDFS | NameNode | 8020 | 9820 | fs.defaultFS | 接收Client连接的RPC端口,用于获取文件系统metadata信息。 |
HDFS | DataNode | 50020 | 9867 | dfs.datanode.ipc.address | ipc服务的端口 |
HDFS | DataNode | 50010 | 9866 | dfs.datanode.address | datanode服务端口,用于数据传输 |
HDFS | DataNode | 50475 | 9865 | dfs.datanode.https.address | https服务的端口 |
HDFS | DataNode | 50075 | 9864 | dfs.datanode.http.address | http服务的端口 |
注:2.x端口用途参考http://blog.csdn.net/qq_20120669/article/details/53332482