hadoop基础操作

本文介绍了Hadoop的基本操作,包括HDFS的使用,如上传、删除文件,以及通过命令行执行MapReduce任务。此外,还讲解了如何配置和启动Hadoop历史服务器以查看任务历史,以及通过脚本自动化集群的启动和停止。最后,分享了用于集群数据同步和管理的实用脚本。
摘要由CSDN通过智能技术生成

Hadoop基础操作

传送门:hadoop集群搭建 https://blog.csdn.net/gg_xiajie/article/details/118095901

前面写完了hadoop集群的安装,算是初步开始学习了。。。

本章学习下hadoop的一些基本操作。

一、HDFS

启动hadoop之后可以打开hdfs的可视化页面

http://hadoop01:9870/

image-20210622220903882

可视化的文件系统在image-20210622220938516

这里是部分数据我练习的时候插入好了的

image-20210622221013532

手动上传文件到hdfs,命令:

# 创建文件夹(根目录创建名为input的文件夹)
hadoop fs -mkdir /input
# 上传文件(上传1.txt到input文件夹)
hadoop fs -put 1.txt /input

错误示范:

# 文件夹不存在
hadoop fs -put 1.txt /input1/
# 会上传到根目录,名称为input2
hadoop fs -put 1.txt /input2

数据存放在之前集群配置的dataNode地址中,例如我的

/home/hadoop/software/hadoop/data/dfs/data/current/BP-1512100918-192.168.0.101-1624284033781/current/finalized/subdir0/subdir0

image-20210622224505611

默认每个文件的存储块是128m,超过128m的会被分割,不足128m占据其实际容量

如上传较大文件,我拿hadoop安装包系统举例

image-20210622224901649

上传完成后

image-20210622225010779

image-20210622225031022

image-20210622225048164

上图可以看到占据了3个存储块,每个存储块对应不同的BlockID,Size是其占据当前存储块的真实容量,其中134217728就是128m

到文件空间看下可以看到

image-20210622225406547

把文件拼接起来就是完整的压缩包

# 文件拼接
cat [部分文件] >> [完整文件名]
# 本次Hadoop被拆成了3份文件
blk_1073741861>>data.tar.gz
blk_1073741862>>data.tar.gz
blk_1073741863>>data.tar.gz
# 解压
tar -zxvf data.tar.gz

解压完成后就是上传的完整文件

image-20210622225959871

记住,如果需要删除文件,尽量使用命令或者在web页上去删除,因为是分布式的,默认是3份,也就是3台机器都会存一份文件,如果你直接在liunx系统里面删除的话其他机器还是存在的

#删除文件
hadoop fs -rm -f /test
#删除文件夹
hadoop fs -rm -r /testdir
#查看
hadoop fs -ls /

更多命令详见官网 http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_shell.html

二、执行任务

在Hadoop安装包中,有官方给的代码例子

# 目录
hadoop/share/hadoop/mapreduce
# 代码案例
hadoop-mapreduce-examples-3.1.3.jar

有时间的朋友可以下载下来看下,我这只使用了里面一个word count的命令

新建一个文件,并上传到hdfs

vim 1.txt

这是一个安静的晚上
我是天神、我是魔鬼、我是无敌的
无敌的我、又迷路了 无敌的我、又迷路了
无敌的我、又迷路了

hadoop fs -mkdir /input
hadoop fs -put 1.txt /input

提交jar包

# hadoop jar [jarPath] [args] 
# 本次三个参数分别为函数名:wordcount,输入文件路径/input,输出文件路径/output,这里的文件路径都是针对hdfs的路径
hadoop jar /home/hadoop/software/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output

然后去先前配置的ResourceManager地址去看,我是在192.168.0.102上

http://hadoop02:8088/

箭头指向的地方可以查看进程执行到什么地方了

image-20210623214135783

这里可以查看历史,不过要先进行配置并启动历史服务器

image-20210623214433161

配置方法(要配置集群中的每一台机器),配置完成后重启

# 修改mapred-site.xml,新增历史服务器web端地址
<configuration>
	<!-- 指定 MapReduce 程序运行在 Yarn 上 -->
	<property>
		<name>mapreduce.framework.name</name>
		<value>yarn</value>
	</property>
	<property>
		<name>mapreduce.jobhistory.address</name>
		<value>hadoop01:10020</value>
	</property>
	<!-- 历史服务器 web 端地址 -->
	<property>
		<name>mapreduce.jobhistory.webapp.address</name>
		<value>hadoop01:19888</value>
	</property>
</configuration>

启动hdfs,启动yarn后再启动历史服务器,在配置的机器上进行操作

mapred --daemon start historyserver

之后就可以查看历史任务

image-20210623214948764

配置日志集成,然后重启

