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 unlimitedEOFcat > /etc/sysctl.conf << EOFkernel.sysrq = 0kernel.core_uses_pid = 1fs.file-max=655360kernel.msgmnb = 65536kernel.msgmax = 65536kernel.shmmax = 68719476736kernel.shmall = 4294967296kernel.pid_max = 655360net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_tw_recycle = 0net.ipv4.tcp_max_tw_buckets = 10000net.ipv4.tcp_fin_timeout = 30net.ipv4.tcp_timestamps = 0net.ipv4.tcp_sack = 1net.ipv4.tcp_window_scaling = 1net.ipv4.tcp_ecn = 0net.ipv4.tcp_keepalive_time = 600net.ipv4.tcp_keepalive_intvl = 30net.ipv4.tcp_keepalive_probes = 3net.ipv4.tcp_max_orphans = 655360net.ipv4.tcp_max_syn_backlog = 262144net.ipv4.tcp_mem = 65536 131072 262144net.ipv4.udp_mem = 65536 131072 262144net.ipv4.tcp_rmem = 4096 87380 16777216net.ipv4.tcp_wmem = 4096 16384 16777216net.ipv4.ip_local_port_range = 1024 65535net.ipv4.route.gc_timeout = 100# 禁止icmp重定向报文net.ipv4.conf.all.accept_redirects = 0# 禁止icmp源路由net.ipv4.conf.all.accept_source_route = 0net.core.somaxconn = 65535net.core.rmem_default = 8388608net.core.wmem_default = 8388608net.core.rmem_max = 16777216net.core.wmem_max = 16777216net.core.netdev_max_backlog = 262144vm.swappiness = 10vm.overcommit_memory = 1vm.max_map_count = 262144EOFsysctl -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 << EOFexport JAVA_HOME=/apps/usr/jdkexport CLASSPATH=\$JAVA_HOME/libexport PATH=\$JAVA_HOME/bin:\$PATHEOF$ 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 << EOF192.168.20.10 hadoop01EOF$ 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 << EOFexport HADOOP_HOME=/apps/usr/hadoop-2.7.7export 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 << EOFhadoop yarnhadoop mapreduceatguiguatguiguEOF# 运行程序$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount wcinput wcoutput$ cat wcoutput/* # 查看统计结果atguigu 2hadoop 2mapreduce 1yarn 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 datanodestarting datanode, logging to /apps/usr/hadoop-2.7.7/logs/hadoop-root-datanode-lv.out
4、确定集群已启动
$ jps # 查看java进程27984 DataNode28100 Jps27899 NameNode# 由于我这台机器上没有其他java进程,所以可以确定,所有端口都是HDFS在占用(也可以通过pid号来确认)$ ss -lnput | grep javatcp 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 itemsdrwxr-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 /userdrwxr-xr-x - root supergroup 0 2020-11-08 20:01 /user/lvjianzhaodrwxr-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 1test 1upload 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 Jps27984 DataNode27899 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# 查看历史服务器是否已启动$ jps27984 DataNode29809 Jps27899 NameNode28877 ResourceManager29117 NodeManager29741 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/VERSIONclusterID=CID-e605e3ae-d898-45d8-bf71-59345a1110fd# datanode 的cluster信息存储路径$ grep 'clusterID' /apps/usr/hadoop-2.7.7/data/tmp/dfs/data/current/VERSIONclusterID=CID-e605e3ae-d898-45d8-bf71-59345a1110fd# 正常情况下,datanode和namenode的clusterID一致才对。
