Hadoop基础操作
传送门:hadoop集群搭建 https://blog.csdn.net/gg_xiajie/article/details/118095901
前面写完了hadoop集群的安装,算是初步开始学习了。。。
本章学习下hadoop的一些基本操作。
一、HDFS
启动hadoop之后可以打开hdfs的可视化页面
http://hadoop01:9870/
可视化的文件系统在
这里是部分数据我练习的时候插入好了的
手动上传文件到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
默认每个文件的存储块是128m,超过128m的会被分割,不足128m占据其实际容量
如上传较大文件,我拿hadoop安装包系统举例
上传完成后
上图可以看到占据了3个存储块,每个存储块对应不同的BlockID,Size是其占据当前存储块的真实容量,其中134217728就是128m
到文件空间看下可以看到
把文件拼接起来就是完整的压缩包
# 文件拼接
cat [部分文件] >> [完整文件名]
# 本次Hadoop被拆成了3份文件
blk_1073741861>>data.tar.gz
blk_1073741862>>data.tar.gz
blk_1073741863>>data.tar.gz
# 解压
tar -zxvf data.tar.gz
解压完成后就是上传的完整文件
记住,如果需要删除文件,尽量使用命令或者在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/
箭头指向的地方可以查看进程执行到什么地方了
这里可以查看历史,不过要先进行配置并启动历史服务器
配置方法(要配置集群中的每一台机器),配置完成后重启
# 修改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
之后就可以查看历史任务
配置日志集成,然后重启
# 修改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>
点击如下界面即可查看历史数据
三、附加脚本
因为经常重启与更新配置,每次来回重启和修改太过于麻烦,这里写了几个脚本
##### 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
执行完毕之后是这样的,最好配置下环境变量,方便后续直接在任意目录使用
如,我在/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