首先送上整个配置流程的思惟导图html
我这边有 1 个 master 主机,2 个 slave 主机,java
3 台主机的 hosts 配置文件以下node
[root@master .ssh]$ cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.199.201 master
192.168.199.202 slave1
192.168.199.203 slave2
复制代码
master 的 hostname 是python
$ cat /etc/hostname
master
复制代码
slave1 的 hostname 是linux
$ cat /etc/slave1
master
复制代码
slave2 的 hostname 是shell
$ cat /etc/slave2
master
复制代码
$ sudo yum install openssh-server
复制代码
1) 首先在 master 上生成 ssh 公钥apache
$ ssh-keygen -t rsa
复制代码
而后连续按 3 个回车便可。再到生成 ssh 密钥的目录下查看是否成功centos
[root@master hadoop]$ cd ~/.ssh
[root@master .ssh]$ ls
authorized_keys id_rsa id_rsa.pub known_hosts
复制代码
注意:若没有生成 authorized_keys
文件,须要本身手动建立,安全
**2)**而后将 id_rsa.pub
中的内容复制到 authorized_keys
文件中。bash
$ cat id_rsa.pub >> authorized_keys
复制代码
**3)**最后将 authorized_keys 分发给另外两个节点
$ scp authorized_keys slave1:~/.ssh/
$ scp authorized_keys slave2:~/.ssh/
复制代码
**4)**测试 ssh 无密登录是否成功
[root@master .ssh]$ ssh master
Last login: Sat Mar 23 17:11:13 2019 from master
[root@master ~]$ exit
logout
Connection to master closed.
[root@master .ssh]$ ssh slave1
Last login: Sat Mar 23 17:04:46 2019 from master
[root@slave1 ~]$ exit
logout
Connection to slave1 closed.
[root@master .ssh]$ ssh slave2
Last login: Sat Mar 23 15:31:54 2019 from master
[root@slave2 ~]$ exit
logout
Connection to slave2 closed.
复制代码
$ rpm -qa | grep java
python-javapackages-3.4.1-11.el7.noarch
tzdata-java-2018e-3.el7.noarch
javapackages-tools-3.4.1-11.el7.noarch
java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64
java-1.8.0-openjdk-headless-1.8.0.102-4.b14.el7.x86_64
复制代码
名称里有 openjdk
的要删除
$ rpm -e --nodeps java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64
$ rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.102-4.b14.el7.x86_64
复制代码
这里安装的是 jdk1.8
**1)**建立 jdk 环境的路径
$ mkdir /usr/local/java
复制代码
**2)**将下载好的压缩包解压到指定路径
[root@master Downloads]# tar -zxvf jdk-8u201-linux-x64.tar.gz -C /usr/local/java/
复制代码
**3)**配置 java 的环境变量
# vi /etc/profile
export JAVA_HOME=/usr/local/java/jdk1.8.0_201
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
复制代码
**4)**使配置生效
$ source /etc/profile
复制代码
**5)**测试是否配置成功
$ java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
复制代码
$ su firewall-cmd --state 查看防火墙状态
$ su systemctl stop firewalld.service 关闭防火墙
$ su systemctl disable firewalld.service 禁止开机时防火墙自启
复制代码
到 这里 下载 Hadoop 3.1.2 版本
$ mkdir /usr/local/hadoop
复制代码
$ tar -zxvf hadoop-3.1.2.tar.gz -C /usr/local/hadoop/
复制代码
配置文件的路径在 /usr/local/hadoop/hadoop-3.1.2/etc/hadoop
$ vi /usr/local/hadoop/hadoop-3.1.2/etc/hadoop/hadoop-env.sh
加入这一行
export JAVA_HOME=/usr/local/java/jdk1.8.0_201
复制代码
<configuration>
<!-- 指定 namenode 的通讯地址 默认 8020 端口 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://master/</value>
</property>
<!-- 指定 hadoop 运行时产生文件的存储路径 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/hadoop-3.1.2/tmp</value>
</property>
</configuration>
复制代码
<configuration>
<!-- namenode 上存储 hdfs 名字空间元数据-->
<property>
<name>dfs.namenode.name.dir</name>
<value>/usr/local/hadoop/hadoop-3.1.2/namenode</value>
</property>
<!-- datanode 上数据块的物理存储位置-->
<property>
<name>dfs.datanode.data.dir</name>
<value>/usr/local/hadoop/hadoop-3.1.2/datanode</value>
</property>
<!-- 设置 hdfs 副本数量 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
复制代码
<configuration>
<!-- 指定yarn运行-->
<property>
<name>mapreduce.framework.name</name
<value>yarn</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop/hadoop-3.1.2</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop/hadoop-3.1.2</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop/hadoop-3.1.2</value>
</property>
</configuration>
复制代码
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- 指定ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<!-- reducer取数据的方式是mapreduce_shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
复制代码
$ vi workers
添加以下内容
slave1
slave2
复制代码
这两个文件在 /usr/local/hadoop/hadoop-3.1.2/sbin/
中,分别在 start-dfs.sh 和 stop-dfs.sh 中添加以下内容
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
复制代码
这两个文件在 /usr/local/hadoop/hadoop-3.1.2/sbin/
中,分别在 start-yarn.sh 和 stop-yarn.sh 中添加以下内容
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
复制代码
在 /etc/profile
中添加以下内容
$ vi /etc/profile
export HADOOP_HOME=/usr/local/hadoop/hadoop-3.1.2
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
复制代码
添加成功后
$ source /etc/profile
复制代码
上面的操做要在每个节点上都同步,可是一个一个的去编辑太麻烦了,能够用 scp 命令,在 master 节点编辑好以后,直接发送给 slave 节点
$ scp /usr/local/hadoop/hadoop-3.1.2/etc/hadoop/ slave1 /usr/local/hadoop/hadoop-3.1.2/etc/hadoop/
$ scp /usr/local/hadoop/hadoop-3.1.2/etc/hadoop/ slave2 /usr/local/hadoop/hadoop-3.1.2/etc/hadoop/
复制代码
$ cd /usr/local/hadoop/hadoop-3.1.2/bin
$ hdfs namenode -format
2019-03-23 19:47:19,332 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = master/192.168.199.201
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 3.1.2
...此处省略不少日志信息
2019-03-23 19:47:21,670 INFO common.Storage: Storage directory /usr/local/hadoop/hadoop-3.1.2/namenode has been successfully formatted.
2019-03-23 19:47:21,692 INFO namenode.FSImageFormatProtobuf: Saving image file /usr/local/hadoop/hadoop-3.1.2/namenode/current/fsimage.ckpt_0000000000000000000 using no compression
2019-03-23 19:47:21,899 INFO namenode.FSImageFormatProtobuf: Image file /usr/local/hadoop/hadoop-3.1.2/namenode/current/fsimage.ckpt_0000000000000000000 of size 391 bytes saved in 0 seconds .
2019-03-23 19:47:21,933 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
2019-03-23 19:47:21,962 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at master/192.168.199.201
复制代码
出现如下信息则说明 namenode 格式化成功
INFO common.Storage: Storage directory /usr/local/hadoop/hadoop-3.1.2/namenode has been successfully formatted.
复制代码
$ start-all.sh
Starting namenodes on [master]
Last login: Sat Mar 23 19:42:41 CST 2019 on pts/1
Starting datanodes
Last login: Sat Mar 23 19:54:46 CST 2019 on pts/1
Starting secondary namenodes [master]
Last login: Sat Mar 23 19:54:49 CST 2019 on pts/1
Starting resourcemanager
Last login: Sat Mar 23 19:54:56 CST 2019 on pts/1
Starting nodemanagers
Last login: Sat Mar 23 19:55:11 CST 2019 on pts/1
复制代码
查看 master
节点
$ jps
39578 ResourceManager
39324 SecondaryNameNode
39933 Jps
39039 NameNode
复制代码
查看 slave1
节点
$ jps
16000 Jps
15907 NodeManager
15780 DataNode
复制代码
查看 slave2
节点
$ jps
15040 DataNode
15298 Jps
15167 NodeManager
复制代码
当 3 台节点分别出现这些 java 进程,则 hadoop 启动成功
Wordcount 是 MapReduce 的示例程序,能够统计某个文件中,各个单词出现的次数。
input
$ hadoop fs -mkdir /input
复制代码
input
目录是否建立成功$ hadoop fs -ls -R /
drwxr-xr-x - root supergroup 0 2019-03-23 20:06 /input
复制代码
test.txt
并上传到 hdfs 中首先介绍一些 hdfs 经常使用的命令语句
列出 hdfs 下的文件
$ hadoop dfs -ls
列出 hdfs / 路径下的全部文件,文件夹
$ hadoop dfs -ls -R /
建立目录 /input
$ hadoop dfs -mkdir /input
列出 hsfs 名为 input 的文件夹中的文件
$ hadoop dfs -ls input
将 test.txt 上传到 hdfs 中
$ hadoop fs -put /home/binguner/Desktop/test.txt /input
将 hsdf 中的 test.txt 文件保存到本地桌面文件夹
$ hadoop dfs -get /input/test.txt /home/binguenr/Desktop
删除 hdfs 上的 test.txt 文件
$ hadoop dfs -rmr /input/test.txt
查看 hdfs 下 input 文件夹中的内容
$ hadoop fs -cat input/*
进入安全模式
$ hadoop dfsadmin –safemode enter
退出安全模式
$ hadoop dfsadmin -safemode leave
报告 hdfs 的基本统计状况
$ hadoop dfsadmin -report
复制代码
在 Desktop 下建立 test.txt
$ vi /home/binguner/Desktop/test.txt
hello world
hello hadoop
复制代码
将 test.txt
上传到 hdfs 中
# hadoop fs -put /home/binguner/Desktop/test.txt /input
复制代码
$ hadoop jar /usr/local/hadoop/hadoop-3.1.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.2.jar wordcount /input /output
复制代码
日志信息出现
INFO mapreduce.Job: Job job_1553342123652_0001 completed successfully
复制代码
则运行成功
而后查看 hdfs 中新生成的文件
$ hadoop fs -ls -R /
drwxr-xr-x - root supergroup 0 2019-03-23 20:11 /input
-rw-r--r-- 1 root supergroup 25 2019-03-23 20:11 /input/test.txt
drwxr-xr-x - root supergroup 0 2019-03-23 20:13 /output
-rw-r--r-- 1 root supergroup 0 2019-03-23 20:13 /output/_SUCCESS
-rw-r--r-- 1 root supergroup 25 2019-03-23 20:13 /output/part-r-00000
drwx------ - root supergroup 0 2019-03-23 20:12 /tmp
drwx------ - root supergroup 0 2019-03-23 20:12 /tmp/hadoop-yarn
drwx------ - root supergroup 0 2019-03-23 20:12 /tmp/hadoop-yarn/staging
drwxr-xr-x - root supergroup 0 2019-03-23 20:12 /tmp/hadoop-yarn/staging/history
drwxrwxrwt - root supergroup 0 2019-03-23 20:12 /tmp/hadoop-yarn/staging/history/done_intermediate
drwxrwx--- - root supergroup 0 2019-03-23 20:13 /tmp/hadoop-yarn/staging/history/done_intermediate/root
-rwxrwx--- 1 root supergroup 22276 2019-03-23 20:13 /tmp/hadoop-yarn/staging/history/done_intermediate/root/job_1553342123652_0001-1553343159309-root-word+count-1553343194205-1-1-SUCCEEDED-default-1553343173503.jhist
-rwxrwx--- 1 root supergroup 439 2019-03-23 20:13 /tmp/hadoop-yarn/staging/history/done_intermediate/root/job_1553342123652_0001.summary
-rwxrwx--- 1 root supergroup 213381 2019-03-23 20:13 /tmp/hadoop-yarn/staging/history/done_intermediate/root/job_1553342123652_0001_conf.xml
drwx------ - root supergroup 0 2019-03-23 20:12 /tmp/hadoop-yarn/staging/root
drwx------ - root supergroup 0 2019-03-23 20:13 /tmp/hadoop-yarn/staging/root/.staging
复制代码
/output/part-r-00000
里就是本次运行的结果
$ hadoop fs -cat /output/part-r-00000
hadoop 1
hello 2
world 1
复制代码
(1)运行 wordcount 时,出现错误 Error: Could not find or load main class.org.apache.hadoop.mapred.YarnChild.
检查 mapred-site.xml
文件配置
(2)启动 hadoop 时:Starting resourcemanager ERROR: Attempting to launch yarn resourcemanager as root ERROR: but there is no YARN_RESOURCEMANAGER_USER defined. Aborting launch. Starting nodemanagers ERROR: Attempting to launch yarn nodemanager as root ERROR: but there is no YARN_NODEMANAGER_USER defined. Aborting launch.
编辑 start-yarn.sh 和 stop-yarn.sh,添加文章中提到的参数。
(3)启动 hadoop 时:Starting namenodes on [localhost] ERROR: Attempting to launch hdfs namenode as root ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting launch.
编辑 start-dfs.sh 和 stop-dfs.sh,添加文章中提到的参数。
(4)启动 start-dfs.sh 后,节点中的 datanode 闪退
重复格式化致使出错,确认各个 xml 文件配置无误后, 删除 dfs.namenode.name.dir,dfs.datanode.data.dir,hadoop.tmp.dir 对应的文件夹后从新 format。
若是出现了其余奇奇怪怪的错误,去 logs 文件夹下查看出错的缘由。
欢迎关注本文做者:
扫码关注并回复「干货」,获取我整理的千G Android、iOS、JavaWeb、大数据、人工智能等学习资源。