1、添加普通用户
useradd 用户名 # 指定用户名
passwd 用户名 # 给刚添加的用户设置登录密码
赋予普通用户 kelly 的 sudo 权限(需 root 权限)
# 更改关键目录之前做好备份的
cp /etc/sudoers ./back-file/etc-sudoers-20180529
vi /etc/sudoers
# 找到并复制 root ALL=(ALL) ALL 行,并将最前面的 root 用户改为刚添加的普通用户
用户名 ALL=(ALL) ALL
2、更改主机名及DNS
sudo vi /etc/sysconfig/network
HOSTNAME=CentOS-Apache.hadoop-01
sudo vi /etc/hosts
192.168.1.123 CentOS-Apache.hadoop-01 hadoop-01
使用 ping 主机名 测试更改是否正确
ping hadoop-01
PING linux-hadoop.apache-01 (192.168.1.123) 56(84) bytes of data.
64 bytes from linux-hadoop.apache-01 (192.168.198.131): icmp_seq=1 ttl=64 time=0.081 ms
之后 重新启动 即可完成改名
3、配置免密 SSH 登录
因为Hadoop主节点是通过SSH方式连接从节点并与之通信的,这里的配置是为了避免后续SSH连接时每次都手动输入密码,加快集群连接创建速度。
ssh-keygen -t rsa
之后会生成公钥和私钥文件,如下
ls -la ./.ssh/
-rw------- 1 kelly kelly 1675 May 30 06:00 id_rsa
-rw-r--r-- 1 kelly kelly 400 May 30 06:00 id_rsa.pub
ssh-copy-id -i ./.ssh/id_rsa.pub "-p 52013 hadoop-01"
# 把公钥文件拷贝到需要SSH免密登录的主机上
# 因为我已更改默认的SSH 登录端口 22 为 52013,所以此处需要使用 -p 参数指定端口
The authenticity of host '[hadoop-01]:52013 ([192.168.1.123]:52013)' can't be established.
RSA key fingerprint is f8:23:cf:68:b1:98:d5:10:2b:f7:d1:a4:cb:31:21:29.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[hadoop-01]:52013' (RSA) to the list of known hosts.
kelly@hadoop-01's password:
Now try logging into the machine, with "ssh '-p 52013 hadoop-01'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
至此,SSH免密码登录已设置成功,验证一下,(登录命令确认之后直接进入,不需要输密码方为正确)
ssh hadoop-01 -p 52013
Last login: Wed May 30 06:06:19 2018 from 192.168.1.123
[kelly@CentOS-6-x86 ~]$
最后,如果是通过手动添加公钥到 authorized_keys 文件(未使用ssh-copy-id命令),希望 ssh 公钥在目的主机上生效,则相关文件和文件夹需满足下面两个条件:
- ssh 目录的权限必须是 700 或者为 rwx------
- ssh/authorized_keys 文件权限必须是 600 或者为 -rw-------
即,保证只有创建者拥有读写或执行权限,其他用户或组对这个目录和文件都没有任何权限。
具体如下所示(正常自动生成可用的文件):
ls -ld ~/.ssh
drwx------ 2 kelly kelly 4096 May 30 06:11 /home/kelly/.ssh
ls -l ~/.ssh/
-rw------- 1 kelly kelly 400 May 30 06:11 authorized_keys
4、安装 Java 1.7 及其配置
创建安装目录,复制安装包并解压文件
mkdir /usr/java # 创建暗装路径
cd /usr/java/ # 进入安装路径
mv /root/my-file/jdk-7u65-linux-i586.tar.gz ./ # 把准备的Java安装文件拷贝到当前目录下
tar -zxvf jdk-7u65-linux-i586.tar.gz # 解压
这里通过创建软链接的方式,更改固定的Java安装路径,便于后续代码复用和更新维护,如果不想使用该方式,也可以直接对解压后的 jdk 文件夹重命名为 Java。
# 创建软链接,便于后续升级,否则还要更改 bash 文件内的路径,关联相关命令
ln -s /usr/java/jdk1.7.0_65 /usr/java/latest
# 创建软连接,此软连接目录即为后续配置环境的Java安装主目录
ln -s /usr/java/latest /usr/java/default
将 Java相关命令添加到PATH环境变量中,便于随时使用Java命令
# 修改前,备份重要文件
cp /etc/profile /root/back-file/etc-profile-20180529
vim /etc/profile
export USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL # 此行原文件已有
# ====== My edit words for java running=========== 注释都是瞎编的,英语不好
JAVA_HOME=/usr/java/default
JRE_HOME=/usr/java/default/jre
CLASSPATH=.:/usr/java/default/lib/dt.jar:/usr/java/default/lib/tools.jar:/usr/java/default/jre/lib
export JAVA_HOME JRE_HOME CLASSPATH
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
# =============End of edit =======================
export PATH # 这里源文件已有
使上述设置生效,并进行验证
source /etc/profile
使用 java 或 javac 或 echo $PATH 或 java -version 查看 java 是否安装成功
java -version
java version "1.7.0_65"
Java(TM) SE Runtime Environment (build 1.7.0_65-b17)
Java HotSpot(TM) Server VM (build 24.65-b04, mixed mode)
5、安装Hadoop
安装过程和安装Java类似
mkdir ./local/
mkdir ./local/hadoop # 创建 Hadoop 主目录
mv ./hadoop-2.6.5.tar.gz ./local/hadoop/ # 移动安装包到指定目录下
cd ./local/hadoop/
tar -zxvf hadoop-2.6.5.tar.gz
ln -s ~/local/hadoop/hadoop-2.6.5 ~/local/hadoop/latest # 创建软连接
ln -s ~/local/hadoop/latest ~/local/hadoop/default # 创建软连接
将 Hadoop 相关命令添加到PATH环境变量中,便于随时使用
cp ./.bashrc ./back-file/.bachrc-20180529 # 备份
vim ./.bashrc
############ User specific aliases and functions ############
export HADOOP_PREFIX=$HOME/local/hadoop/default
export HADOOP_COMMON_HOME=$HADOOP_PREFIX
export HADOOP_HDFS_HOME=$HADOOP_PREFIX
export HADOOP_MAPRED_HOME=$HADOOP_PREFIX
export HADOOP_YARN_HOME=$HADOOP_PREFIX
export HADOOP_CONF_DIR=$HADOOP_PREFIX/etc/hadoop
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_PREFIX/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_PREFIX/lib:$HADOOP_PREFIX/lib/native"
export PATH=$PATH:$HADOOP_PREFIX/bin:$HADOOP_PREFIX/sbin
source ./.bashrc
其中,变量 HADOOP_COMMON_LIB_NATIVE_DIR 和 HADOOP_OPTS 主要解决 ssh: Could not resolve hostname XXXX: Name or service not known 的问题,还有部分网页也表示可以解决 “ Unable to load native-hadoop library for your platform... using builtin-java classes where applicable ”的问题,但是截至此文编辑之前,我的这个问题也没有解决(2015)
6、配置 hadoop
切换路径
cd $HADOOP_PREFIX/etc/hadoop/
# 等价于执行
# cd /home/kelly/local/hadoop/default/etc/hadoop/
# 如果之前配置没有问题,这里就会显示出来
1)hadoop-env.sh
cp ./hadoop-env.sh ~/back-file/hadoop-env.sh-20180529 # 备份
vim ./hadoop-env.sh
# The java implementation to use.
export JAVA_HOME=/usr/java/default
# Appoint the port for SSH 如果更改过 SSH 的默认端口,则在此处指定
export HADOOP_SSH_OPTS="-p 52013"
export HADOOP_COMMON_LIB_NATIVE_DIR="$HADOOP_PREFIX/lib/native"
export HADOOP_OPTS="$HADOOP_OPTS -Djava.library.path=$HADOOP_PREFIX/lib:$HADOOP_PREFIX/lib/native"
注:如果此前更改过 SSH 的默认登录端口,则在需要通过 HADOOP_SSH_OPTS 参数指定
以下所有内容都需要添加到相应文件的 <configuration> </coonfiguration> 这两个标签之间 ,其中,<property></<property>标签代表一个属性,多个代表多个属性,其内部,name 为属性名,value 为属性值,description 为对该属性的描述(可选添加)。
2)core-site.xml
cp ./core-site.xml ~/back-file/core-site.xml-20180529
mkdir -p /home/kelly/local/var/hadoop-data/temp/ # 创建Hadoop临时存储目录
vim ./core-site.xml
<!-- 指定HADOOP所使用的文件系统schema(URI),HDFS的老大(NameNode)的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://CentOS-Apache.hadoop-01:9000/</value>
</property>
<!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/kelly/local/var/hadoop-data/temp/hadoop-${user.name}</value>
<description>Abase for other temporary directories.</description>
</property>
3)hdfs-site.xml
cp ./hdfs-site.xml ~/back-file/hdfs-site.xml-20180529
vim ./hdfs-site.xml
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///home/kelly/local/var/hadoop-data/hdfs/datanode</value>
</property>
<property>
<name>hdfs.namenode.name.dir</name>
<value>file:///home/kelly/local/var/hadoop-data/hdfs/namenode</value>
</property>
<property>
<name>hdfs.namenode.checkpoint.dir</name>
<value>file:///home/kelly/local/var/hadoop-data/hdfs/namesecondary</value>
</property>
<!-- 指定HDFS副本的数量 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!-- 指定 Secondary Namenode 的 IP, 在 SSH 登录时使用 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>CentOS-Apache.hadoop-01:50090</value>
</property>
4)yarn-site.xml
cp ./yarn-site.xml ~/back-file/yarn-site.xml-20180530
vim ./yarn-site.xml
<!-- 指定YARN的老大(ResourceManager)的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>CentOS-Apache.hadoop-01</value>
</property>
<!-- reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
5)mapred-site.xml
cp ./mapred-site.xml ~/back-file/mapred-site.xml-20180530
vim ./mapred-site.xml
<!-- 指定 Mapreduce 运行在 Yarn 资源调度集群上运行,否则会在本地运行 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 用来存放与每个job相关的数据 -->
<property>
<name>mapreduce.jobtracker.staging.root.dir</name>
<value>/home/kelly/local/var/hadoop-data/mapred/staging</value>
</property>
6)Datanode节点指定
vim ./slaves # 指定哪些机器上面要启动 DataNode
# 删除 localhost
# 添加本地主机名
CentOS-Apache.hadoop-01
7、格式化HDFS
hdfs namenode -format
18/05/31 00:43:00 INFO common.Storage: Storage directory /home/kelly/local/var/hadoop-data/temp/hadoop-kelly/dfs/name has been successfully formatted.
18/05/31 00:43:00 INFO util.ExitUtil: Exiting with status 0
18/05/31 00:43:00 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at CentOS-Apache.hadoop-01/192.168.1.123
************************************************************/
注意,如果出现 "has been successfully formatted",并且返回值是零,则表明格式化成功
8、启动Hdoop
start-dfs.sh # 只启动 HDFS
# 或者使用如下命令,启动全部集群
start-all.sh
验证进程启动情况
jps
7831 DataNode
8393 NodeManager
7702 NameNode
8170 ResourceManager
8599 Jps
8004 SecondaryNameNode
9、安装过程中出现的问题及其解决方法
1)ssh: connect to host XXX port 22: Connection refused
已更改 SSH 默认端口的,必须要在 hadoop-env.sh 中使用以下语句指定端口号
export HADOOP_SSH_OPTS="-p 更改的端口号" # 此句需要自己添加,没有默认项
2)ssh: Could not resolve hostname XXX: Name or service not known
vi ~/.bashrc
添加前面特意提过的两个变量 HADOOP_COMMON_LIB_NATIVE_DIR 和 HADOOP_OPTS
3)无法启动 Datanode
原因在于之前多次执行 hdfs namenode -format,并且在格式化期间输入了 Y 确认再次格式化
解决办法是把 Hadoop 临时目录下的所有文件都删除,也即恢复到 Hadoop还未真正运行之前的状态。
rm -rf ./local/var/hadoop-data/hdfs/datanode/*
rm -rf ./local/var/hadoop-data/temp/*
4)无法启动 Secondarynamenode 或 Starting secondary namenodes [0.0.0.0]
0.0.0.0: ssh: connect to host 0.0.0.0 port XXX: Connection refused
这也是之前优化 SSH 远程登陆时,更改了默认的端口号 SSH 默认的监听地址,只要在配置hdfs-site.xml文件时添加如下内容指定更改后可被监听的地址即可:
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>IP地址或已经在DNS解析文件中指定的主机名:50090</value> # 端口号不要更改,这是默认的
</property>
10、Hadoop运行示例-计算圆周率
# 切换到Hadoop自带实例程序目录下
cd /home/kelly/local/hadoop/default/share/hadoop/mapreduce/
# 使用实例程序执行圆周率计算
# 第一个参数是运行map任务次数
# 第二个参数是每个map任务执行次数
# 所以,这里总运行次数是 25 次。
hadoop jar hadoop-mapreduce-examples-2.6.5.jar pi 5 5
部分执行结果如下:
Job Finished in 16.705 seconds
Estimated value of Pi is 3.68000000000000000000