本文搭建hadoop的伪分布式的参考网址是http://dblab.xmu.edu.cn/blog/install-hadoop-in-centos/,不过搭建过程中仍然碰到些错误,这里记录一下详细过程及错误的解决方式。
环境准备
jdk版本:1.8.0_171
hadoop版本:2.7.6
安装环境选择版本的时候,注意查下hadoop与jdk的版本兼容情况
步骤一: 创建用户
以root用户登录系统,创建hadoop用户,并以bash作为shell
useradd -m hadoop -s /bin/bash
修改hadoop密码为hadoop
passwd hadoop
为hadoop用户增加管理员权限
visudo
找到 root ALL=(ALL) ALL 这行,在下面添加hadoop ALL=(ALL) ALL,如下图
保存退出,然后运行su hadoop命令切换到hadoop用户
步骤二 配置ssh免密登录
检查是否安装了 SSH client、SSH server
rpm -qa | grep ssh
如果没有安装,则要进行安装
sudo yum install openssh-clients
sudo yum install openssh-server
安装完成后,运行如下命令配置ssh免密登录
ssh-keygen -t rsa #会有提示,都按回车就可以
cat id_rsa.pub >> authorized_keys #加入授权
chmod 600 ./authorized_keys #修改文件权限
ssh localhost -p 22199 #测试是否可以免密登录 ssh localhost 默认连接22端口,如果不是22 端口,则需要指定 -p参数
步骤三:安装java环境
java可以直接下载centos版本的包文件,解压然后配置环境变量即可,这里不再向详细记录。安装配置完成后,输入java -version来检查是否安装成功
步骤四 :配置host文件
vi /etc/hosts
#这里我保留的配置为,其中master配置的是腾讯云的内网, 如果配置外网会导致eclipse客户端连不上hadoop
::1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
172.16.0.3 master
127.0.0.1 localhost
修改主机名为master
vi /etc/sysconfig/network
#修改HOSTNAME为master
HOSTNAME=master
修改保存后,重启电脑,shutdown -r now
步骤五:安装hadoop
下载hadoop2.7.6版本解压值/usr/local目录下
sudo tar -zxxf -C /usr/local
cd /usr/local/
sudo mv ./hadoop-2.6.0/ ./hadoop
sudo chown -R hadoop:hadoop ./hadoop
cd /usr/local/hadoop
./bin/hadoop version
配置环境变量:
vi ~/.bashrc
#加入如下内容
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_INSTALL=$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_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
export HADOOP_CLASSPATH=${JAVA_HOME}/lib/tools.jar
保存退出后,source ~/.bashrc使配置环境变量生效。之后输入hadoop version验证是否配置成功
配置hadoop-env.sh ,路径为/usr/local/hadoop/etc/hadoop/hadoop-env.sh
#修改JAVA_HOME为具体jdk路径,否则会报找不到java命令
export JAVA_HOME=/usr/java/jdk1.8.0_171-amd64
修改配置文件/usr/local/hadoop/etc/hadoop/core-site.xml
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
</configuration>
其中fs.defaultFS用的是主机名称,在hosts中对应的是腾讯云的内网地址
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.namenode.rpc-bind-host</name>
<value>0.0.0.0</value>
</property>
</configuration>
注意dfs.permissions选项设置的值为false,可以使eclipse连上hadoop并且上传文件。如果上传文件还报错,修改hdfs文件目录权限hadoop fs -chmod 755 /
dfs.namenode.rpc-bind-host配置监听全网段,否则eclipse客户端仍然无法上传文件
修改配置文件 mapred-site.xml,保存退出
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
hadoop启动
到这里hadoop的伪分布式就配置完成了,接下来进行格式化
./bin/hdfs namenode -format
成功的话,会看到 “successfully formatted” 和 “Exitting with status 0” 的提示,若为 “Exitting with status 1” 则是出错。
如果进行多次格式化,会造成namenode和datanodeVERSION不一致,需要修改为一直才行,否则会启动不成功,修改的方法参考网站https://blog.csdn.net/baidu_19473529/article/details/52813656
还有一种方法是将namenode和datanode文件夹的内容全部删除,即dfs.namenode.name.dir和dfs.datanode.data.dir配置的目录,这样相当于是一个全新的hadoop
格式化完成后,运行./sbin/start-dfs.shq启动namenode,datanode,secondnamenode,然后运行./sbin/start-yarn.sh启动resource manager ,node manager
运行jps命令查看启动的程序
[hadoop@master sbin]$ jps
#运行程序如下
481 NodeManager
32486 DataNode
376 ResourceManager
32680 SecondaryNameNode
32381 NameNode
863 Jps
注意点
这样,搭建hadoop的伪分布式就结束了,腾讯云和阿里云主要是内网通讯,所以配置host的时候要特别注意配置为内网ip,否则eclipse客户端就会报
Exception in thread "main" org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /a/tokens.txt could only be replicated to 0 nodes instead of minReplication (=1). There are 1 datanode(s) running and 1 node(s) are excluded in this operation.