date: 2020-12-25title: Hadoop HDFS单节点及伪分布集群部署 #标题
tags: HDFS #标签
categories: Hadoop # 分类
记录下Hadoop HDFS单节点及伪分布集群部署过程。
参考:
修改系统限制
$ mv /etc/security/limits.conf{,.bak}
cat > /etc/security/limits.conf << EOF
* - nofile 655350
* - memlock unlimited
* - stack 655360
* - nproc unlimited
EOF
cat > /etc/sysctl.conf << EOF
kernel.sysrq = 0
kernel.core_uses_pid = 1
fs.file-max=655360
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
kernel.pid_max = 655360
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_max_tw_buckets = 10000
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_ecn = 0
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_max_orphans = 655360
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_mem = 65536 131072 262144
net.ipv4.udp_mem = 65536 131072 262144
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 16384 16777216
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.route.gc_timeout = 100
# 禁止icmp重定向报文
net.ipv4.conf.all.accept_redirects = 0
# 禁止icmp源路由
net.ipv4.conf.all.accept_source_route = 0
net.core.somaxconn = 65535
net.core.rmem_default = 8388608
net.core.wmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
vm.swappiness = 10
vm.overcommit_memory = 1
vm.max_map_count = 262144
EOF
sysctl -p
配置jdk
自行去oracle官网下载java包 jdk-8u261-linux-x64.tar.gz ,然后上传至服务器。
$ mkdir /apps/usr -p && systemctl stop firewalld && systemctl disable firewalld && setenforce 0
$ tar zxf jdk-8u261-linux-x64.tar.gz -C /apps/usr/
$ ln -sf /apps/usr/jdk1.8.0_261 /apps/usr/jdk
$ cat >> /etc/profile << EOF
export JAVA_HOME=/apps/usr/jdk
export CLASSPATH=\$JAVA_HOME/lib
export PATH=\$JAVA_HOME/bin:\$PATH
EOF
$ source /etc/profile
$ java -version # 查看版本信息
java version "1.8.0_261"
Java(TM) SE Runtime Environment (build 1.8.0_261-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.261-b12, mixed mode)
部署Hadoop
# 配置主机名解析
$ hostnamectl set-hostname hadoop01
$ cat >> /etc/hosts << EOF
192.168.20.10 hadoop01
EOF
$ wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.7.7/hadoop-2.7.7.tar.gz
$ tar zxf hadoop-2.7.7.tar.gz -C /apps/usr/
$ cat >> /etc/profile << EOF
export HADOOP_HOME=/apps/usr/hadoop-2.7.7
export PATH=\${HADOOP_HOME}/bin:\${HADOOP_HOME}/sbin:\${PATH}
EOF
$ source /etc/profile
独立运行hadoop
默认情况下,Hadoop被配置为以非分布式模式作为单个Java进程运行。这对于调试很有用。
grep案例
下面的示例复制解压缩的etc目录以用作输入,然后查找并显示给定正则表达式的每个匹配项。输出被写入给定的输出目录。
$ cd /apps/usr/hadoop-2.7.7/
$ mkdir input
$ cp etc/hadoop/*.xml input/
$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar grep input/ output 'dfs[a-z.]+'
# 切记,output目录不可事先创建
$ cat output/* # 查看输出内容
1 dfsadmin
wordcount 统计案例
wordcount用于统计input中单词的数量。
# 准备检索数据源
$ pwd # 确认当前目录
/apps/usr/hadoop-2.7.7
$ mkdir wcinput
$ cat >> wcinput/a.txt << EOF
hadoop yarn
hadoop mapreduce
atguigu
atguigu
EOF
# 运行程序
$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount wcinput wcoutput
$ cat wcoutput/* # 查看统计结果
atguigu 2
hadoop 2
mapreduce 1
yarn 1
部署伪分布集群
在部署伪分布集群前,请先参考上述部分,部署好单节点HDFS。
修改hadoop配置文件
$ pwd # 确定当前路径
/apps/usr/hadoop-2.7.7
# 修改hadoop的jdk环境变量
$ sed -i 's/export JAVA_HOME=.*/export JAVA_HOME=\/apps\/usr\/jdk/g' /apps/usr/hadoop-2.7.7/etc/hadoop/hadoop-env.sh
$ vim etc/hadoop/core-site.xml # 修改此文件
<configuration> # 找到此行,写入以下配置
<!--指定HDFS中NameNode的地址-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://192.168.20.10:9000</value>
</property>
<!--指定Hadoop运行时产生文件的存储目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/apps/usr/hadoop-2.7.7/data/tmp</value>
</property>
</configuration>
$ vim etc/hadoop/hdfs-site.xml # 修改此文件
<configuration> # 找到此行,写入以下配置
<!--默认副本数为3,修改为1-->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
修改副本数的原因在于,目前只有一个datanode,即便是使用默认值3,也只会有一个副本,但如果后续增加datanode,它会在其他datanode上同步副本,直至满足定义的副本数。
上述所有配置文件中的默认配置,都可以在官网上找到答案,如下:
点击任意一个进入后,即可看到如下页面(左边是name,右边是默认的value):
启动HDFS并运行MapReduce
1、格式化NameNode(第一次启动时格式化,后续就不要总是格式化了)
格式化的概念,和磁盘的格式化一个意思,格式化后,所有数据就都没了,在集群运行一段时间后,再次格式化,可能需要将data目录删除后才可格式化,否则可能会报错。
$ hdfs namenode -format
格式化成功后,部分输出如下:
2、启动NameNode
$ hadoop-daemon.sh start namenode
# 启动后,会输出日志文件路径
starting namenode, logging to /apps/usr/hadoop-2.7.7/logs/hadoop-root-namenode-lv.out
3、启动DataNode
$ hadoop-daemon.sh start datanode
starting datanode, logging to /apps/usr/hadoop-2.7.7/logs/hadoop-root-datanode-lv.out
4、确定集群已启动
$ jps # 查看java进程
27984 DataNode
28100 Jps
27899 NameNode
# 由于我这台机器上没有其他java进程,所以可以确定,所有端口都是HDFS在占用(也可以通过pid号来确认)
$ ss -lnput | grep java
tcp LISTEN 0 128 127.0.0.1:41703 *:* users:(("java",pid=27984,fd=198))
tcp LISTEN 0 128 192.168.20.10:9000 *:* users:(("java",pid=27899,fd=205))
tcp LISTEN 0 128 *:50070 *:* users:(("java",pid=27899,fd=194))
tcp LISTEN 0 128 *:50010 *:* users:(("java",pid=27984,fd=186))
tcp LISTEN 0 128 *:50075 *:* users:(("java",pid=27984,fd=226))
tcp LISTEN 0 128 *:50020 *:* users:(("java",pid=27984,fd=231))
访问hadoop的web管理页面
访问地址为你机器的50070端口即可。如下:
上述中的文件系统,和linux一样,都是以 “/” 开始。
运行MapReduce
# 在HDFS中创建目录(没有任何输出,即表示创建成功)
$ hdfs dfs -mkdir -p /user/lvjianzhao/test
# 查看创建的目录
$ hdfs dfs -ls /
Found 1 items
drwxr-xr-x - root supergroup 0 2020-11-08 20:01 /user
$ hdfs dfs -ls -R / # 查看多级目录
drwxr-xr-x - root supergroup 0 2020-11-08 20:01 /user
drwxr-xr-x - root supergroup 0 2020-11-08 20:01 /user/lvjianzhao
drwxr-xr-x - root supergroup 0 2020-11-08 20:01 /user/lvjianzhao/test
# 上传本地文件到HDFS
$ echo "test file upload" >> a.txt # 创建测试文件
$ hdfs dfs -put a.txt /user/lvjianzhao/test/ # 上传本地文件到刚才创建的目录下
$ hdfs dfs -cat /user/lvjianzhao/test/a.txt # 查看上传的文件
test file upload
上传的文件,亦可以在web界面看到并下载,如下:
点击文件名后看到如下:
# wordcount统计刚才上传的文件
$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount /user/lvjianzhao/test/a.txt /user/lvjianzhao/test/output
# 命令行查看统计结果
$ hdfs dfs -cat /user/lvjianzhao/test/output/*
file 1
test 1
upload 1
分析统计结果,照样可以在web页面查看到,如下:
启动YARN并运行MapReduce程序
启动YARN并运行MapReduce程序的大概过程如下:
1、配置集群在YARN上运行RM
2、启动、测试集群增删改查
3、在YARN上执行wordcount案例
在启动yarn之前,我们先来看一下yarn的架构,如下:
关于其架构的解释,可以观看尚硅谷视频。
配置集群在YARN上运行
$ pwd # 确定当前目录
/apps/usr/hadoop-2.7.7
# 修改yarn-site.xml
$ vim etc/hadoop/yarn-site.xml
<configuration> # 找到此行,写入以下内容
<!--指定YARN的ResourceManager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop01</value>
</property>
<!--Reducer获取数据的方式-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
# 配置mapred-site.xml
$ cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
$ vim etc/hadoop/mapred-site.xml # 编辑此配置文件
<configuration>
<!-- 指定MapReduce运行时框架运行在YARN上,默认是local -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
启动集群
# 启动前必须保证namenode和datanode已经启动,如下:
$ jps | grep -v Jps
27984 DataNode
27899 NameNode
# 启动resourcemanager
$ yarn-daemon.sh start resourcemanager
# 启动nodemanager
$ yarn-daemon.sh start nodemanager
查看cluster的web界面
访问8088端口(访问的是mapreduce的管理页面),如下:
运行一个wordcount作业
$ hdfs dfs -rm -r /user/lvjianzhao/test/output # 删除之前的作业输出目录
# 重新运行wordcount作业
$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount /user/lvjianzhao/test/a.txt /user/lvjianzhao/test/output
wordcount运行成功后,即可看到如下信息:
$ vim etc/hadoop/mapred-site.xml # 编辑此文件,在末尾的</configuration> 标签之前增加以下内容
<!--指定历史服务器端地址-->
<property>
<name>mapreduce.jobhistory.address</name>
<value>192.168.20.10:10020</value>
</property>
<!--历史服务器web端地址-->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>192.168.20.10:19888</value>
</property>
</configuration>
# 启动历史服务器
$ mr-jobhistory-daemon.sh start historyserver
# 查看历史服务器是否已启动
$ jps
27984 DataNode
29809 Jps
27899 NameNode
28877 ResourceManager
29117 NodeManager
29741 JobHistoryServer
$ ss -lnput | egrep '10020|19888' # 确定端口在监听
tcp LISTEN 0 128 192.168.20.10:19888 *:* users:(("java",pid=29741,fd=214))
tcp LISTEN 0 128 192.168.20.10:10020 *:* users:(("java",pid=29741,fd=219))
到目前为止,我们还不能直接访问历史服务器的信息,因为点击后,就会跳转到以你hadoop所在机器的主机名开头的url中,所以你还需要自行配置本机的hosts文件(hosts文件路径:C:\Windows\System32\drivers\etc\hosts),才可以成功访问到如下页面:
配置日志的聚集功能
日志聚集的概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
日志聚集功能的好处:可以方便的查看到程序运行详情,方便开发测试。
注意:开启日志聚集功能,需要重新启动NodeManager、ResourceManager、和HistroyManager。
$ vim etc/hadoop/yarn-site.xml # 在configuration字段中添加以下内容
<!--开启日志聚集功能-->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!--日志保留时间设置为7天-->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
# 重启NodeManager、ResourceManager、和HistroyManager
# 停止
$ yarn-daemon.sh stop resourcemanager
$ yarn-daemon.sh stop nodemanager
$ mr-jobhistory-daemon.sh stop historyserver
# 启动
$ mr-jobhistory-daemon.sh start historyserver
$ yarn-daemon.sh start nodemanager
$ yarn-daemon.sh start resourcemanager
至此,日志聚合功能配置完毕,现在就来验证下。
# 运行一个wordcount工作
$ hdfs dfs -rm -r /user/lvjianzhao/test/output
$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount /user/lvjianzhao/test/a.txt /user/lvjianzhao/test/output
查看聚合后的日志:
1、进入job的history:
2、进入job的logs
3、查看日志信息
集群部署问题汇总
namenode和datanode进程只能启动一个
遇到此问题,大多数是你二次格式化了namenode,造成namenode产生了新的cluster_ID,但datanode还是之前的cluster_ID,此时,他们谁也不认识谁,就会造成,只能启动datanode或者namenode,图示如下:
# namenode 的cluster信息存储路径
$ grep 'clusterID' /apps/usr/hadoop-2.7.7/data/tmp/dfs/name/current/VERSION
clusterID=CID-e605e3ae-d898-45d8-bf71-59345a1110fd
# datanode 的cluster信息存储路径
$ grep 'clusterID' /apps/usr/hadoop-2.7.7/data/tmp/dfs/data/current/VERSION
clusterID=CID-e605e3ae-d898-45d8-bf71-59345a1110fd
# 正常情况下,datanode和namenode的clusterID一致才对。