内容非常全,挺好。下面是链接:
hadoop3.2.1安装(vm版)_leveretz的博客-CSDN博客
Hadoop3.2.1分布式高可用安装
1 下载安装包
jdk-8u271-linux-x64.rpm
hadoop-3.2.1.tar.gz
zookeeper-release-3.6.2.tar.gz
2 主机规划
IP
主机名
用途
系统进程
用户密码
操作系统
CPU
内存
硬盘
备注
192.168.31.101
cancer01
Namenode
namenode
journalnode
resourcemanager
zkfc
hadoop
hadoop
Centos7
2c
32G
1T
192.168.31.102
cancer02
SecondaryNamenode
namenode
journalnode
resourcemanager
zkfc
hadoop
hadoop
Centos7
2c
32G
1T
192.168.31.103
cancer03
Datanode
datanode
journalnode
nodemanager
quorumpeermain
zkfc
hadoop
hadoop
Centos7
2c
32G
1T
192.168.31.104
cancer04
Datanode
datanode
nodemanager
quorumpeermain
zkfc
hadoop
hadoop
Centos7
2c
32G
1T
192.168.31.105
cancer05
Datanode
datanode
nodemanager
quorumpeermain
zkfc
hadoop
hadoop
Centos7
2c
32G
1T
3 主机环境准备
3.1 设置主机IP
在每台主机上设置IP
1、修改配置文件
# vim /etc/sysconfig/network-scripts/ifcfg-eth0(ifcfg-eth0为网卡名,不同主机可能名称不同)
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.31.101
NETMASK=255.255.255.0
GATEWAY=192.168.31.1
DNS1=192.168.31.1
DNS2=0.0.0.0
2、重启服务
# service network restart
3.2 设置主机名
在每台主机上设置主机名
1、查看主机名
# hostnamectl
2、用命令修改
# hostnamectl set-hostname cancer01 (修改当前主机名)
3、修改配置文件
# vim /etc/hosts (每台主机hosts文件均为如下内容)
127.0.0.1 localhost
192.168.116.101 cancer01
192.168.116.102 cancer02
192.168.116.103 cancer03
192.168.116.104 cancer04
192.168.116.105 cancer05
4、重启主机
# reboot now
3.3 添加用户
在每台主机上添加用户
# useradd hadoop
# passwd hadoop
3.4 关闭防火墙
在每台主机上关闭防火墙
# systemctl stop firewalld.service centos7停止firewall
# systemctl disable firewalld.service centos7禁止firewall开机启动
3.5 关闭selinux
在每台主机上关闭selinux
# vim /etc/sysconfig/selinux
selinux=disabled
3.6 禁用Transparent Hugepage
在每台主机上禁用Transparent Hugepage
查看状态
# cat /sys/kernel/mm/transparent_hugepage/enabled
返回结果
[always] madvise never
永久关闭
# vim /etc/rc.local
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
或者直接运行下面命令:
# echo never > /sys/kernel/mm/transparent_hugepage/enabled
# echo never > /sys/kernel/mm/transparent_hugepage/defrag
重启机器
查看状态
# cat /sys/kernel/mm/transparent_hugepage/enabled
返回结果
always madvise [never]
3.7 授权sudo
在每台主机上给hadoop用户授权sudo
# vim /etc/sudoers
hadoop ALL=(ALL) ALL
3.8 设置文件打开数量和用户最大进程数
1、在每台主机上设置文件打开数量和用户最大进程数
1、查看文件句柄数
# ulimit -a
2、查看应用进程打开文件句柄数
# lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more
根据进程ID号来查看进程名
# ps aef|grep 24204
3、用户级限制修改
# vim /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
* soft nproc 32000
* hard nproc 32000
4、系统级限制修改
# echo 6553560 > /proc/sys/fs/file-max (临时生效,重启机器后会失效)
# vim /etc/sysctl.conf
fs.file-max = 6553560 (永久生效)
# reboot now
2、设置最大虚拟内存区
echo "vm.max_map_count=262144" > /etc/sysctl.conf
sysctl -p
3.9 主机时间同步
在每台主机上安装ntp时间同步插件
1.检查是否有时间同步的插件:
# rpm -qa | grep ntp
2.没有就安装(每台都要安装):
# yum -y install ntp ntpdate
3.选择一台服务器作为集群的时间服务器
比如:cancer01:时间服务器,cancer02、cancer03、cancer04、cancer05时间同步cancer01
4.查看Linux中的ntpd时间服务(这里只要开启第一台机器的ntpd服务,其他的不用开)
# service ntpd status
# service ntpd start
5.开机启动设置(在第一台设置,其他不要设置)
# chkconfig ntpd on
6.修改时间服务器的配置文件
# vi /etc/ntp.conf
【第一处】修改为本集群的网段,注意将前面的#去掉,生效
# Hosts on local network are less restricted.
restrict 192.168.31.0 mask 255.255.255.0 nomodify notrap
【第二处】由于是内网环境不用添加服务,前面加上注释
#server 0.centos.pool.ntp.org
#server 1.centos.pool.ntp.org
#server 2.centos.pool.ntp.org
【第三处】开启本地服务(没有就手动添加),注意将前面的#去掉,生效
# local clock
server 127.127.1.0
fudge 127.127.1.0 stratum 10
保存文件,重启ntpd服务
#service ntpd restart
7.更新本地时间
#ntpdate -u 202.120.2.101
注:可用于同步时间的网站
us.pool.ntp.org
cn.pool.ntp.org
ntp.sjtu.edu.cn 202.120.2.101 (上海交通大学网络中心NTP服务器地址)
s1a.time.edu.cn 北京邮电大学
s1b.time.edu.cn 清华大学
8.查看本地硬件时钟时间,并进行更新
# hwclock --localtime
# hwclock --localtime -w 或者
# hwclock --systohc //系统时间同步给硬件时间
9.设置服务器启动后自动将硬件时钟时间同步给系统时间
# vi /etc/sysconfig/ntpd
SYNC_HWCLOCK=yes
10.设置让系统时间自动同步给本地硬件时钟时间
# vi /etc/sysconfig/ntpdate
SYNC_HWCLOCK=yes
11.其他的服务器与这台时间服务器进行时间同步(剩余4台所有机器)
# crontab -e
## 每10分钟同步一次时间
0-59/10 * * * * /sbin/service ntpd stop
0-59/10 * * * * /usr/sbin/ntpdate -u node1
0-59/10 * * * * /sbin/service ntpd start
4 免密ssh配置
在每台主机上配置ssh免密
# ssh-keygen -t rsa
然后三次回车,运行结束会在~/.ssh下生成两个新文件:
id_rsa.pub和id_rsa就是公钥和私钥
然后也是在每台主机上都执行:
# ssh-copy-id cancer01
# ssh-copy-id cancer02
# ssh-copy-id cancer03
# ssh-copy-id cancer04
# ssh-copy-id cancer05
传统ssh免密配置如下:
打通01,02,03,04,05机器之间的SSH无密码登陆
修改sshd配置,每台机器上
# vim /etc/ssh/sshd_config
放开2行注释
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
切换用户
# su hadoop
查看是否安装ssh,每台机器上
# rpm -qa | grep ssh
可以通过以下命令安装ssh:
# apt-get install openssh-server
# yum install ssh
在每台机器上进入hadoop用户目录,使用命令生成公钥和私钥(连续回车,不设置密码)
# ssh-keygen -t rsa
在01机器上生成authorized_keys文件
# scp ~/.ssh/id_rsa.pub hadoop@cancer01:/home/hadoop/.ssh/authorized_keys
将其他4台机器的id_rsa.pub文件内容手动拷贝到01机器上的authorized_keys文件中
在01机器上把authorized_keys文件复制到其他要访问的机器的hadoop用户目录下.ssh目录
# scp ~/.ssh/authorized_keys hadoop@cancer02:/home/hadoop/.ssh/authorized_keys
# scp ~/.ssh/authorized_keys hadoop@cancer03:/home/hadoop/.ssh/authorized_keys
# scp ~/.ssh/authorized_keys hadoop@cancer04:/home/hadoop/.ssh/authorized_keys
# scp ~/.ssh/authorized_keys hadoop@cancer05:/home/hadoop/.ssh/authorized_keys
访问授权,每台机器上
# chmod 600 .ssh/authorized_keys
在各台机器上检测是否可以不需要密码登陆
# ssh localhost
# ssh hadoop@cancer01
# ssh hadoop@cancer02
# ssh hadoop@cancer03
# ssh hadoop@cancer04
# ssh hadoop@cancer05
问题:The authenticity of host 'cancer04 (192.168.1.116)' can't be established.ECDSA key fingerprint is 86:c2:6b:12:68:b0:f8:5d:9b:96:35:e0:f1:8e:75:3a.Are you sure you want to continue connecting (yes/no)? yes。
解决:ssh -o StrictHostKeyChecking=no 192.168.116.128
5 安装jdk1.8
在每台主机上安装jdk
下载jdk-8u271-linux-x64.rpm,使用rz命令上传。
1、安装前,最好先删除Linux自带的OpenJDK:
(1)运行java -version,会发现Linux自带的OpenJDK,运行rpm -qa | grep jdk,找出自带的OpenJDK名称;
(2)运行rpm -e --nodeps OpenJDK名称,删除OpenJDK;
2、运行rpm -ivh jdk-8u271-linux-x64.rpm
或者yum localinstall jdk-8u271-linux-x64.rpm
3、运行vim /etc/profile,在文件末尾输入以下几行:
export JAVA_HOME=/usr/java/jdk1.8.0_271
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
4、运行source /etc/profile,使文件生效;
5、运行java -version,查看返回结果。
6 安装zookeeper
在每台主机上安装zookeeper
su hadoop
tar -xvf zookeeper-3.6.2.tar.gz
cd /usr/local/zookeeper-3.6.2/conf
cp zoo_sample.cfg zoo.cfg
修改dataDir
sudo vim zoo.cfg
dataDir=/usr/local/zookeeper-3.6.2/data
添加下面三行
server.1=cancer01:2888:3888
server.2=cancer02:2888:3888
server.3=cancer03:2888:3888
server.4=cancer04:2888:3888
server.5=cancer05:2888:3888
cd ../
mkdir data
touch data/myid
echo 1 > data/myid
more data/myid
1
## cancer02 03 04 05,也修改配置,就如下不同
echo 2 > data/myid
echo 3 > data/myid
echo 4 > data/myid
echo 5 > data/myid
配置环境变量,(在5台机器上都要做)
vim /etc/profile
export ZOOKEEPER_HOME=/usr/local/zookeeper-3.6.2
export PATH=$PATH:$ZOOKEEPER_HOME/bin
启动5台zookeeper服务
cd /usr/local/zookeeper-3.6.2/bin
zkServer.sh start //启动zookeeper
zkServer.sh status //查看zookeeper的状态,看哪台是leader,哪台是follower
zkCli.sh //zookeeper客户端连接
7 安装hadoop
在cancer01主机上配置hadoop,然后复制到其他4台主机
上传hadoop-3.2.1.tar.gz
移动hadoop-3.2.1到/usr/local目录下,
cd /usr/local
tar -zxvf hadoop-3.2.1.tar.gz
chown -R hadoop:hadoop ./hadoop-3.2.1 (在每台机器上都要做)
ln -s /usr/local/hadoop-3.2.1 /usr/local/hadoop (在每台机器上都要做)
判断hadoop的版本
/usr/local/hadoop/bin/hadoop version
配置环境变量,(在每台机器上都要做)
vim /etc/profile
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_PREFIX=/usr/local/hadoop
export HADOOP_LIBEXEC_DIR=/usr/local/hadoop/libexec
export HADOOP_MAPRED_HOME=/usr/local/hadoop/mapreduce
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
source /etc/profile
在01、02本地文件系统创建以下文件夹:
mkdir /home/hadoop/name
mkdir /home/hadoop/data
mkdir /home/hadoop/temp
mkdir /home/hadoop/edits
在03、04、05本地文件系统创建以下文件夹:
mkdir /home/hadoop/data
mkdir /home/hadoop/temp
在01、02、03本地文件系统创建以下文件夹:
mkdir /home/hadoop/jn
8 配置hadoop
涉及到的配置文件有8个:
/usr/local/hadoop/etc/hadoop/hadoop-env.sh
/usr/local/hadoop/etc/hadoop/mapred-env.xml
/usr/local/hadoop/etc/hadoop/yarn-env.sh
/usr/local/hadoop/etc/hadoop/workers
/usr/local/hadoop/etc/hadoop/core-site.xml
/usr/local/hadoop/etc/hadoop/hdfs-site.xml
/usr/local/hadoop/etc/hadoop/mapred-site.xml
/usr/local/hadoop/etc/hadoop/yarn-site.xml
8.1 配置hadoop-env.sh
在01机器上进入/usr/local/hadoop/etc/hadoop
export JAVA_HOME=/usr/java/jdk1.8.0_271
export HDFS_NAMENODE_USER=hadoop
export HDFS_DATANODE_USER=hadoop
export HDFS_JOURNALNODE_USER=hadoop
export HDFS_ZKFC_USER=hadoop
export YARN_RESOURCEMANAGER_USER=hadoop
export YARN_NODEMANAGER_USER=hadoop
8.2 配置mapred-env.sh
export JAVA_HOME=/usr/java/jdk1.8.0_271
8.3 配置yarn-env.sh
export JAVA_HOME=/usr/java/jdk1.8.0_271
8.4 配置workers
配置文件3:workers (这个文件里面保存所有slave节点)
cancer03
cancer04
cancer05
8.5 配置core-site.xml
<configuration>
<!-- 指定hdfs的nameservice -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://cancer</value>
</property>
<!-- 指定hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/hadoop/temp</value>
</property>
<!-- webUI展示时的用户 -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>hadoop</value>
</property>
<!-- 高可用依赖的zookeeper的通讯地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>cancer01:2181,cancer02:2181,cancer03:2181,cancer04:2181,cancer05:2181</value>
</property>
<configuration>
8.6 配置hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop/data</value>
</property>
<property>
<name>dfs.namenode.edits.dir</name>
<value>file:/home/hadoop/edits</value>
</property>
<property>
<name>dfs.blocksize</name>
<value>268435456</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions.enabled </name>
<value>false</value>
</property>
<!--=======HDFS高可用配置======== -->
<property>
<name>dfs.nameservices</name>
<value>cancer</value>
</property>
<!--定义hdfs集群中的namenode的ID号-->
<property>
<name>dfs.ha.namenodes.cancer</name>
<value>nn1,nn2</value>
</property>
<!--定义namenode的主机名和rpc协议的端口- -->
<property>
<name>dfs.namenode.rpc-address.cancer.nn1</name>
<value>cancer01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.cancer.nn2</name>
<value>cancer02:8020</value>
</property>
<!--定义namenode的主机名和http协议的端口-->
<property>
<name>dfs.namenode.http-address.cancer.nn1</name>
<value>cancer01:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.cancer.nn2</name>
<value>cancer02:9870</value>
</property>
<!--定义共享edits的url-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://cancer01:8485;cancer02:8485;cancer03:8485/cancer</value>
</property>
<!--journalnode集群中用于保存edits文件的目录-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>file:/home/hadoop/jn</value>
</property>
<!--定义hdfs的客户端连接hdfs集群时返回active namenode地址-->
<property>
<name>dfs.client.failover.proxy.provider.cancer</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--hdfs集群中两个namenode切换状态时的隔离方法-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!--hdfs集群中两个namenode切换状态时的隔离方法的秘钥-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!--ha的hdfs集群自动切换namenode的开关-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
8.7 配置mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.application.classpath</name> <value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>cancer01:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>cancer01:19888</value>
</property>
</configuration>
8.8 配置yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn-cluster</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>cancer01</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>cancer02</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>cancer01:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>cancer02:8088</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>cancer01:2181,cancer02:2181,cancer03:2181,cancer04:2181,cancer05:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</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>
</configuration>
8.9 复制安装目录
复制01主机hadoop目录到到其他主机
scp -r /usr/local/hadoop hadoop@cancer02:/usr/local/
scp -r /usr/local/hadoop hadoop@cancer03:/usr/local/
scp -r /usr/local/hadoop hadoop@cancer04:/usr/local/
scp -r /usr/local/hadoop hadoop@cancer05:/usr/local/
9 启动Hadoop
9.1 启动zookeeper
在各主机上启动zookeeper
cd /usr/local/zookeeper-3.6.2/bin
./zkServer.sh start
jps
./zkServer.sh status
9.2 启动journalnode
在01、02、03主机上启动journalnode(因为journalnode在上面的配置中只配置在01、02、03主机上)
cd /usr/local/hadoop/sbin
hadoop-daemon.sh start journalnode
10.3 格式化namenode
格式化01主机namenode,并启动
cd /usr/local/hadoop/bin
hdfs namenode -format
cd /usr/local/hadoop/sbin
hadoop-daemon.sh start namenode
9.4 同步namenode数据
同步01主机namenode数据到02主机,并启动
在02主机上如下操作
cd /usr/local/hadoop/bin
hdfs namenode -bootstrapStandby
cd /usr/local/hadoop/sbin
hadoop-daemon.sh start namenode
分别在01、02主机上执行如下命令,比对结果。结果一致,则数据同步成功
cat /home/hadoop/temp/dfs/name/current/VERSION
9.5 初始化zfck
在01主机上初始化zfck
cd /usr/local/hadoop/bin
hdfs zkfc -formatZK
9.6 启动hdfs
在01主机上启动hdfs
cd /usr/local/hadoop/sbin
stop-dfs.sh
start-dfs.sh
也可以分别在01、02主机上,单进程启动hdfs
cd /usr/local/hadoop/sbin
hadoop-daemon.sh start namenode
hadoop-daemon.sh start datanode
hadoop-daemon.sh start journalnode
hadoop-daemon.sh start zkfc
9.7 验证hdfs
01、02主机上
jps
NameNode
DFSZKFailoverController
JournalNode
03、04、05主机上
DataNode
QuorumPeerMain
访问页面:
http://cancer01:9870
http://cancer02:9870
9.8 启动yarn
在01主机上,集群启动yarn
cd /usr/local/hadoop/sbin
start-yarn.sh
也可以01、02机器上,单进程启动resourcemanager
cd /usr/local/hadoop/sbin
yarn-daemon.sh start resourcemanager
可以02、03、04机器上,单进程启动nodemanager
cd /usr/local/hadoop/sbin
yarn-daemon.sh start nodemanager
9.9 验证yarn
在01、02主机上
jps
ResourceManager
在03、04、05主机上
jps
NodeManager
集群监控,在01主机上
hdfs dfsadmin -report
当01的ResourceManager是Active状态的时候,访问02的ResourceManager会自动跳转到01的web页面
测试HA的可用性
./yarn rmadmin -getServiceState rm1 ##查看rm1的状态
./yarn rmadmin -getServiceState rm2 ##查看rm2的状态
访问页面:
http://cancer01:8088/cluster
http://cancer01:8088/cluster/cluster
9.10 启动hadoop
在每台主机上启动zookeeper:
zkServer.sh start
在01主机上启动hadoop
start-all.sh (等价于start-dfs.sh + start-yarn.sh)
也可以单独启动,在01主机上
start-dfs.sh
start-yarn.sh
9.12 添加新节点
添加一个新的DataNode节点,先在新加节点上安装好Hadoop,要和NameNode使用相同的配置(可以直接从NameNode复制),修改HADOOPHOME/conf/master文件,加入NameNode主机名。然后在NameNode节点上修改HADOOPHOME/conf/master文件,加入NameNode主机名。然后在NameNode节点上修改HADOOP_HOME/conf/slaves文件,加入新节点名,再建立新加节点无密码的SSH连接,运行启动命令为:/usr/local/hadoop$bin/start-all.sh
9.13 安全模式
NameNode在启动时会自动进入安全模式,安全模式是NameNode的一种状态,在这个阶段,文件系统不允许有任何修改,这时只需要等待几十秒即可。
手动进入安全模式
hadoop dfsadmin -safemode enter
手动退出安全模式
hadoop dfsadmin -safemode leave
9.14 重新平衡数据分布
HDFS的数据在各个DataNode中的分布可能很不均匀,尤其是在DataNode节点出现故障或新增DataNode节点时。新增数据块时NameNode对DataNode节点的选择策略也有可能导致数据块分布不均匀。用户可以使用命令重新平衡DataNode上的数据块的分布:
start-balancer.sh
10 hadoop常用命令
启动
进入sbin目录
start-all
关闭
进入sbin目录
stop-all
对hdfs操作的命令格式都是:hdfs dfs xxx
查看hdfs
hdfs dfs -ls /
hdfs dfs –ls -R
统计文件系统的可用空间信息
hdfs dfs -df -h /
统计文件夹的大小信息
hdfs dfs -du -s -h /hello/*
统计一个指定目录下的文件节点数量
hdfs dfs -count /hello/
hdfs dfs -count -q /hello/
查看文件
hdfs dfs -cat xxx
上传文件
hdfs dfs -put 本地地址 hadoop目录
上传文件夹
hdfs dfs -put 本地目录 hadoop目录
下载文件
hdfs dfs -get hadoop目录 本地目录
删除文件
hdfs dfs -rm 文件地址
hdfs dfs -rm -R 文件夹地址
hdfs dfs -rmdir 文件夹地址
创建目录
hdfs dfs -mkdir 目录地址
创建空白文件
hdfs dfs -touchz 文件地址
重命名
hdfs dfs -mv 原名文件地址 新名文件地址
从本地剪切粘贴到hdfs
hdfs dfs - moveFromLocal /home/hadoop/a.txt /aaa/bbb/cc/dd
从hdfs剪切粘贴到本地
hdfs dfs - moveToLocal /aaa/bbb/cc/dd /home/hadoop/a.txt
从本地文件系统中拷贝文件到hdfs路径去
hdfs dfs -copyFromLocal ./jdk.tar.gz /aaa/
从hdfs拷贝到本地
hdfs dfs -copyToLocal /aaa/jdk.tar.gz
从hdfs的一个路径拷贝hdfs的另一个路径
hdfs dfs -cp /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2
在hdfs目录中移动文件
hdfs dfs -mv /aaa/jdk.tar.gz /
追加一个文件到已经存在的文件末尾
hdfs dfs -appendToFile ./hello.txt /hello.txt
显示一个文件的末尾
hdfs dfs -tail /weblog/access_log.1
以字符形式打印一个文件的内容
hdfs dfs -text /weblog/access_log.1
合并下载多个文件,比如hdfs的目录 /aaa/下有多个文件:log.1, log.2,log.3,...
hdfs dfs -getmerge /aaa/log.* ./log.sum
修改文件所属权限 -R递归执行
hdfs dfs -chmod -R 666 /hello.txt
hdfs dfs -chown -R someuser:somegrp /hello.txt
修改所属群组 -R递归执行
hdfs dfs –chgrp [-R] /user/sunlightcs
清空回收站 .Trash/
hdfs dfs –expunge
文件检查,-e PATH是否存在,存在返回0,否则返回1 -z 文件是否为空,长度为0返回0,否则返回1 -d 是否为目录,为目录返回0,否则返回1
hdfs dfs –test –[ezd] PATH
设置hdfs中文件的副本数量(这里设置的副本数只是记录在namenode的元数据中,是否真的会有这么多副本,还得看datanode的数量)
hdfs dfs -setrep 3 /aaa/jdk.tar.gz
对mapred操作的命令格式都是:mapred job xxx
杀掉作业
mapred job -kill job-id
11 Eclipse配置Hadoop插件
Eclipse hadoop2 插件
https://github.com/winghc/hadoop2x-eclipse-plugin
Eclipse hadoop3 插件
https://github.com/Woooosz/eclipse-hadoop3x
11.1 准备环境
win7中,解压hadoop-3.2.1,到D:\servers\hadoop-3.2.1 (以下用$HADOOP_HOME表示)
win7中添加几个环境变量
HADOOP_HOME=D:\servers\hadoop-3.2.1
HADOOP_BIN_PATH=%HADOOP_HOME%\bin
HADOOP_PREFIX=D:\servers\hadoop-3.2.1
另外,PATH变量在最后追加;%HADOOP_HOME%\bin
11.2 编译eclipse plugin
下载地址:https://github.com/winghc/hadoop2x-eclipse-plugin
修改hadoop2x-eclipse-plugin-2.6.0\ivy下的libraries.properties
1)cd到hadoop2x-eclipse-plugin-master所在目录
2)执行ant jar
在命令行中执行如下命令:
ant jar -Dversion=2.6.0 -Declipse.home=[这里填你的eclipse目录路径] -Dhadoop.home=[这里填你的hadoop目录路径]
ant jar -Dversion=2.6.0 -Declipse.home=C:\sts-3.6.0.RELEASE -Dhadoop.home=E:\servers\hadoop-3.2.1
如下图所示:
在编译过程中,可能遇到说jar包不存在的问题。可以直接从网上下相对应的jar包,或者直接去hadoop-3.2.1/share/hadoop/common/lib目录中,该目录中应该有相对应的jar包,只不过版本不对,我是直接把jar包名字改成了ant所需的jar包名。
11.2 配置eclipse plugin
下载windows64位平台的hadoop2.6插件包(hadoop.dll,winutils.exe)
在hadoop2.7.2源码的hadoop-common-project\hadoop-common\src\main\winutils下,有一个vs.net工程,编译这个工程可以得到这一堆文件,输出的文件中,hadoop.dll、winutils.exe 这二个最有用,将winutils.exe复制到$HADOOP_HOME\bin目录,将hadoop.dll复制到%windir%\system32目录 (主要是防止插件报各种莫名错误,比如空对象引用啥的)。
编译hadoop-eclipse-plugin插件
1)将jar包放入eclipse文件夹
将刚刚编译好的hadoop-eclipse-plugin-2.6.0.jar复制到eclipse目录中的plugins文件夹。之后重启Eclipse,然后就可以看到如下图所示的内容:
如图中左侧红色框圈中的部分所示,如果插件安装成功,会出现DFS Locations。
2)添加Hadoop installation directory
打开Windows -> Preferens,可以看到Hadoop Map/Reduce选项,点击该选项,然后将hadoop-3.2.1文件夹添加进来。如图所示:
3)配置Map/ReduceLocations
点击Window -> Show View -> Other -> MapReduce Tools -> Map/Reduce Locations,然后点击OK。
之后点击新出现的Map/Reduce Locations选项卡,点击右侧小象按钮,如图所示:
点击后会弹出New Hadoop Location窗口。如下图所示,填写红框圈中的内容。
左侧9001那部分的内容,是与你hdfs-site.xml中的dfs.namenode.secondary.http-address中的value一致。具体该配置文件的内容见我上一篇文章。右侧9000那块的内容,是与你core-site.xml中的fs.defaultFS的value一致。
Location name 这里就是起个名字,随便起
Map/Reduce(V2) Master Host 这里就是虚拟机里hadoop master对应的IP地址,下面的端口对应 hdfs-site.xml里dfs.datanode.ipc.address属性所指定的端口
DFS Master Port: 这里的端口,对应core-site.xml里fs.defaultFS所指定的端口
最后的user name要跟虚拟机里运行hadoop的用户名一致,我是用hadoop身份安装运行hadoop2.7.2的,所以这里填写hadoop,如果你是用root安装的,相应的改成root
这些参数指定好以后,点击Finish,eclipse就知道如何去连接hadoop了,一切顺利的话,在Project Explorer面板中,就能看到hdfs里的目录和文件了
可以在文件上右击,选择删除试下,通常第一次是不成功的,会提示一堆东西,大意是权限不足之类,原因是当前的win7登录用户不是虚拟机里hadoop的运行用户,解决办法有很多,比如你可以在win7上新建一个hadoop的管理员用户,然后切换成hadoop登录win7,再使用eclipse开发,但是这样太烦,最简单的办法:
hdfs-site.xml里添加
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
然后在虚拟机里,运行hadoop dfsadmin -safemode leave
保险起见,再来一个 hadoop fs -chmod 777 /
总而言之,就是彻底把hadoop的安全检测关掉(学习阶段不需要这些,正式生产上时,不要这么干),最后重启hadoop,再到eclipse里,重复刚才的删除文件操作试下,应该可以了。
若点击小象按钮后,没弹出该窗口,则点击Window -> Show View -> Other -> General -> Error Log,打开Error Log窗口,看看里面有没有什么错误提示。如果有提示说NoClassDefFoundError的错误,则需要找到对应的jar包,然后将其放入之前编译的hadoop-eclipse-plugin-2.6.0.jar的lib目录中。打开jar包中META-INF目录中的MANIFEST.MF文件,在Bundle-ClassPath中添加该jar包的信息,如下图所示:
11.3 运行wordcount
新建一个项目,选择Map/Reduce Project
后面的Next就行了,然后放一上WodCount.java,代码如下:
package yjmyzz;
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
public class WordCount {undefined
public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {undefined
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context) throws IOException, InterruptedException {undefined
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {undefined
word.set(itr.nextToken());
context.write(word, one);
}
}
}
public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {undefined
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {undefined
int sum = 0;
for (IntWritable val : values)
sum += val.get();
result.set(sum);
context.write(key, result);
}
}
public static void main(String[] args) throws Exception {undefined
Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
if (otherArgs.length < 2) {undefined
System.err.println("Usage: wordcount <in> [<in>...] <out>");
System.exit(2);
}
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
for (int i = 0; i < otherArgs.length - 1; ++i)
FileInputFormat.addInputPath(job, new Path(otherArgs[i]));
FileOutputFormat.setOutputPath(job,
new Path(otherArgs[otherArgs.length - 1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
然后再放一个log4j.properties,内容如下:(为了方便运行起来后,查看各种输出)
log4j.rootLogger=INFO, stdout
#log4j.logger.org.springframework=INFO
#log4j.logger.org.apache.activemq=INFO
#log4j.logger.org.apache.activemq.spring=WARN
#log4j.logger.org.apache.activemq.store.journal=INFO
#log4j.logger.org.activeio.journal=INFO
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} | %-5.5p | %-16.16t | %-32.32c{1} | %-32.32C %4L | %m%n
最终的目录结构如下:
然后可以Run了,当然是不会成功的,因为没给WordCount输入参数,参考下图:
1.5 设置运行参数
因为WordCount是输入一个文件用于统计单词字,然后输出到另一个文件夹下,所以给二个参数,参考上图,在Program arguments里,输入
hdfs://172.28.20.xxx:9000/jimmy/input/README.txt
hdfs://172.28.20.xxx:9000/jimmy/output/
大家参考这个改一下(主要是把IP换成自己虚拟机里的IP),注意的是,如果input/READM.txt文件没有,请先手动上传,然后/output/ 必须是不存在的,否则程序运行到最后,发现目标目录存在,也会报错,这个弄完后,可以在适当的位置打个断点,终于可以调试了:
12 Intellij idea配置hadoop插件
Idea hadoop3 插件
https://github.com/fangyuzhong2016/HadoopIntellijPlugin
Idea hadoop3 插件
https://github.com/90duc/HadoopIntellijPlugin2.6.0
下载intellij idea 2018版(2020版不能用于编译该插件,因为该插件太老了)
https://download.jetbrains.8686c.com/idea/ideaIU-2018.3.6.exe?_ga=2.88489119.549871750.1586744220-1301379995.1579540498
下载
https://github.com/fangyuzhong2016/HadoopIntellijPlugin
HadoopIntellijPlugin-master.zip
解压
D:\hadoop spark\HadoopIntellijPlugin-master
Intellij idea导入
File -> New -> Project from Existing Sources…
Import project from external model
修改pom
<!--设置hadoop版本-->
<hadoop.2.version>3.0.3</hadoop.2.version>
<!--设置Intellij-IDEA的安装路径-->
<IntellijIde.dir>C:\ideaIU-2020.2.3.win</IntellijIde.dir>
编译
进入 terminal
mvn clean
mvn assembly:assembly
生成插件包 HadoopIntellijPlugin-1.0.zip
导入插件
Setting -> Plugins -> install plugin from disk… -> restart
左侧边栏看到Hadoop小象
使用
点击左侧边栏小象,点击+,点击+,新建hadoop连接
OK!!!
13 winutils
Hadoop winutils windows伪环境
https://github.com/cdarlint/winutils
https://github.com/steveloughran/winutils
————————————————
版权声明:本文为CSDN博主「leveretz」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/leveretz/article/details/113846202