# 修改yarn-site.xml为如下内容,实际为新增了最下面的三个配置
<configuration>
	<!-- 指定 MR 走 shuffle -->
	<property>
		<name>yarn.nodemanager.aux-services</name>
		<value>mapreduce_shuffle</value>
	</property>
	<!-- 指定 ResourceManager 的地址-->
	<property>
		<name>yarn.resourcemanager.hostname</name>
		<value>hadoop02</value>
	</property>
	<!-- 环境变量的继承 -->
	<property>
		<name>yarn.nodemanager.env-whitelist</name>
		<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
	</property>
	<!-- 开启日志聚集功能 -->
	<property>
		<name>yarn.log-aggregation-enable</name>
		<value>true</value>
	</property>
	<!-- 设置日志聚集服务器地址 -->
	<property>
		<name>yarn.log.server.url</name>
		<value>http://hadoop01:19888/jobhistory/logs</value>
	</property>
	<!-- 设置日志保留时间为 7 天 -->
	<property>
		<name>yarn.log-aggregation.retain-seconds</name>
		<value>604800</value>
	</property>
</configuration>

点击如下界面即可查看历史数据

image-20210623215253341

image-20210623215301345

三、附加脚本

因为经常重启与更新配置,每次来回重启和修改太过于麻烦,这里写了几个脚本

##### 1、同步服务器的数据(xsync)

#!/bin/bash
#1. 判断参数个数,如果没有参数,返回错误
if [ $# -lt 1 ]
then
 echo Not Enough Arguement!
 exit;
fi
#2. 遍历集群所有机器,(如果没有配置host和主机名建议配置一下,不然就写IP地址)
for host in hadoop02 hadoop03 hadoop01
do
 echo ==================== $host ====================
 #3. 遍历所有目录,挨个发送
 for file in $@
 do
 #4. 判断文件是否存在
 if [ -e $file ]
 then
 #5. 获取父目录(其实就是挨个执行,其中file是你输入的文件名,然后获取当前文件的绝对路径)
 pdir=$(cd -P $(dirname $file); pwd)
 #6. 获取当前文件的名称
 fname=$(basename $file)
 #7. 通过ssh登录目标服务器,先创建文件夹
 ssh $host "mkdir -p $pdir"
 #8. 使用rsync进行拷贝,rsync与scp相比最大的好处是会先去比较差异,如果没有差异的文件则不会更新,如果不存在也会进行插入
 # 如果没有rsync的话用yum install一下,命令为:yum install rsync
 rsync -av $pdir/$fname $host:$pdir
 else
 echo $file does not exists!
 fi
 done
done

2、集群全部启动和全部停止(hadoopall)
#!/bin/bash
if [ $# -lt 1 ]
then
 echo "No Args Input..."
 exit ;
fi
case $1 in
"start")
 echo " =================== 启动 hadoop 集群 ==================="
 echo " --------------- 启动 hdfs ---------------"
 # 1.这里最好写绝对路径,或者你配置了环境变量也可以,具体ssh到哪台机器上以及启动哪个命令根据你自己配置定义
 ssh hadoop01 "/home/hadoop/software/hadoop/sbin/start-dfs.sh"
 echo " --------------- 启动 yarn ---------------"
ssh hadoop02 "/home/hadoop/software/hadoop/sbin/start-yarn.sh"
 echo " --------------- 启动 historyserver ---------------"
 ssh hadoop01 "/home/hadoop/software/hadoop/bin/mapred --daemon start historyserver"
;;
"stop")
 echo " =================== 关闭 hadoop 集群 ==================="
 echo " --------------- 关闭 historyserver ---------------"
 ssh hadoop01 "/home/hadoop/software/hadoop/bin/mapred --daemon stop historyserver"
 echo " --------------- 关闭 yarn ---------------"
 ssh hadoop02 "/home/hadoop/software/hadoop/sbin/stop-yarn.sh"
 echo " --------------- 关闭 hdfs ---------------"
 ssh hadoop01 "/home/hadoop/software/hadoop/sbin/stop-dfs.sh"
;;
*)
 echo "Input Args Error..."
;;
esac
3、脚本生效

脚本的格式可以是***.sh,或者直接***

例如我的两个名称(xsync与hadoopall)

使用chmod命令授予执行权限

chmod 777 xsync
chmod 777 hadoopall

执行完毕之后是这样的,最好配置下环境变量,方便后续直接在任意目录使用

image-20210623220543606

如,我在/etc/profile.d下创建了一个为my-env.sh的文件,文件内容如下,这样的话我的所有在myshell下的命令都可以进行执行了

# JAVA_HOME
export JAVA_HOME=/home/hadoop/software/jdk8
export PATH=$PATH:$JAVA_HOME/bin

# HADOOP_HOME
export HADOOP_HOME=/home/hadoop/software/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

# MYSHELL
export PATH=$PATH:/home/myshell

ile.d下创建了一个为my-env.sh的文件,文件内容如下,这样的话我的所有在myshell下的命令都可以进行执行了

# JAVA_HOME
export JAVA_HOME=/home/hadoop/software/jdk8
export PATH=$PATH:$JAVA_HOME/bin

# HADOOP_HOME
export HADOOP_HOME=/home/hadoop/software/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

# MYSHELL
export PATH=$PATH:/home/myshell
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值