说明:
在搭建时,笔者只用了2台服务器进行搭建集群,后期想扩展集群,请想搭建完成这套,你就理解了,搭建原生态的Apache Hadoop,真的是很多坑,在这笔者已经帮踩了
环境:
Hadoop下载url:
http://archive.apache.org/dist/hadoop/core/
下载过慢,可以私聊我,我有百度盘的tar包
用到的包:
hadoop-2.7.7.tar.gz
jdk-8u281-linux-x64.tar.gz #要用oracle的JPK
ip、节点名、环境:
192.168.0.97 192-168-0-97 Ubuntu 16.04.7 LTS
192.168.0.192 192-168-0-192 Ubuntu 16.04.7 LTS
1、新建用户组(所有节点)
新建大数据组hadoop,将ubuntu加入
sudo groupadd hadoop
sudo usermod -a -G hadoop ubuntu
2、添加/etc/hosts(所有节点)
192.168.0.97 192-168-0-97
192.168.0.192 192-168-0-192
3、新建公秘钥、分发(所有节点)
ssh-keygen -t rsa
ssh-copy-id 节点名称
4、安装jdk(所有节点)
将jdk-8u281-linux-x64.tar.gz上传
cd /opt
sudo tar -zvxf jdk-8u281-linux-x64.tar.gz
sudo mkdir /data/hadoop
sudo mv jdk1.8.0_281 /data/hadoop/jdk-8
ls /data/hadoop/jdk-8/
#解压后重命名移动到/data下
修改环境变量
vim /etc/profile
末尾追加:
#JAVA_jdk
export JAVA_HOME=/data/hadoop/jdk-8
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
保存且验证
source /etc/profile
java -version
echo $JAVA_HOME
5、安装hadoop(所有节点)
上传hadoop-2.7.7.tar.gz
tar -zvxf hadoop-2.7.7.tar.gz
sudo mv hadoop-2.7.7 /data/hadoop/hadoop
sudo mkdir /data/hadoop/hadoop/hdfs
sudo mkdir /data/hadoop/hadoop/hdfs/tmp
sudo mkdir /data/hadoop/hadoop/hdfs/name
sudo mkdir /data/hadoop/hadoop/hdfs/data
配置文件里的注释格式
<!-- 描述 -->
①配置core-site.xml(所有节点)
这个是hadoop的核心配置文件,这里需要配置的就这两个属性,fs.default.name配置了hadoop的HDFS系统的命名
cd /data/hadoop/hadoop/etc/hadoop/
sudo vim core-site.xml
然后在中加入以下代码:
在<configuration></configuration>中如下配置是读写sequence file 的 buffer size,可减少 I/O 次数。在大型的 Hadoop cluster,建议可设定为 65536 到 131072,默认值 4096。第一个属性中的value和我们之前创建的/data/hadoop/hadoop/hdfs/tmp路径要一致
fs.defaultFS //为masterIP地址,其实也可以使用主机名或者域名,这个属性用来指定namenode的hdfs协议的文件系统通信地址,可以指定一个主机+端口,也可以指定为一个namenode服务(这个服务内部可以有多台namenode实现ha的namenode服务)
io.file.buffer.size //该属性值单位为KB,131072KB即为默认的64M,这个属性用来执行文件IO缓冲区的大小
hadoop.tmp.dir //指定hadoop临时目录,前面用file:表示是本地目录。有的教程上直接使用/usr/local,我估计不加file:应该也可以。hadoop在运行过程中肯定会有临时文件或缓冲之类的,必然需要一个临时目录来存放,这里就是指定这个的。当然这个目录前面我们已经创建好了。
<configuration>
<!-- 配置Hadoop运行产生的临时数据存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>file:/data/hadoop/hadoop/hdfs/tmp</value>
<description>A base for other temporary directories.</description>
</property>
<!-- 配置操作HDFS的缓存大小 -->
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<!-- 指定文件系统的名称-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://192-168-0-97:9000</value>
</property>
</configuration>
属性说明:
参数 | 属性值 | 解释 |
---|---|---|
fs.defaultFS | NameNode URI | hdfs://host:port/ |
io.file.buffer.size | 131072 | SequenceFiles文件中.读写缓存size设定 |
②配置 hadoop-env.sh文件,用于配置jdk目录(所有节点)
该文件是hadoop运行基本环境的配置,需要修改的为java虚拟机的位置。
然后将export JAVA_HOME=${JAVA_HOME}注释掉配置成具体的路径
sudo vim hadoop-env.sh
# The java implementation to use.
#export JAVA_HOME=${JAVA_HOME}
export JAVA_HOME=/data/hadoop/jdk-8
③配置mapred-env.sh,加入JAVA_HOME(所有节点)
sudo vim mapred-env.sh
# export JAVA_HOME=/home/y/libexec/jdk1.6.0/
export JAVA_HOME=/data/hadoop/jdk-8 #加上
export HADOOP_JOB_HISTORYSERVER_HEAPSIZE=1000
export HADOOP_MAPRED_ROOT_LOGGER=INFO,RFA
④在yarn-env.sh加入JAVA_HOME(所有节点)
该文件是yarn框架运行环境的配置,同样需要修改java虚拟机的位置。
sudo vim yarn-env.sh
# resolve links - $0 may be a softlink
export YARN_CONF_DIR="${YARN_CONF_DIR:-$HADOOP_YARN_HOME/conf}"
export JAVA_HOME=/data/hadoop/jdk-8 #加上
⑤配置hdfs-site.xml(所有节点)
这个是hdfs的配置文件,dfs.http.address配置了hdfs的http的访问位置;
dfs.replication配置了文件块的副本数,一般不大于从机的个数。
1)主节点
sudo vim hdfs-site.xml
然后在中加入以下代码:
<!-- 配置HDFS块的副本数(全分布模式默认副本数是3,最大副本数是512) -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!-- 配置HDFS元数据的存储目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/data/hadoop/hadoop/hdfs/name</value>
<final>true</final>
</property>
<!-- 配置HDFS真正的数据内容(数据块)的存储目录 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/data/hadoop/hadoop/hdfs/data</value>
<final>true</final>
</property>
<!-- 配置NameNode的RPC地址 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>192-168-0-97:9002</value>
</property>
<!-- 开启通过Web操作HDFS -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<!-- 关闭HDFS文件的权限检查 -->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
其中第二个dfs.namenode.name.dir和dfs.datanode.data.dir的value和之前创建的/hdfs/name和/hdfs/data路径一致;由于有1个从主机slave1,所以dfs.replication设置为1
2)从节点
sudo vim hdfs-site.xml
然后在中加入以下代码
<!-- 配置HDFS块的副本数(全分布模式默认副本数是3,最大副本数是512) -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
属性说明:
- 配置NameNode
参数 | 属性值 | 解释 |
---|---|---|
dfs.namenode.name.dir | 在本地文件系统所在的NameNode的存储空间和持续化处理日志 | 如果这是一个以逗号分隔的目录列表,然 后将名称表被复制的所有目录,以备不时 需。 |
dfs.namenode.hosts/ dfs.namenode.hosts.exclude | Datanodes permitted/excluded列表 | 如有必要,可以使用这些文件来控制允许 数据节点的列表 |
dfs.blocksize | 268435456 | 大型的文件系统HDFS块大小为256MB |
dfs.namenode.handler.count | 100 | 设置更多的namenode线程,处理从 datanode发出的大量RPC请求 |
- 配置DataNode
参数 | 属性值 | 解释 |
---|---|---|
dfs.datanode.data.dir | 逗号分隔的一个DataNode上,它应该保存它的块的本地文件系统的路径列表 | 如果这是一个以逗号分隔的目录列表,那么数据将被存储在所有命名的目录,通常在不同的设备。 |
⑥配置 mapred-site.xml(所有节点)
这个是mapreduce任务的配置,由于hadoop2.x使用了yarn框架,所以要实现分布式部署,必须在mapreduce.framework.name属性下配置为yarn
sudo cp mapred-site.xml.template mapred-site.xml
sudo vim mapred-site.xml
然后在中加入以下代码:
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>192-168-0-97:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>192-168-0-97:19888</value>
</property>
属性说明:
参数 | 属性值 | 解释 |
---|---|---|
mapreduce.framework.name | yarn | 执行框架设置为 Hadoop YARN. |
mapreduce.map.memory.mb | 1536 | 对maps更大的资源限制的. |
mapreduce.map.java.opts | -Xmx2014M | maps中对jvm child设置更大的堆大小 |
mapreduce.reduce.memory.mb | 3072 | 设置 reduces对于较大的资源限制 |
mapreduce.reduce.java.opts | -Xmx2560M | reduces对 jvm child设置更大的堆大小 |
mapreduce.task.io.sort.mb | 512 | 更高的内存限制,而对数据进行排序的效率 |
mapreduce.task.io.sort.factor | 100 | 在文件排序中更多的流合并为一次 |
mapreduce.reduce.shuffle.parallelcopies | 50 | 通过reduces从很多的map中读取较多的平行 副本 |
⑦配置yarn-site.xml(所有节点)
该文件为yarn框架的配置,主要是一些任务的启动位置
sudo vim yarn-site.xml
然后在标签中添加以下代码:
<property>
<name>yarn.resourcemanager.address</name>
<value>192-168-0-97:18040</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>192-168-0-97:18030</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>192-168-0-97:18088</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>192-168-0-97:18025</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>192-168-0-97:18141</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
属性说明:
- master节点配置ResourceManager 和 NodeManager:
参数 | 属性值 | 解释 |
---|---|---|
yarn.resourcemanager.address | 客户端对ResourceManager主机通过 host:port 提交作业 | host:port |
yarn.resourcemanager.scheduler.address | ApplicationMasters 通过ResourceManager主机访问host:port跟踪调度程序获资源 | host:port |
yarn.resourcemanager.resource-tracker.address | NodeManagers通过ResourceManager主机访问host:port | host:port |
yarn.resourcemanager.admin.address | 管理命令通过ResourceManager主机访问host:port | host:port |
yarn.resourcemanager.webapp.address | ResourceManager web页面host:port. | host:port |
yarn.resourcemanager.scheduler.class | ResourceManager 调度类(Scheduler class) | CapacityScheduler(推荐),FairScheduler(也推荐),orFifoScheduler |
yarn.scheduler.minimum-allocation-mb | 每个容器内存最低限额分配到的资源管理器要求 | 以MB为单位 |
yarn.scheduler.maximum-allocation-mb | 资源管理器分配给每个容器的内存最大限制 | 以MB为单位 |
yarn.resourcemanager.nodes.include-path/ yarn.resourcemanager.nodes.exclude-path | NodeManagers的permitted/excluded列表 | 如有必要,可使用这些文件来控制允许NodeManagers列表 |
- slave节点配置NodeManager
参数 | 属性值 | 解释 |
---|---|---|
yarn.nodemanager.resource.memory-mb | givenNodeManager即资源的可用物理内存,以MB为单位 | 定义在节点管理器总的可用资源,以提供给运行容器 |
yarn.nodemanager.vmem-pmem-ratio | 最大比率为一些任务的虚拟内存使用量可能会超过物理内存率 | 每个任务的虚拟内存的使用可以通过这个比例超过了物理内存的限制。虚拟内存的使用上的节点管理器任务的总量可以通过这个比率超过其物理内存的使用 |
yarn.nodemanager.local-dirs | 数据写入本地文件系统路径的列表用逗号分隔 | 多条存储路径可以提高磁盘的读写速度 |
yarn.nodemanager.log-dirs | 本地文件系统日志路径的列表逗号分隔 | 多条存储路径可以提高磁盘的读写速度 |
yarn.nodemanager.log.retain-seconds | 10800 | 如果日志聚合被禁用。默认的时间(以秒为单位)保留在节点管理器只适用日志文件 |
yarn.nodemanager.remote-app-log-dir | logs | HDFS目录下的应用程序日志移动应用上完成。需要设置相应的权限。仅适用日志聚合功能 |
yarn.nodemanager.remote-app-log-dir-suffix | logs | 后缀追加到远程日志目录。日志将被汇总到yarn.nodemanager.remoteapplogdir/yarn.nodemanager.remoteapplogdir/{user}/${thisParam} 仅适用日志聚合功能。 |
yarn.nodemanager.aux-services | mapreduce-shuffle | Shuffle service 需要加以设置的Map Reduce的应用程序服务 |
⑧配置slaves(所有节点)
sudo vim slaves
把原本的localhost删掉,然后改为(以节点数量添加):192-168-0-192
192-168-0-192
⑨配置环境变量(所有节点)
将所有DataNode的机器名字写入此文件中,每个主机名一行
sudo vim /etc/profile
在末尾添加入下
#Hadoop
export HADOOP_HOME=/data/hadoop/hadoop
export PATH="$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH"
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
sudo source /etc/profile
⑩对目录加上权限(所有节点)
先对目录加上权限,不然会报错(所有集群)
sudo chmod -R 777 /data/hadoop/hadoop
6、启动集群(主节点)
①在master上做格式化
hdfs namenode -format #如无报错,就正常启动
②在master启动集群
start-all.sh
This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh
Starting namenodes on [192-168-0-97]
192-168-0-97: starting namenode, logging to /data/hadoop/hadoop/logs/hadoop-ubuntu-namenode-192-168-0-97.out
192-168-0-192: starting datanode, logging to /data/hadoop/hadoop/logs/hadoop-ubuntu-datanode-192-168-0-192.out
Starting secondary namenodes [192-168-0-97]
192-168-0-97: starting secondarynamenode, logging to /data/hadoop/hadoop/logs/hadoop-ubuntu-secondarynamenode-192-168-0-97.out
starting yarn daemons
starting resourcemanager, logging to /data/hadoop/hadoop/logs/yarn-ubuntu-resourcemanager-192-168-0-97.out
192-168-0-192: starting nodemanager, logging to /data/hadoop/hadoop/logs/yarn-ubuntu-nodemanager-192-168-0-192.out
③查看集群状态
master:
jps #查看,如以下进程未启动,请按下方排错
15444 Jps
15174 ResourceManager
14999 SecondaryNameNode
14744 NameNode
slave:
jps #查看,如以下进程未启动,请按下方排错
7667 Jps
7543 NodeManager
7389 DataNode
注:
1.HDFS:分布式文件系统,隐藏集群细节,可以看做一块儿超大硬盘
主:namenode,secondarynamenode
从:datanode
2.Yarn:分布式资源管理系统,用于同一管理集群中的资源(内存等)
主:ResourceManager
从:NodeManager
④报错排查
hadoop的日志文件存储在 /data/hadoop/hadoop/logs/ 下,
hadoop-ubuntu-namenode-192-168-0-97.log
hadoop-ubuntu-namenode-192-168-0-97.out
hadoop-ubuntu-secondarynamenode-192-168-0-97.log
hadoop-ubuntu-secondarynamenode-192-168-0-97.out
yarn-ubuntu-resourcemanager-192-168-0-97.log
yarn-ubuntu-resourcemanager-192-168-0-97.out
SecurityAuth-ubuntu.audit
7、用自带的样例测试hadoop集群能不能正常跑任务
①求圆周率测试:
pi是类名,第一个10表示Map次数,第二个10表示随机生成点的次数
hadoop jar /data/hadoop/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar pi 10 10
输出:
Job Finished in 16.913 seconds
Estimated value of Pi is 3.20000000000000000000
②统计单词个数测试
hadoop自带的wordcount例子,这个是统计单词个数的,首先要在hdfs系统中创建文件夹,要查看hdfs系统可以通过hadoop fs -ls来查看hdfs系统的文件以及目录情况
1)hdfs中创建文件夹
hadoop fs -mkdir word_count_input #在hdfs中创建一个word_count_input文件夹
hadoop fs -ls #查看
Found 1 items
drwxr-xr-x - ubuntu supergroup 0 2021-03-18 16:13 word_count_input
2)创建file1.txt和file2.txt文件
sudo vim file1.txt #由此可以看到:hello 5,hadoop 4,sunxj 2 win 1
hello hadoop
hello sunxj
hello hadoop
hello hadoop
hello win
sunxj hadoop
sudo vim file2.txt #由此可以看到:hello 2,linux 2,window 2
linux window
hello linux
hello window
cat *.txt #由此可以计算出world的个数分别为:hello有7个,hadoop有4,sunxj有2个,win有1个inux,有2个,window有2个
hello hadoop
hello sunxj
hello hadoop
hello hadoop
hello win
sunxj hadoop
linux window
hello linux
hello window
3)将file1.txt和file2.txt文件上传到hdfs系统的word_count_input文件夹中
格式: hadoop fs -put 文件名 hdfs文件夹名
hadoop fs -put file*.txt word_count_input
查看
# hadoop fs -ls word_count_input
Found 2 items
-rw-r--r-- 1 ubuntu supergroup 74 2021-03-18 16:24 word_count_input/file1.txt
-rw-r--r-- 1 ubuntu supergroup 38 2021-03-18 16:24 word_count_input/file2.txt
4)用以下命令运行wordcount
其中wordcount是类名,word_count_input是输入文件夹目录,word_count_output是输出目录
hadoop jar /data/hadoop/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount word_count_input word_count_output
输出尾部:
File Input Format Counters
Bytes Read=112
File Output Format Counters
Bytes Written=48
5)查看
查看文件夹下文件
hadoop fs -ls word_count_output
输出:
Found 2 items
-rw-r--r-- 1 ubuntu supergroup 0 2021-03-18 16:28 word_count_output/_SUCCESS
-rw-r--r-- 1 ubuntu supergroup 48 2021-03-18 16:28 word_count_output/part-r-00000
6)打印单词总数
与我们统计的相同:hello有7个,hadoop有4,sunxj有2个,win有1个inux,有2个,window有2个
hadoop fs -cat word_count_output/part-r-00000
输出:
hadoop 4
hello 7
linux 2
sunxj 2
win 1
window 2
8、通过web查看集群运行情况,首先查看
1、在华为云的web安全组设置 hadoop端口名称 与 端口号
core-site.xml: 9000
hdfs-site.xml: 9002
mapred-site.xml: 10020
mapred-site.xml: 19888
yarn-site.xml: 18040
yarn-site.xml: 18030
yarn-site.xml: 18088
yarn-site.xml: 18025
yarn-site.xml: 18141
2、YARN的web页面则是在master机器上,然后端口是用yarn-site.xml配置文件中的yarn.resourcemanager.webapp.address指定的,我们配置的是18088,那么在浏览器中输入:http://192.168.0.97:18088
3、HDFS界面在master上打开,如果没有更改端口,则默认的端口是50070:http://192.168.0.97:50070
4、查看HDFS分布式文件系统状态:
/data/hadoop/hadoop/bin/hdfs dfsadmin -report
5、查看文件块组成: 一个文件由哪些块组成
/data/hadoop/hadoop/bin/hdfs fsck / -files -blocks
附加:
# hadoop中文文档:http://hadoop.apache.org/docs/r1.0.4/cn/
# hadoop5个进程的作用:http://www.aboutyun.com/thread-7088-1-1.html\
# hadoop3.2.0搭建:https://zhuanlan.zhihu.com/p/59805371
# apache hadoop3.2.2下载:http://archive.apache.org/dist/hadoop/core/hadoop-3.2.2/
下篇会用到Hive、HBase、Hue,有需求查看博主主页,谢谢