任务详情:
参考资料: Google三大论文
【环境搭建视频】链接:https://pan.baidu.com/s/1TmvPBBMkLah-e_H-UHjuxA 提取码:iagg
集群规划1-省机器:
集群规划2-清晰:
按照集群规划1进行。
1.1 修改hostname
上一次我们搭建了三个虚拟机,我的三个虚拟机的hostname分别为CP1、CP2、CP5,为了连贯性,我把CP5改成CP3。命令hostname可以查看当前主机名,hostname CP3可以将主机名修改为CP3。如图所示:
对应的命令是:
//编辑文件
vim /etc/sysconfig/network
//修改主机名是CP3,(注意hostname的大小写)
hostname CP3
//命令行下修改hostname
hostname CP3
此时查看hostname就会变成CP3:
1.2 建立hostname和ip的映射关系
这一步是为了部署集群方便。在CP1上修改etc/hosts文件:
//编辑hosts文件
vim /etc/hosts
//建立ip和host的映射关系
192.168.1.12 CP1
192.168.1.11 CP2
192.168.1.14 CP3
emmm,忽略我的ip地址的不连贯吧。
同理在CP2、CP3上重复上述过程,文件内容完全一样。
1.3 关闭防火墙
在hadoop集群中会经常发生 机器和机器之间的交互,为了避免因为防火墙产生的意外故障,因此我们需要将防火墙关闭,过程如下:
# 关闭防火墙
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
firewall-cmd --state ##查看防火墙状态,是否是running
状态从running变成了not running。
1.4 配置集群SSH免密码登录
首先要在三台机器上配置对本机的ssh免密码登录,然后是配置三台机器之间的ssh免密码登录。
对于CP1、CP2和CP3,都执行如下操作(配置对本机的ssh免密码登录):
//创建密钥,一直点确定到结束,默认将公钥放在/root/.ssh目录下
ssh-keygen -t rsa
//将公钥复制为authorized_keys文件,此时使用ssh连接本机就不需要输入密码了
cd /root/.ssh/
cp id_rsa.pub authorized_keys
然后就可以通过ssh连接了:
然后配置三台机器之间的ssh免密码登录,针对CP1,执行如下命令:
//将本机公钥拷贝到指定机器的authorized_keys文件中
ssh-copy-id -i CP2
根据提示依次输入yes和CP2的登录密码即可。然后可以尝试ssh CP2,ssh登录机器CP2:
对CP3也执行上述操作。同样地,CP2、CP3也要执行上述类似操作。
1.5 hadoop的集群部署
首先要把本地的hadoop压缩包上传到虚拟机,我们上传到usr/local文件夹下,因此执行下列命令:
cd /usr/local
rz
rz是工具包lrzsz上传文件到虚拟机的命令,将hadoop文件上传过去。
sz:将选定的文件发送(send)到本地机器
rz:运行该命令会弹出一个文件选择窗口,从本地选择文件上传到服务器(receive)
然后解压缩文件,并重命名:
//解压hadoop
tar -zxvf hadoop-2.7.3.tar.gz
//将压缩包删掉(可选)
rm -rf hadoop-2.7.3.tar.gz
//改名为hadoop
mv hadoop-2.7.3 hadoop
首先,确认一下hadoop下有bin和sbin目录:
(注意,下方的环境变量请配置在~/.bashrc里!!!不然可能会出现我遇到的问题)
配置hadoop相关环境变量:
vi /etc/profile //改成 vi ~/.bashrc
原来的内容是这样的:
export JAVA_HOME=/usr/local/java/jdk1.8.0_131
export CLASSPATH=$JAVA_HOME/lib/
export PATH=$PATH:$JAVA_HOME/bin
修改后的内容是这样的:
export JAVA_HOME=/usr/local/java/jdk1.8.0_131
export HADOOP_HOME=/usr/local/hadoop
export CLASSPATH=$JAVA_HOME/lib/
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
执行命令使之生效:
source /etc/profile //改成source ~/.bashrc
分别输入下列命令检查看看java和hadoop有没有问题:
创建/usr/local/data目录:
cd /usr/local
mkdir data
接下来修改hadoop的配置。首先是core-site.xml,在目录hadoop/etc/hadoop下:
cd hadoop/etc/hadoop
vi core-site.xml
core-site.xml(文件末尾)的修改内容如下:
然后是hdfs-site.xml的修改内容:
因为我们的主节点是1个,从节点2个,这里的副本也就设置成2个比较合适。
修改mapred-site.xml。发现目录下只有一个叫mapred-site.xml.template的文件,将其重命名:
mv mapred-site.xml.template mapred-site.xml
然后修改,mapred-site.xml的修改内容:
修改配置文件yarn-site.xml的内容:
设置从节点的位置
//编辑slaves文件
vi slaves
//slaves的内容为(删除默认的localhost):
CP2
CP3
上述操作都是针对CP1的,我们要把CP1的hadoop安装包和配置文件都拷贝过去,然后source配置文件,使其生效,并且在CP2和CP3下的/usr/local目录下建立data目录。
首先cd到local目录下,该目录下有hadoop目录和data目录。
然后以递归的方式将hadoop文件拷贝到CP2的/usr/local目录下:
scp -r hadoop root@CP2:/usr/local
可以把配置文件~/.bashrc也拷贝过去,我选择自己修改。然后在CP2中创建/usr/local/目录下的data目录。
对CP3重复上述拷贝、修改配置文件、使配置生效、创建data目录操作。
接下来格式化NameNode
并启动集群
//在CP1上格式化集群
hdfs namenode -format
//在CP1上启动集群
start-dfs.sh
然后出错了:
网上查了一下,说是还要配置hadoop-env.sh文件的jAVA_HOME,因为hadoop找不到Java。。。明明/etc/profile都已经配置好了的。。。(可能配置~/.bashrc就不会出这个错)
没办法,cd到目录/usr/local/hadoop/etc/hadoop下,修改hadoop-env.sh,把java_home参数改成绝对路径:
cd /usr/local/hadoop/etc/hadoop
vi hadoop-env.sh// 修改内容
export JAVA_HOME=/usr/local/java/jdk1.8.0_131
同样地,对CP2、CP3执行相同操作。
再次执行命令start-dfs.sh。
如果出现“namenode running as process XXX stop it first”这样的错误,可以先stop-dfs.sh,再start-dfs.sh。(start-all.sh可以看到更多)
可以用jps命令查看启动的情况:
如果用start-all.sh,再输入jps:
可以在浏览器网址栏输入:虚拟机ip地址:50070,比如我的是:
192.168.1.12:50070
视频教程里说主机名:50070可以打开,但我的一直打不开。
如果上述网址也打不开,可以尝试下列方法:
vi /etc/selinux/config
//修改
SELINUX=disabled
查看一些信息:
可以在Utilities-browse the file system查看自己的文件系统,可以看到现在什么都没有:
可以尝试上传一个文件。在虚拟机vi hello.txt,写入内容,然后执行:
hdfs dfs -put hello.txt /hello.txt
上传文件。
然后再看上述界面:
就有了文件。
下面来启动yarn集群。
start-yarn.sh
//查看yarn集群启动情况
jps
//在web上查看的网址是http://192.168.1.12:8088
1.6貌似不在任务要求里???。。。偏偏这块花了挺长时间的....
1.6 安装hive
同样地,通过在xshell输入rz命令将hive压缩文件上传到虚拟机的/usr/local文件夹下,然后解压缩,重命名,修改环境变量:
//解压缩
tar -zxvf apache-hive-2.1.1-bin.tar.gz
//重命名
mv apache-hive-2.1.1-bin hive
//修改环境变量
vi ~/.bashrc
修改后的~/.bashrc:
export JAVA_HOME=/usr/local/java/jdk1.8.0_131
export HIVE_HOME=/usr/local/hive
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$JAVA_HOME/bin:$HIVE_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
让配置文件生效:
source ~/.bashrc
下面来安装mysql
yum install -y mysql-server
执行上述命令后出现“No package mysql-server available”错误,原因是CentOS7带有MariaDB而不是MySQL,MariaDB和MySQL一样也是开元的数据库,可以使用yum -y install mariadb-server mariadb命令安装。
如果必须要安装MySQL,首先必须添加mysql社区repo通过输入命令:
sudo rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
最后使用像安装MySQL的常规方法一样安装mysql:
yum install mysql mysql-server mysql-libs mysql-server
安装过程中,出现“No more mirrors to try”错误,执行下列命令:
yum clean all
yum makecache
再重新安装。这个移动的网速真的太渣了!
从下午5点到凌晨1点,除去中间吃饭洗澡的时间,大概花了6个小时,就做了这么一点。。。
安装完成之后,启动mysql服务:
service mysqld start
配置进程随着机器启动:
chkconfig mysqld on
安装mysql-connector-java驱动包
yum install -y mysql-connector-java
将mysql connector拷贝到hive的lib包中,这样hive才能用mysql驱动包来连接mysql数据库,作为它的元数据库(可以到/usr/share/java目录下查看文件名)
cp /usr/share/java/mysql-connector-java.jar /usr/local/hive/lib
在mysql上创建hive元数据库,创建hive账号并进行授权。先输入mysql进入mysql,再输入下列命令:
create database if not exists hive_metadata;
grant all privileges on hive_metadata.* to 'hive'@'%' identified by 'hive';
grant all privileges on hive_metadata.* to 'hive'@'localhost' identified by 'hive';
grant all privileges on hive_metadata.* to 'hive'@'CP1' identified by 'hive';
flush privileges;
use hive_metadata;
输入exit退出mysql。
配置hive-site.xml:
首先进入/usr/local/hive/conf目录,重命名文件:
mv hive-default.xml.template hive-site.xml
修改配置文件hive-site.xml的内容。由于文件内容太多,我们将其上传到本地机器,用文本编辑器打开进行编辑:
sz hive-site.xml
会弹出一个文本框,选择一个保存位置即可。
然后修改:
可以使用查找功能,找到上面的name中的内容,修改value的值。
然后用rz命令上传修改后的文件到虚拟机(注意要先删除虚拟机上的文件rm -rf,否则无法上传成功)。
配置其它文件:
//重命名
mv hive-env.sh.template hive-env.sh
//修改hive-config.sh
vi /usr/local/hive/bin/hive-config.sh
//添加内容
export JAVA_HOME=/usr/local/java/jdk1.8.0_131
export HIVE_HOME=/usr/local/hive
export HADOOP_HOME=/usr/local/hadoop
测试 hive是否安装成功
第一个错误是因为上述jar包有重复绑定Logger类,删除较旧版本即可。
rm -rf /usr/local/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar
第二个错误是因为没有正常启动Hive 的 Metastore Server服务进程。 执行如下命令:
hive --service metastore &
然后又出错:
修改conf/hive-site.xml 中的 “hive.metastore.schema.verification” 值为 false:
但是还有错:
需要 使用 schematool工具初始化hive的 元素,执行:
schematool -initSchema -dbType mysql
居然还有错:
执行下列步骤:
mkdir tmpdir
将conf/hive-site.xml中的所有的"${system:java.io.tmpdir}"修改为"/usr/local/hive/tmpdir/"。
终于!!!
我们可以尝试一下导入txt文件到hive表。
先退出hive(exit;),在/usr/local目录下新建users.txt,内容如下:
然后在hive里依次输入:
create table users(id int, name string);
load data local inpath '/usr/local/users.txt' into table users;
select name from users;
emmm,不知道为什么,这个问题先留着吧,反正是hive语法的问题,应该不是环境部署的问题。
1.7 安装zookeeper
用rz命令将压缩包上传到虚拟机的/usr/local目录下,然后:
tar -zxvf zookeeper-3.4.10.tar.gz
rm -rf zookeeper-3.4.10.tar.gz
mv zookeeper-3.4.10 zk
//修改配置文件
vi ~/.bashrc
//修改后的内容
export JAVA_HOME=/usr/local/java/jdk1.8.0_131
export HIVE_HOME=/usr/local/hive
export HADOOP_HOME=/usr/local/hadoop
export ZOOKEEPER_HOME=/usr/local/zk
export PATH=$PATH:$JAVA_HOME/bin:$HIVE_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin
//使配置生效
source ~/.bashrc
配置zoo.cfg
cd zk/conf
mv zoo_sample.cfg zoo.cfg
vi zoo.cfg
//修改内容
dataDir=/usr/local/zk/data
//新增,需要3个结点以上,而且是奇数
server.0=CP1:2888:3888
server.1=CP2:2888:3888
server.2=CP3:2888:3888
然后设置zk节点标识
//进入zk目录
cd ..
mkdir data
cd data
vi myid
//myid的内容
0
搭建zk集群,在另外两个节点上按照上述步骤配置ZooKeeper,使用scp将zk和.bashrc拷贝到CP2和CP3上即可。
唯一的区别是CP2和CP3上的标识号分别设置为1和2。
//进入local
cd ..
scp -r zk root@CP2:/usr/local
scp ~/.bashrc root@CP2:~/
拷贝之后,去CP2检查一下有没有拷贝成功,并且source配置文件,将myid的内容改成1
针对CP3重复上述拷贝、检查、source、修改myid为2的操作。
启动ZooKeeper集群
分别在三台机器上执行:zkServer.sh start
检查ZooKeeper状态:zkServer.sh status
然后用jps在三个机器上看看三个节点是否都有QuorumPeerMain进程:
第一部分所有环境搭建的参考资料:
https://blog.csdn.net/zxz547388910/article/details/86468925
https://blog.csdn.net/LoveCarpenter/article/details/78808135
CentOS 7 打开关闭FirewallD防火墙端口命令
https://blog.csdn.net/gongchenupc/article/details/68066990
Hive环境搭建
https://www.cnblogs.com/aspirant/p/6616575.html
看这篇文章吧,写的很好,由于知识储备量不够,暂时无法以自己的语言解释。。。:
https://blog.csdn.net/w1573007/article/details/52966742
Hadoop是一个开源框架,可编写和运行分布式应用处理大规模数据。 Hadoop框架的核心是HDFS和MapReduce。其中 HDFS 是分布式文件系统,MapReduce 是分布式数据处理模型和执行环境。
随着数据的来源途径越来越多,数据的格式也越来越复杂,数据量越来越大,传统的数据库已经很难满足需求,Hadoop就是为了解决这个问题而诞生的。其底层的分布式文件系统具有高拓展性,通过数据冗余保证数据不丢失和提交计算效率,同时可以存储各种格式的数据。同时其还支持多种计算框架,既可以进行离线计算也可以进行在线实时计算。
Hadoop有三种运行模式:单机模式、伪分布式模式、完全分布式模式。
单机模式
伪分布式模式
完全分布式模式
三种模式的集群必须配置信息:
Hadoop的基础组件
Hadoop1.0的核心由HDFS(Hadoop Distributed File System)和MapReduce(分布式计算框架)构成。而在Hadoop2.0中增加了Yarn(Yet Another Resource Negotiator),来负责集群资源的统一管理和调度。
参考资料:
https://www.zybuluo.com/Cesar/note/239412
https://blog.csdn.net/u010270403/article/details/51493191
https://blog.csdn.net/u013063153/article/details/53115216
https://blog.csdn.net/qq_26442553/article/details/78710170
源码可以在官网下载,我就直接在网上找了相关的文章看啦,参考下方的资料,讲的很详细了。
以文件上传为例,其执行过程是这样的:
下面针对这个执行过程来分析源码。
1.FileSystem初始化,Client拿到NameNodeRpcServer代理对象,建立与NameNode的RPC通信(详情见参考文献第一篇)
2.调用FileSystem的create()方法,由于实现类为DistributedFileSystem,所以是调用该类中的create()方法
HDFSDemo.java
OutputStream os = fs.create(new Path("/test.log"));
这里调用了FileSystem的create()方法,由于FileSystem是一个抽象类,这里实际上是调用的是该类的子类create()方法
//FileSystem.javapublic abstract FSDataOutputStream create(Path f,FsPermission permission,boolean overwrite,int bufferSize,short replication,long blockSize,Progressable progress) throws IOException;
FileSystem.get()返回的是DistributedFileSystem对象,所以这里我们直接进入DistributedFileSystem
//DistributedFileSystem.java@Overridepublic FSDataOutputStream create(final Path f, final FsPermission permission,final EnumSet
3.DistributedFileSystem持有DFSClient的引用,继续调用DFSClient中的create()方法
DFSClient的create()返回一个DFSOutputStream对象
//DFSClient.javapublic DFSOutputStream create(String src,FsPermission permission,EnumSet
4.DFSOutputStream提供的静态newStreamForCreate()方法中调用NameNodeRpcServer服务端的create()并创建DFSOutputStream输出流对象返回
newStreamForCreate()中的业务逻辑:
//DFSOutputStream.javastatic DFSOutputStream newStreamForCreate(DFSClient dfsClient, String src,FsPermission masked, EnumSet
到此,Client拿到了服务端的输出流对象,那么后面就容易了,都是一些简单的文件输出,输入流的操作(hadoop提供的IOUitl)。
参考 资料:
Hadoop之HDFS原理及文件上传下载源码分析(上)
Hadoop之HDFS原理及文件上传下载源码分析(下)
RPC,即Remote Procdure Call,中文名:远程过程调用;
(1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网络通信细节,对我们来说是透明的。因此,它经常用于分布式网络通信中。
RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
(2)Hadoop的进程间交互都是通过RPC来进行的,比如Namenode与Datanode之间,Jobtracker与Tasktracker之间等。
详细的内容可以看下面两篇文章:
https://www.cnblogs.com/nucdy/p/5655811.html
https://www.cnblogs.com/edisonchou/p/4285817.html
另起了一篇文章:MapReduce任务—WordCount(Python-Hadoop Streaming)实例
参考资料:
https://zhuanlan.zhihu.com/p/45305945
https://blog.csdn.net/u013087513/article/details/77771600
Yarn是Hadoop集群的资源管理系统。Yarn可以提高资源的利用率。Yarn的另一个目标就是拓展Hadoop,使得它不仅仅可以支持MapReduce计算,还能很方便的管理诸如Hive、Hbase、Pig、Spark/Shark等应用。这种新的架构设计能够使得各种类型的应用运行在Hadoop上面,并通过Yarn从系统层面进行统一的管理,也就是说,有了Yarn,各种应用就可以互不干扰的运行在同一个Hadoop系统中,共享整个集群资源
参考资料:
https://blog.csdn.net/suifeng3051/article/details/49486927
https://www.zhihu.com/question/34016617
附:HDFS的常用命令:
HDFS常用Shell命令和基础开发