之前自己尝试搭建hadoop,在word上面作了笔记,不过在公司电脑里,想看的时候会不太方便,所以把笔记放到这里来,记录一下自己所学的知识
hadoop集群搭建
1、建立虚拟机
注意:以下操作在master上操作,同时在另外两台机上一样的操作
这里建立了3台虚拟机:master、slave1、slave2,一个主节点,两个从节点
建立的3台虚拟机的网关ip要一样,ip地址修改按顺序(在虚拟机编辑器中可以查看nat模式查看网关ip和子掩码)
(1)查看主机ip地址:ifconfig
(2)修改网络配置文件,将BOOTPROTO值修改为”static”
输入命令:
[root@master ~] vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE(网卡名称)=eth0
ONBOOT=yes #(开启网卡)
BOOTPROTO=static/none #(表示静态,dhcp表示动态)
#(静态必须有以下几项,动态不必填写)
IPADDR=192.168.189.16 #(ip地址)
NETMASK=255.255.255.0 #(子网掩码)
GATEWAY=192.168.189.2 #(网关)
HWADDR #(网卡的物理地址)自动生成可不写
(3)重启网络服务:service network restart
(4)更改主机名称:vim / etc/sysconfig/network (重启后永久生效)
2、建立主机和各ip的映射
输入命令:vim /etc/hosts 修改如下内容:ip地址 主机名
另外两台同样操作,再互相ping看看是否ping通(例如:ping slave1)
3、配置ssh免密码登录
注意:以下操作命令都在master主机上进行操作
(1)在root用户下输入命令:ssh-keygen -t rsa 一路回车
[root@master ~] cd ~/.ssh #进入到~/.ssh目录
(2)秘钥生成后在~/.ssh目录下,有两个文件id_rsa(私钥)和id_rsa.pub(公钥),将公钥复制到authorized_keys并赋予authorized_keys 600权限
[root@master ~] cat ~/.ssh/id_rsa.pub >> /.ssh/authorized_keys
[root@master ~] chmod 600 /.ssh/authorized_keys
(3)同理在另外两台机上面同样的操作,然后将两台机上面的公钥复制到master节点上的authorized_keys中,下图为复制过去的结果
(4)将master节点上的authorized_keys远程输送到slave1和slave2的~/.ssh目录下
输入命令:scp ~/.ssh/authorized_keys root@slave1:~/.ssh
(5)检查是否免密登录
在master上输入命令:ssh slave1
在slave1上输入命令:ssh slave2
4、关闭防火墙
在master上输入命令:
chkconfig --list | grep iptables
vim /etc/selinux/config 修改SELINUX=disabled
5、安装JDK
注意:所有节点都要安装Java并配置java环境变量
(1)下载好jdk的安装包(这里下载的是jdk1.8.0-161.gz.tar),拖入linux中,在xshell中用rz命令进行上传:
在xsell工具中如果没有rz、sz命令需要安装服务:
安装服务:yum -y install lrzsz
上传:rz
下载:sz
(2)解压压缩包:tar -xzvf jdk1.8.0-161.tar.gz 压缩在/usr/java/目录下
(3)在/etc/profile文件中添加jdk的路径,配置环境jdk环境(根据自己的文件路径)
export JAVA_HOME =/usr/java/ jdk1.8.0-161 (jdk的文件目录路径)
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.java: $ JAVA_HOME/lib/tools.jar
export PATH=$ JAVA_HOME/bin:$PATH
(4)使配置文件立即生效,输入命令:source /etc/profile
检查是否安装成功:java –version (出现版本信息则安装成功)
6、安装mysql(在主节点上安装)
(1)查询系统已经安装的mysql
输入命令:rmp -qa | grep mysql
(2)彻底删除卸载mysql及其所有依赖的包
输入命令:rmp –e --nodeps mysql–libs…(这里为系统安装的mysql,前面查询的时候有)
(3)解压mysql(自己下载的,这里下载的是mysql-5.6.45-linux-glibc2.12-x86-64.tar.gz),将解压的文件改名为mysql,放在目录/usr/local/下
(4)创建mysql用户
a.先检查是否存在mysql组下面的mysql用户:groups mysql
b.没有则创建,有则跳过:useradd -r mysql
c.然后检查是否创建成功:groups mysql
(5)在mysql文件夹目录data下创建一个文件夹mysql,用以保存mysql数据,将属组改为mysql:chown -R mysql:mysql mysql
(6)初始化数据库
进入到mysql/scripts目录,输入命令:
./mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/ussr/local/mysql/data
这里如果报错,解决方法如下:
a.先安装perl:yum install –y perl perl-devel autoconf
b.再出错,安装libaio:yum install -y libaio
安装后再执行初始化
(7)修改配置文件
a.将mysql/support-files/目录下的my-default.cnf 复制带/etc/my.cnf
b.将mysql/support-files/目录下的mysql.server复制到/etc/init.d/mysqld,然后授予执行权限(755)
c.重新编辑mysqld文件,设置两个值
输入命令:vim /etc/init.d/mysqld
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
(8)配置环境变量,目的是在任意地方都可以执行mysql命令
原:export PATH=$JAVA_HOME/bin:$PATH
修改为:export PATH=$JAVA_HOME/bin:/usr/local/mysql/bin:$PATH
(source一下配置文件立即生效)
(9)启动mysql
service mysql start 启动
service mysql stop 停止
service mysql status 查看状态
(10)进入/usr/local/mysql/bin目录,修改root密码为App12345(登录mysql的密码)
输入命令:./mysqladmin -u root -password ‘App12345’
进入mysql:mysql -uroot -p (之后输入密码)
注:此时如果出现-bash:mysql:command not found
原因:由于系统默认会查找/usr/bin下的命令,如果命令不在该目录下就会找不到命令,此时需要映射一个链接到/usr/bin目录下,首先得知道mysql命令或者是mysqladmin命令的完整路径:/usr/local/mysql/bin/mysql
输入命令:ln -s /usr/local/mysql/bin/mysql /usr/bin
(11)设置允许外界访问,清楚空数据
进入msyql页面:
>use mysql;
>select host,user from user;
>delete from user where user=’ ‘;
>update user set host=’%’ where user=’root’ and host=’localhost’; #(设置host为%,允许所以主机访问该数据库)
>select host,user from user;
>flush privileges; #(刷新)
(12)开启防火墙
firewall –cmd --permanent--query-port=3306/tcp (检查端口3306是否开放)
firewall –cmd --permanent—add-port=3306/tcp (开放3306端口)
firewall –cmd --reload (刷新防火墙)
7、搭建集群
(1)新建hadoop用户及其用户组
adduser hadoop
passwd hadoop
(2)将新建的hadoop用户添加到hadoop用户组
usermod -a -G hadoop hadoop (组 名)
(3)赋予hadoop用户root权限
vim /etc/sudoer
加上:hadoop ALL=(ALL) ALL
(4)安装hadoop并配置环境(每一个节点都进行相同配置,可以在主机操作然后复制)
a.将hadoop包放在/usr/目录下并解压
b.配置环境变量在/etc/profil里添加:
export HADOOP_HOME=/usr/hadoop-2.7.3
export PATH=$JAVA_HOME/bin:$ HADOOP_HOME/bin:$PATH (加上hadoop的路径)
(5)准备工作
在master节点上创建以下文件夹
/usr/hadoop-2.7.3/hdfs/name
/usr/hadoop-2.7.3/hdfs/data
/usr/hadoop-2.7.3/hdfs/tmp
(6)配置hadoop文件
接下来配置/usr/hadoop-2.7.3/etc/hadoop/目录下的文件,有7个:
①-------配置slaves 文件
把原本的localhost删掉,改为slave1、slave2
②-------配置hadoop-env.sh文件
将JAVA_HOME文件配置为本机JAVA_HOME路径
export JAVA_HOME=/usr/java/jdk1.8.0_161
③------配置 yarn-env.sh
将其中的JAVA_HOME修改为本机JAVA_HOME路径(先把这一行的#去掉)
④---------配置core-site.xml
输入以下代码:
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/hadoop-2.7.3/hdfs/tmp</value>
<description>A base for other temporary directories.</description>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value> </property>
</configuration>
注意:第一个属性中的value和我们之前创建的/hadoop-2.7.3/hdfs/tmp路径要一致。
⑤-------配置hdfs-site.xml
输入以下代码:
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/hadoop-2.7.3/hdfs/name</value>
<final>true</final>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/hadoop-2.7.3/hdfs/data</value>
<final>true</final>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:9001</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
注意:(其中第二个dfs.namenode.name.dir和dfs.datanode.data.dir的value和之前创建的/hdfs/name和/hdfs/data路径一致;因为这里只有一个从主机slave1,slave2,所以dfs.replication设置为2)
⑥--------配置mapred-site.xml
复制mapred-site.xml.template文件,并命名为mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
⑦---------配置yarn-site.xml
<configuration>
<!-- site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:18040</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:18030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:18025</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:18141</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:18088</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<configuration>
(7)配置hadoop的环境
根据hadoop文件夹的路径配置:vim /etc/profile
export HADOOP_HOME=/usr/hadoop-2.7.3
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
键入命令 source /etc/profile 使配置立即生
(8)接下来,将hadoop传到slave1、slave2虚拟机上面去,传过去后,在slave1、slave2上面同样对hadoop进行路径配置(和第(7)步一样)
scp -r /usr/hadoop-2.7.3/ root@slave1:/usr/
scp -r /usr/hadoop-2.7.3/ root@slave2:/usr/
使配置文件立即实行:source /etc/profile
8、运行hadoop
(1)格式化Namenode
./bin/hdfs namenode -format
(2)查询hadoop:安装成功
(3)启动集群
两种方法:(/usr/hadoop-2.7.3/sbin/目录下)
start-all.sh
先start-dfs.sh,再start-yarn.sh
如果在mater上面键入jps后看到:
如果在slave1上面键入jps后看到:
则说明集群搭建成功
(4)进行测试
①上传文件到hdfs:hadoop fs –put test.txt /hdfs
②用自带的样例测试hadoop集群能不能正常跑任务:
hadoop jar /usr/hadoop-2.7.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar pi 10 10
9、附录(在搭建过程中遇到的问题进行了一些总结)
问题一:启动集群异常:
1、namenode没有正常启动
出现原因:①core-site.xml文件中tmp文件的路径错误,此时把路径修改正确即可,修改完后hadoop namenode –format初始化namenode。
2、datanode没有正常启动
出现原因:datanode的clusterID和namenode的clusterID不匹配。打开hdfs-site.xml里配置的datanode和namenode对应的目录,分别打开hdfs目录下data和name文件下的current文件夹里的VERSION,可以看到clusterID正如日志里记录的一样,确实不一致。
修改datanode(hdfs/data/current)里VERSION文件的clusterID与namenode(hdfs/name/current)里的一致,再重新启动dfs(执行start-all.sh)再执行jps命令可以看到datanode已正常启动。
问题二:出现错误信息提示:could only be replicated to 0 nodes, instead of 1
产生这样的错误原因有多种,这里列举出以下四种常用的解决方法以供参考:
①确保master(namenode) 、slaves(datanode)的防火墙已经关闭。
②确保DFS空间的使用情况,即不处于安全模式
③Hadoop的hadoop.tmp.dir的路径是否正确
一些命令:
查看安全状态:hadoop dfsadmin -safemode get
退出安全状态:hadoop dfsadmin -safemode leave
进入安全状态:hadoop dfsadmin -safemode enter
查看防火墙状态:systemctl status firewalld
service iptables status
暂时关闭防火墙:systemctl stop firewalld
service iptables stop
永久关闭防火墙:systemctl disable firewalld
chkconfig iptables off
重启防火墙:systemctl enable firewalld
service iptables restart
永久关闭后重启:chkconfig iptables on
搭建hive
Hive是基于Hadoop构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据。其在Hadoop的架构体系中承担了一个SQL解析的过程,它提供了对外的入口来获取用户的指令然后对指令进行分析,解析出一个MapReduce程序组成可执行计划,并按照该计划生成对应的MapReduce任务提交给Hadoop集群处理,获取最终的结果。元数据——如表模式——存储在名为metastore的数据库中。
1、解压压缩包
可先在master上安装,然后分发到其他节点中。 登录master 将Hive安装包拷贝到home/hadoop/下并解压,并将解压文件名改为hive。
输入命令:tar –zxvf apache-hive-0.13.1-bin.tar.gz
2、设置环境变量
Hive使用环境变量HADOOP_HOME来制定Hadoop的所有相关JAR和配置文件
#set Hive environment
export HIVE_HOME=/home/hadoop/hive
export PATH=$PATH:$HIVE_HOME/bin
备注:HIVE_HOME的路径设置为HIVE的安装路径,依据自己的情况修改。
3、Metastore
metastore是Hive元数据集中存放地。它包括两部分:服务和后台数据存储。有三种方式配置metastore:内嵌metastore、本地metastore以及远程metastore。这里采用mysql作为hive的metastore。
(1)登录mysql
(2)创建用户hive@master(密码hive)并分配权限
①创建用户hive:create user ‘hive’ identified by ‘hive’;
②在mysql上创建hive元数据库,并对hive进行授权
create database hive;
grant all privileges on hive to ‘hive’@’%’ identified by ‘hive’;
grant all privileges on hive to ‘hive’@’master’ identified by ‘hive’;
grant all privileges on hive to ‘hive’@’localhost’ identified by ‘hive’;
③刷新:flush privileges;
(3)用户名hive登录
mysql -h master -uhive
(4)其他可能会用到的命令
①查看MYSQL数据库中所有用户
SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
②查看用户是否设置了密码
mysql>; select user,host,password from mysql.user;
4、hive配置
Hive使用和Hadoop类似的XML配置文件进行设置,配置文件为hive/conf/hive-site.xml。几个较为重要的metastore配置属性见下:
(1)修改配置文件
进入到hive的配置文件目录下,找到hive-default.xml.template,另存为hive-site.xml并修改参数。
Hive 系统会加载两个配置文件一个默认配置文件“hive-default.xml”,另一个就是用户自定义文件“hive-site.xml”。当“hive-site.xml”中的配置参数的值与“hive-default.xml”文件中不一致时,以用户自定义的为准。所以可将不需要的参数都删除掉,只留下下面所示的内容
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
</configuration>
其中,MySQL的端口号3306为默认端口号,具体可在MySQL的配置文件my.cnf中查看。
(2)拷贝JDBC驱动包
把MySQL的JDBC驱动包复制到Hive的lib目录下(mysql-connector-java),mysql-connector-java需要自己下载
(3)分发HIVE
拷贝Hive目录到其他所有slave节点上,并且安装目录跟master上一致,同时配置环境变量
注意:在hiv-site.xml中修改配置文件添加一下内容,显示当前数据库和表头
<property>
<name>hive.cli.print.header</name>
<value>true</value>
<description>Whether to print the names of the columns in query output.</description>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
<description>Whether to include the current database in the Hive prompt.</description>
</property>
5、测试hive
在命令行直接输入hive即可进入hive页面(这里要启动hadoop和mysql服务)。
1.需要知道现在的hadoop中的HDFS存了什么
输入命令:hadoop fs -lsr /
- 进入hive并创建一个测试库和测试表
进入hive:hive
创建库:create database hive_1; - 查询一下HDFS有什么变化:会多了一个库hive_1
4.查看mysql中的hive库有什么变化:
use hive;
select * from DBS;