赞
踩
why hadoop2.X?IBM上有篇论文讲的够详细了:文章链接。
最直观的改进就是是2.X多了Yarn资源管理器优化资源分配,以及新增有HA模式防止单点故障,搭建时可以用申请一年或者半年的免费云服务,当然也可以自己用虚拟机,若影用的呢是虚拟机模式的。
why hadoop3.X?个人是纯属装逼来玩玩,可以参考官方文档更新,切记!企业用的时候千万不要用最新版,为啥?举个例子,Flink更新版本!hadoop是个大家族,决定这个家族时髦程度的不是最新的一个组件版本,而是这个家族中最落后的成员支持的版本。
两种切换方式:
1、手动切换:通过命令实现主备之间的切换,可以用于HDFS升级等场合;
2、自动切换:基于Zookeeper实现;Zookeeper Failover Controller:向Zookeeper注册NameNode并监控NameNode健康状态,当NM挂掉后,ZKFC为NameNode竞争锁,获得锁的NameNode变成active。
多个Journal Node构成集群(推荐)基本原理,数据同时写入所有的JN,多数写入成功,则认为写成功;一般配置奇数个JN,JN越多,容错性越好;比如有3个JN,只要两个写成功,则数据写成功,最多允许一个JN挂掉。
四台机器的节点分布如下表,1表示该机器上应该有该服务:
NN | DN | ZK | ZKFC | JN | RM | DM | |
---|---|---|---|---|---|---|---|
node1 | 1 | 1 | 1 | 1 | |||
node2 | 1 | 1 | 1 | 1 | 1 | 1 | |
node3 | 1 | 1 | 1 | 1 | |||
node4 | 1 | 1 | 1 |
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.10 node1
192.168.1.9 node2
192.168.1.11 node3
192.168.1.12 node4
生成集群中所有node的公钥、私钥,并把所有node的公钥统一Copy在authorized_keys文件内,具体操作如下:
###################################################################### #此下面两行处代码需要在每个node上执行 cd ~ #回到主界面 ssh-keygen -t rsa -f ~/.ssh/id_rsa #输入此命令按三次回车,该目录下新生成私钥id_rsa,和公钥id_rsa.pub #此处的两行只需要在node1上执行 cd .ssh #进入.ssh folder内 cat id_rsa.pub >> authorized_keys #将公钥id_rsa.pub另存为该folder下authorized_keys文件内 ##################################################################### #分别在node2,node3,node4上把密钥追加到node1的authorized_keys ssh-copy-id -i node1 #每一台node上执行此语句,把本地主机的公钥复制到远程主机node1的authorized_keys文件上 #在node1上 cat /root/.ssh/authorized_keys #可以看到里面的内容包含了每个node的公钥 chmod 600 /root/.ssh/authorized_keys #修改该文件权限为600,细想一下是不是最合理,个人觉得是 #利用scp跨服务器把所有node的authorized_keys替换,如下 scp /root/.ssh/authorized_keys node2:/root/.ssh/ scp /root/.ssh/authorized_keys node3:/root/.ssh/ scp /root/.ssh/authorized_keys node4:/root/.ssh/ #测试连接,选任何一台机器 ssh node1 ssh node2 ssh node3 ssh node4 #可以发现都是免密认证就能登录
mkdir /usr/java #新建java的根folder cd /usr/java #切换至/usr/java folder下 wget JDK下载链接 #JDK下载链接可以自己去Oracle官网下载查询,需要注册Oracle账号,不然不让下,建议下载tar包,比较好全局掌控 tar -zxvf jdk-8u211-linux-x64.tar.gz #解压tar包 #解压后的folder文件名很长,为了方便使用可以设一个软件,类似于Windows下的快捷方式,代码如下 ln -sf /usr/java/jdk1.8.0_211/ /usr/java/jdk8 #设置软链接,直接cd /usr/java/jdk8就能切换至jdk根folder下 #配置环境变量 vim /etc/profile /* 打开环境变量文件,新增: export JAVA_HOME=/usr/java/jdk1.8.0_211 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH */ source /etc/profile #重启环境变量服务 java -version #在任意folder内输入,检查Java版本,会提示版本号,则安装成功 #每个node上来一遍上述操作,特别提醒,注意scp的妙用,这个指令在集群中很常用,要熟练掌握。
sudo groupadd -g 9000 myhadoop #添加id=9000的组myhadoop
sudo useradd myhadoop -g 9000 -u 100000 -m #新增id=100000的user myhadoop到id=9000的组内,-m表示需要创建/home目录,注意此时创建的myhadoop用户还没有密码
sudo passwd myhadoop #会跳出提示框让你修改myhadoop的密码,输完密码按回车键(密码在Linux系统是不可见的,直接按回车,不要犹豫是否自己键盘坏了没输入,一次输完后会要求你再重复输入一遍)
vi /etc/sudoers #打开sudoers文件,找到root ALL=(ALL) ALL这一行,在下面再增加一行myhadoop ALL=(ALL) ALL,然后保存退出即可
wget http://mirror.bit.edu.cn/apache/hadoop/core/hadoop-3.2.0/hadoop-3.2.0.tar.gz #下载3.2
tar -zxvf hadoop-3.2.0.tar.gz #解压3.2的tar包
ln -sf /usr/hadoop-3.2.0 /usr/hadoop-3.2.0 #创建个软链(类似快捷方式)
cd /usr/hadoop-3.2.0 #进入hadoop-3.2.0,所有配置文件在该目录下的etc目录下的hadoop目录,下面进行逐个文件的配置
hadoop2.X后所有的配置文件在 hadoop-XX.XX/etc/hadoop下,hadoop2.X后所有的配置文件在 hadoop-XX.XX/etc/hadoop下,hadoop2.X后所有的配置文件在 hadoop-XX.XX/etc/hadoop下,重要的事说三遍,参考官方网页
1)通过vi hadoop-env.sh命令修改hadoop-env.sh配置文件
#将里面的JAVA_HOME修改为自己的JAVA目录,可以在vi里面/java,搜索JAVA_HOME位子
JAVA_HOME=/usr/java/jdk1.8.0_211
2)通过vi hdfs-site.xml命令修改hdfs-site.xml配置文件,我写的注释不要配进去
<configuration> #HA模式是一个集群模式,第一步配置集群的名字,我取了若影的拼音,注意,名字中不可包含下划线,ruo_ying这样的,大家可以按需取名,一旦取名后,后面用到的集群名字全部改成此名字。 <property> <name>dfs.nameservices</name> <value>ruoying</value> </property> #配置NameNode,用到集群名字和第一步保持一致,切记nn1,nn2为NameNode的命名,非机器的hostname,可以不改。 <property> <name>dfs.ha.namenodes.ruoying</name> <value>nn1,nn2</value> </property> #配置node1和node2的rpc协议端口,rpc协议为hadoop集群内部传输数据,集群名字与第一步保持一致 <property> <name>dfs.namenode.rpc-address.ruoying.nn1</name> <value>node1:8020</value> </property> <property> <name>dfs.namenode.rpc-address.ruoying.nn2</name> <value>node2:8020</value> </property> #配置node1,node2的http协议端口,可供网页查询,集群名字与第一步保持一致 <property> <name>dfs.namenode.http-address.ruoying.nn1</name> <value>node1:50070</value> </property> <property> <name>dfs.namenode.http-address.ruoying.nn2</name> <value>node2:50070</value> </property> #配置journal node对应的机器端口,此处表示journal node安装在node2,node3,node4,对应的服务端口为8485,集群名字与第一步保持一致 <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://node2:8485;node3:8485;node4:8485/ruoying</value> </property> #配置客户端使用的类找到active的NameNove,集群名字与第一步保持一致 <property> <name>dfs.client.failover.proxy.provider.ruoying</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> #配置sshfence,把私钥文件配置进来,注意自己的私钥文件在什么目录下,名字是什么就如实写啥,根据自己的机器选择填写 <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property> #配置journal node的工作目录,随便选择,不要放在临时目录下即可,即tmp的目录,临时目录操作系统重启会丢失数据 <property> <name>dfs.journalnode.edits.dir</name> <value>/opt/JN/journal/node/local/data</value> </property> #配置HA模式下NameNode的自动切换,配置完也是可以手动切换的,放心配置 <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> </configuration>
3)通过vi core-site.xml命令修改core-site.xml配置文件,我写的注释不要配进去
<configuration> #配置hadoop的入口,注意该集群的namenode是个集群,不能写死固定ip,所以要写hdfs-site.xml里面的集群名 <property> <name>fs.defaultFS</name> <value>hdfs://ruoying</value> </property> #配置zookeeper所在的节点和端口 <property> <name>ha.zookeeper.quorum</name> <value>node1:2181,node2:2181,node3:2181</value> </property> #配置工作目录,默认的在临时目录,最好改成实体目录,避免系统重启清空了数据 <property> <name>hadoop.tmp.dir</name> <value>/opt/hadoop3</value> </property> #配置hdfs文件系统的回收站,1440为时长保留1440分钟,当hdfs 删除文件时,会暂时保存在回收站,可以用mv指令回收。 <property> <name>fs.trash.interval</name> <value>1440</value> </property>
4)配置yarn-site.xml,千万注意yarn.resourcemanager.ha.id属性,node1的值为rm1,node2的值为rm2,其他阶段非namenode不需要该属性
<configuration> <!-- Site specific YARN configuration properties --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <property> <name>yarn.resourcemanager.cluster-id</name> <value>rmcluster</value> </property> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>node1</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>node2</value> </property> <property> <name>yarn.resourcemanager.zk-address</name> <value>node1:2181,node2:2181,node3:2181</value> </property> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <property> <name>yarn.resourcemanager.ha.id</name> <value>rm1</value> </property> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> </configuration>
5)配置mapreduce-site.xml文件,hadoop不带该文件,可以利用cp mapred-site.xml.template mapred-site.xml 生成,具体配置如下:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
6)安装,配置zookeeper集群
wget http://39.137.36.61:6310/mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz #下载zookeeper tar -zxvf zookeeper-3.4.14.tar.gz #解压zookeeper ln -sf /usr/zookeeper-3.4.14 /usr/zk #设置软链 cd /usr/zk/conf #zookeeper的配置文件在该目录下 cp zoo_sample.cfg zoo.cfg #以zoo_sample.cfg为源文件复制一份zoo.cfg文件作为配置文件 vi zoo.cfg,操作如下: 1.修改该文件下的 dataDir=/opt/zookeeper #一样的原理,默认在tmp下容易丢失数据 2.然后在最后加上三行,server.x,x为数字,对应所在node上/opt/zookeeper/myid这个文件下的数字,保存退出 server.1=node1:2888:3888 server.2=node2:2888:3888 server.3=node3:2888:3888 3.mkdir /opt/zookeeper #在node1,node2,node3新建/opt/zookeeper目录为工作目录 4.vi myid #node1的 /opt/zookeeper上新建文件myid,在里面写1,然后退出保存 5.scp -r /opt/zookeeper root@node2:/opt/zookeeper scp -r /opt/zookeeper root@node3:/opt/zookeeper #把/opt/zookeeper目录全部跨服务器复制到node2,和node3,注意,node2和node3上该目录下的myid文件内容需要改成2和3 6.scp -r zookeeper-3.4.14/ root@node2:/usr/ scp -r zookeeper-3.4.14/ root@node3:/usr/ #利用scp把zookeeper的配置文件跨服务器cp到node2和node3,并用ln -sf /usr/zookeeper-3.4.14/ /usr/zk创建软链 7.配置zookeeper的环境变量,vi /etc/profile 新加一条 export PATH=$PATH:/usr/zookeeper-3.4.14/bin source /etc/profile #刷新环境变量 8.关闭防火墙, sudo systemctl status firewalld #查看防火墙状态 sudo systemctl stop firewalld #关闭防火墙 sudo systemctl startfirewalld #开启防火墙 9.启动zookeeper,在/usr/zk/bin目录下有zkServer的所有命令。 zkServer.sh start
如下图,输入jps出现QuorumPeerMain端口,就说明zookeeper成功启动,node1.node2,node3分别启动zk,主要出现的问题排查
1.ZK版本,最好不要用最新的,用次新的较为可靠,目前tar包体积在36M左右,所以体积太大或者太小,就可能存在一定的坑。
2.zoo.cfg配置,是否node1,node2,node3的hostname是否对,也可以用ip
3.myid文件和里面的内容是否对。
5)vi slaves配置datanaode,注意,hadoop3.X叫workers,只是改了个名字
#里面直接写如下,然后退出保存
node2
node3
node4
6)以上hdfs就配置完成了,把配置好的hadoop scp到其他3台机器
scp -r /usr/hadoop-3.2.0 root@node2:/usr/
scp -r /usr/hadoop-3.2.0 root@node3:/usr/
scp -r /usr/hadoop-3.2.0 root@node4:/usr/
7)启动hadoop
1. cd /usr/hadoop-3.2.0/sbin #先进入sbin目录启动journalnode ./hadoop-daemon.sh start journalnode #在node2,node3,node4上分别执行,启动journalnode,jps查看是否启动成功 2. cd /usr/hadoop-3.2.0/bin #在其中一个namenode切换到bin目录下 ./hdfs namenode -format #初始化其中一个namenode,初始化完以后,会在/opt/hadoop3下生成/dfs/name/current/* 这些信息 3. cd /usr/hadoop-3.2.0/sbin #在初始化的namenode上切换到sbin ./hadoop-daemon.sh start namenode #启动一个namenode ,jps查看是否启动 #如果启动有问题,可 cd ../logs tail -n50 hadoop-root-namenode-node1.log #查看最后50行日志看有什么异常 4. #同步另一个namenode的元数据,在另一台namenode上操作 cd /usr/hadoop-3.2.0/bin #切换到bin目录 ./hdfs namenode -bootstrapStandby #同步元数据 #一样的,错误的话切换到 cd ..logs tail -n50 hadoop-root-namenode-node2.log #查看日子报错 会在/opt/hadoop3下生成/dfs/name/current/* 这些信息 5.初始化zookeeper,在其中一个namenode中执行 cd /usr/hadoop-3.2.0/bin ./hdfs zkfc -formatZK 6.hadoop3.X新特性,需要在/usr/hadoop-3.2/sbin目录下,分别vi start-dfs.sh,stop-dfs.sh,start-yarn.sh,stop-yarn.sh内,新增: HDFS_DATANODE_USER=root HDFS_JOURNALNODE_USER=root HDFS_ZKFC_USER=root HADOOP_SECURE_DN_USER=hdfs HDFS_NAMENODE_USER=root HDFS_SECONDARYNAMENODE_USER=root YARN_NODEMANAGER_USER=root YARN_RESOURCEMANAGER_USER=root 缺一个就会在启动的时候报错,如缺少YARN_NODEMANAGER_USER,启动时报错如下: ERROR: Attempting to operate on yarn nodemanager as root ERROR: but there is no YARN_NODEMANAGER_USER defined. Aborting operation. 7.为了方便可以配置hadoop的两个环境变量 vi /etc/profile 新增 export PATH=$PATH:/usr/hadoop-3.2.0/bin:/usr/hadoop-3.2.0/sbin wq!保存退出后 source /etc/profile 8.重新启动dfs服务 先stop所有hadoop服务,在启动hdfs 因为配置了环境变量,所以可以在任意地方执行如下命令,如果没有环境变量,则在你安装的hadoop目录下的sbin目录下 cd /usr/hadoop-3.2.0/sbin 里面的启动命令如下 -rwxrwxr-x 1 hadoop supergroup 2752 Sep 10 2018 distribute-exclude.sh -rwxrwxr-x 1 hadoop supergroup 6509 Oct 3 2019 hadoop-daemon.sh -rwxrwxr-x 1 hadoop supergroup 1360 Sep 10 2018 hadoop-daemons.sh -rwxrwxr-x 1 hadoop supergroup 1427 Sep 10 2018 hdfs-config.sh -rwxrwxr-x 1 hadoop supergroup 2339 Sep 10 2018 httpfs.sh -rwxrwxr-x 1 hadoop supergroup 3763 Sep 10 2018 kms.sh -rwxrwxr-x 1 hadoop supergroup 4134 Sep 10 2018 mr-jobhistory-daemon.sh -rwxrwxr-x 1 hadoop supergroup 1648 Sep 10 2018 refresh-namenodes.sh -rwxrwxr-x 1 hadoop supergroup 2145 Sep 10 2018 slaves.sh -rwxrwxr-x 1 hadoop supergroup 1471 Sep 10 2018 start-all.sh -rwxrwxr-x 1 hadoop supergroup 1128 Sep 10 2018 start-balancer.sh -rwxrwxr-x 1 hadoop supergroup 3734 Sep 10 2018 start-dfs.sh -rwxrwxr-x 1 hadoop supergroup 1357 Sep 10 2018 start-secure-dns.sh -rwxrwxr-x 1 hadoop supergroup 1347 Sep 10 2018 start-yarn.sh -rwxrwxr-x 1 hadoop supergroup 1462 Sep 10 2018 stop-all.sh -rwxrwxr-x 1 hadoop supergroup 1179 Sep 10 2018 stop-balancer.sh -rwxrwxr-x 1 hadoop supergroup 3206 Sep 10 2018 stop-dfs.sh -rwxrwxr-x 1 hadoop supergroup 1340 Sep 10 2018 stop-secure-dns.sh -rwxrwxr-x 1 hadoop supergroup 1340 Sep 10 2018 stop-yarn.sh -rwxrwxr-x 1 hadoop supergroup 4331 Oct 3 2019 yarn-daemon.sh -rwxrwxr-x 1 hadoop supergroup 1353 Sep 10 2018 yarn-daemons.sh #先起存储节点,既hdfs节点 ./stop-all.sh&&./start-dfs.sh #存储节点查看输出日志,利用以上命令,包含启动journalnode(配置几个起几个),namenode(配置两个,一个active,一个standby,当然要先启动zookeeper才会有一个active,否则两个都是standby),datanode(配置几个起几个)、zkfc(在namenode的机器上跟着,用于选举) #再启计算节点,hadoop2.0后,默认的计算节点就是yarn的resourcemanager和nodemanager咯,命令如下; ./stop-yarn.sh && ./start-yarn.sh #会启动resourcemanager和nodemanager,这个根据你yarn-site.xml配置的对应节点有关 //题外话 //1.此目录下不是有个stop-all.sh和start-all.sh吗?可以用吗,可以用,但是原则上不提倡,一般正经人都不用,容易造成各种问题不好排查; //2.以后你的hadoop正常运行的时候,个别守护进程坏死,但是整个集群 没挂的情况下,请单独启动个别守护进程,不能一把抓全部重启; //如有一个namenode挂了,因为高可用,集群的另一个namenode在工作,集群并没挂,那么你不能重启集群,只需要直接启动namenode即可,主要只要在该台节点下,命令如下; cd /usr/hadoop-3.2.0/sbin #在初始化的namenode上切换到sbin ./hadoop-daemon.sh start namenode #启动一个namenode ,jps查看是否启动 #同理启动其他单独守护进程一样的道理,只要在该台节点下 ./hadoop-daemon.sh start datanode #单独启动某一个节点的datanode ./hadoop-daemon.sh start journalnode #单独启动某一个节点的journalnode ./yarn-daemon.sh start nodemanager #单独启动该台机器的nodemanager ./yarn-daemon.sh start resourcemanager #单独启动该台机器的resourcemanager
自此,整个单纯的Hdfs3.X+HA配置完成
各台机器上得到的jps如下:
node1:
node2:
node3:
node4:
可以看到和我们的原始表格完全符合,在任意一台node1上访问https://node1:50070
可以通过网页版监管集群;
附上hadoop通用默认端口,当然,如果自己在配置的时候做过更改,还是要按照自己配置的来;
端口 | 作用 |
---|---|
9000 | fs.defaultFS,如:hdfs://172.25.40.171:9000 |
9001 | dfs.namenode.rpc-address,DataNode会连接这个端口 |
50070 | dfs.namenode.http-address |
50470 | dfs.namenode.https-address |
50100 | dfs.namenode.backup.address |
50105 | dfs.namenode.backup.http-address |
50090 | dfs.namenode.secondary.http-address,如:172.25.39.166:50090 |
50091 | dfs.namenode.secondary.https-address,如:172.25.39.166:50091 |
50020 | dfs.datanode.ipc.address |
50075 | dfs.datanode.http.address |
50475 | dfs.datanode.https.address |
50010 | dfs.datanode.address,DataNode的数据传输端口 |
8480 | dfs.journalnode.rpc-address |
8481 | dfs.journalnode.https-address |
8032 | yarn.resourcemanager.address |
8088 | yarn.resourcemanager.webapp.address,YARN的http端口 |
8090 | yarn.resourcemanager.webapp.https.address |
8030 | yarn.resourcemanager.scheduler.address |
8031 | yarn.resourcemanager.resource-tracker.address |
8033 | yarn.resourcemanager.admin.address |
8042 | yarn.nodemanager.webapp.address |
8040 | yarn.nodemanager.localizer.address |
8188 | yarn.timeline-service.webapp.address |
10020 | mapreduce.jobhistory.address |
19888 | mapreduce.jobhistory.webapp.address |
2888 | ZooKeeper,如果是Leader,用来监听Follower的连接 |
3888 | ZooKeeper,用于Leader选举 |
2181 | ZooKeeper,用来监听客户端的连接 |
60010 | hbase.master.info.port,HMaster的http端口 |
60000 | hbase.master.port,HMaster的RPC端口 |
60030 | hbase.regionserver.info.port,HRegionServer的http端口 |
60020 | hbase.regionserver.port,HRegionServer的RPC端口 |
8080 | hbase.rest.port,HBase REST server的端口 |
10000 | hive.server2.thrift.port |
9083 | hive.metastore.uris |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。