(转)hadoop3.2.1安装(vm版)

内容非常全,挺好。下面是链接:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值