基于Ubuntu20.04搭建伪分布式Hadoop生态圈
1.SSH安装及免密配置
集群、单节点模式都需要用到SSH登陆,Ubuntu默认已安装了SSH client,此外还需要安装SSH server
输入如下命令:
1 | 更新源 |
此时再用ssh localhost命令,无需输入密码就可以直接登陆了。
2.JDK配置
进入Java Downloads | Oracle下载页面。(建议使用JDK1.8)
根据Linux系统的位数选择要下载的压缩包。
执行命令:
1 | getconf LONG_BIT |
如果显示32,则是23位的Linux系统,如果显示64,则是64位的Linux系统。这里是64位的,所以下载Linux x64
下载需要注册Oracle的账号,注册邮箱推荐网易邮箱。
注:JDK8或者JDK1.8是由于自从JDK1.5/JDK5命名方式改变后遗留的新旧命令方式问题。所以JDK8和JDK1.8等价。
2.1.解压安装
创建安装目录
1
mkdir /usr/local/java/
解压缩到安装目录
1
2注意下载的jdk版本
sudo tar -zxvf jdk-8u231-linux-x64.tar.gz -C /usr/local/java/解压缩以后,进入/usr/local/java/目录后,你会发现多一个目录,它就是JDK所在目录。JDK版本不同,这个目录名有所不同,这里是jdk1.8.0_231,那么完整路径就是**/usr/local/java/jdk1.8.0_231**。
2.2.设置环境变量
编辑变量
1
sudo vim ~/.profile
编辑模式下输入配置的环境变量
1
2
3
4
5set java1.8
export JAVA_HOME=/usr/local/java/jdk1.8.0_231
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=.:${JAVA_HOME}/bin:$PATH使环境变量生效
1
source ~/.profile
查看Java版本信息
1
java -version
得到输出结果
1
2
3java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b12, mixed mode)
3.Hadoop伪分布式配置
可参照历史博文
4.Spark配置
4.1.安装所需软件包
1 | sudo apt install curl mlocate git scala -y |
4.2.下载 Apache Spark
更多最新版本可以查看官方下载页面。
1 | curl -O https://archive.apache.org/dist/spark/spark-3.2.1/spark-3.2.1-bin-hadoop3.2.tgz |
4.3.解压安装
1 | 解压文件 |
4.4.使hadoop和spark建立联系
1 | cd /usr/local/spark |
4.5.编辑profile配置文件
增加spark安装目录到系统路径
1 | sudo vim ~/.profile |
4.6.启动spark
1 | 在/usr/local/spark/目录下输入命令即可启动 |
5.Zookeeper配置
5.1.下载安装包
通过官方下载页面下载
5.2.解压安装
1 | 解压文件 |
5.3.配置文件zoo.cfg
1 | 将解压后zookeeper目录下的conf目录下的zoo_sample.cfg文件重命名为zoo.cfg |
5.4.配置
这里是配置单机模式,也就是只有一个机器的集群,所以server只要配置一个即可
1 | # The number of milliseconds of each tick |
5.5.ip地址填写为ubuntu的主机地址
1 | ifconfig |
5.6.编辑profile配置文件
增加zookeeper安装目录到系统路径
1 | sudo vim ~/.profile |
5.7.启动/关闭zookeeper
1 | 启动 |
6.Hbase配置
6.1.确保版本依赖对应
在安装HBase之前,因HBase对Hadoop具有版本依赖性,故需确保已经安装了Hadoop3.x.x。
6.2.解压安装
1 | 解压安装包hbase-2.2.2-bin.tar.gz至路径 /usr/local |
6.3.配置环境变量
1 | 将hbase下的bin目录添加到path中,启动hbase时便无需到/usr/local/hbase目录下启动 |
6.4.伪分布式模式配置
1 | sudo vim /usr/local/hbase/conf/hbase-env.sh |
6.5.配置/usr/local/hbase/conf/hbase-site.xml
1 | sudo vim /usr/local/hbase/conf/hbase-site.xml |
修改hbase.rootdir,指定HBase数据在HDFS上的存储路径;将属性hbase.cluter.distributed设置为true。假设当前Hadoop集群运行在伪分布式模式下,在本机上运行,且NameNode运行在9000端口。
1 | <configuration> |
6.6.测试运行HBase
首先登陆ssh,再切换目录至/usr/local/hadoop ;再启动hadoop,如果已经启动hadoop请跳过此步骤。
1
2
3
4
5ssh localhost
cd /usr/local/hadoop
./sbin/start-dfs.sh切换目录至/usr/local/hbase;再启动HBase。
1
2
3cd /usr/local/hbase
bin/start-hbase.sh输入命令jps,看到以下界面说明hbase启动成功
1
2
3
4
5
6
7Jps
HMaster
HQuorumPeer
NameNode
HRegionServer
SecondaryNameNode
DataNode进入shell界面
1
bin/hbase shell
停止HBase运行
1
bin/stop-hbase.sh
6.7.注意
如果在操作HBase的过程中发生错误,可以通过{HBASE_HOME}目录(/usr/local/hbase)下的logs子目录中的日志文件查看错误原因。
这里启动关闭Hadoop和HBase的顺序一定是: 启动Hadoop—>启动HBase—>关闭HBase—>关闭Hadoop
7.Mysql配置
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle旗下产品。MySQL最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System,关系数据库管理系统) 应用软件之一。
7.1.安装Mysql
1 | 更新软件源 |
7.2.初始化配置
1 | sudo mysql_secure_installation |
取消对密码的强校验
1
2VALIDATE PASSWORD PLUGIN can be used to test passwords...
Press y|Y for Yes, any other key for No: N (选择N ,不会进行密码的强校验)设置密码
1
2
3Please set the password for root here...
New password: (输入密码)
Re-enter new password: (重复输入)不删除匿名用户
1
2
3
4By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them...
Remove anonymous users? (Press y|Y for Yes, any other key for No) : N (选择N,不删除匿名用户)允许root远程连接
1
2
3
4Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network...
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : N (选择N,允许root远程连接)保留test数据库
1
2
3By default, MySQL comes with a database named 'test' that
anyone can access...
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : N (选择N,保留test数据库)使修改权限立即生效
1
2
3Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y (选择Y,使修改权限立即生效)
7.3.检查Mysql服务状态
1 | systemctl status mysql.service |
7.4.配置远程访问
在Ubuntu下MySQL是只允许本地访问的,若需要远程访问,则需要进行配置;
找到 bind-address 修改值为 0.0.0.0
1
2找到 bind-address 修改值为 0.0.0.0
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf重启Mysql
1
sudo /etc/init.d/mysql restart
登录Mysql
1
sudo mysql -u root -p
输入用户密码并查询
1
2
3
4
5
6
7
8#切换数据库
mysql>use mysql;
#查询用户表命令
mysql>select User,authentication_string,Host from user;
#查看状态
mysql>select host,user,plugin from user;设置权限与密码
1
2
3
4
5
6
7
8#使用mysql_native_password修改加密规则
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '密码';
#更新一下用户的密码
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '密码' PASSWORD EXPIRE NEVER;
#允许远程访问
mysql> UPDATE user SET host = '%' WHERE user = 'root';刷新cache中配置
1
2#刷新权限
mysql>flush privileges; mysql>quit;
7.5.Mysql8.x.x配置JDBC
找到系统对应版本的java JDBC:MySQL :: Download Connector/J
操作系统选择
Platform Independent
或Ubuntu Linux
,下载mysql-connector-java-8.x.x.tar.gz
或mysql-connector-java_8.x.x-1ubuntu20.04_all.deb
文件。把该驱动程序解压拷贝到spark的安装目录下
1
2只需mysql-connector-java-8.x.x-bin.jar文件即可
sudo tar -zxf ~/Downloads/mysql-connector-java-8.x.x.tar.gz -C /usr/local/spark/jars
7.6.使用pyspark连接mysql数据库
连接之前需要先添加信息,打开数据库向数据库添加表格和信息:
1
2
3
4
5
6mysql>create database spark ;
mysql>use spark;
mysql>create table student (id int(4), name char(20), gender char(4),age int(4));
mysql>insert into student values(1,'Xueqian','F',23);
mysql>insert into student values(2,'Weiliang','M',24);
mysql>select * from student ;pyspark通过jdbc连接MySQL数据库
1
2
3
4
5
6
7
8
9打开spark
sudo cd /usr/local/spark/bin
./pyspark
注意是在spark中
>>jdbcDF=spark.read.format("jdbc").option("driver","com.mysql.jdbc.Driver").option("url","jdbc:mysql://localhost:3306/spark").option("dbtable","student").option("user","root").option("password","密码").load()
>>jdbcDF.show()正确连接即可显示mysql刚刚新建的表格信息
7.7.Mysql命令
检查服务状态
1
2
3systemctl status mysql.service
or
sudo service mysql statusmysql服务启动停止
1
2
3
4启动
sudo service mysql start
停止
sudo service mysql stop
3.其他详细命令可参照历史博文
7.8.Mysql登录报错解决方案
mysql登录时报错
1
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
解决方案
1
2
3
4
5sudo vim /etc/mysql/my.cnf
登录时跳过权限检查,添加在末尾
[mysqld]
skip-grant-tables重启mysql服务
1
sudo systemctl restart mysqld
修改密码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#登录mysql,直接回车(Enter)
mysql –u root –p
#修改
mysql>set password for ‘root’@‘localhost’=password(‘密码’);
#如果报错
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
#输入
mysql>flush privileges;
#再次输入
mysql>set password for ‘root’@‘localhost’=password(‘密码’);
#为避免麻烦,再次设置远程访问
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY 'Admin123@qwe' WITH GRANT OPTION;
#输入
mysql>flush privileges;
#退出
mysql>exit取消跳过权限检查
1
2
3
4
5sudo vim /etc/mysql/my.cnf
注释或删除
[mysqld]
skip-grant-tables重启mysql即可使用新密码连接
1
sudo systemctl restart mysqld
7.9.sqoop导入MySQL中文乱码解决方案
导致导入(可以插入中文,但不能用sqoop导入中文)时中文乱码的原因是character_set_server默认设置是latin1。
解决方案
1
2
3
4
5
6编辑配置文件
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
在[mysqld]下添加一行
character_set_server=utf8重启mysql服务
1
service mysql restart
登陆mysql,查看mysql目前设置的编码为utf8即可解决。
1
2#注意在mysql中执行命令
show variables like "char%";关于utf8mb3 & uft8mb4
8.Mongodb配置
8.1.配置安装
1 | 安装依赖包 |
8.2.启动和关闭MongoDB
1 | 重新加载配置,并启动mongodb |
8.3.尾巴
9.Hive配置
9.1.下载Hive-3.1.2
9.2.解压安装
1 | 解压安装包apache-hive-3.1.2-bin.tar.gz至路径 /usr/local |
9.3.配置环境变量
1 | sudo vim ~/.profile |
9.4.创建编辑hive-site.xml
在/usr/local/hive/conf目录下,创建hive-site.xml。
1 | 创建文件 |
9.5.添加以下代码
1 | <configuration> |
9.6.创建两个对应的目录并赋予读写权限
1 | sudo -mkdir -p /usr/local/hive/warehouse |
9.7.注意不同版本的数据库对应不同数据库的驱动类名称
- 新版本8.0版本的驱动为com.mysql.cj.jdbc.Driver
- 旧版本5.x版本的驱动为com.mysql.jdbc.Driver
9.8.配置hive-env.sh文件
1 | 在/usr/local/hive/conf下执行该命令 |
9.9.将JDBC的jar包拷贝在/usr/local/hive/lib目录下
- mysql-connector-java_8.0.20-1ubuntu20.04_all.deb
1
2
3解压文件,将文件中的mysql-connector-java-8.0.20.jar复制到/usr/local/hive/lib中
sudo tar zxvf mysql-connector-java_8.0.20-1ubuntu20.04_all.deb
sudo mv mysql-connector-java-8.0.20.jar /usr/local/hive/lib
9.10.在/usr/local/hive/bin目录下执行以下命令
1 | schematool -dbType mysql -initSchema |
9.11.注意
启动hive时需先启动hadoop集群、zookeeper和mysql,关闭则倒序执行。
9.12.报错原因
9.12.1.报错原因1
Jar包冲突
因为跟hadoop的jar包存在冲突,主要有两个jar包冲突,一个log4j-slf4j-impl-2.10.0.jar跟hadoop冲突,可以删除。1
sudo mv $HIVE_HOME/lib/log4j-slf4j-impl-2.10.0.jar $HIVE_HOME/lib/log4j-slf4j-impl-2.10.0.bak
另一个是guava-19.0.jar,跟hadoop里面的guava-27.0-jre.jar冲突,故采用高版本替换低版本的方式。
1
2
3sudo cp $HADOOP_HOME/share/hadoop/common/lib/guava-27.0-jre.jar $HIVE_HOME/lib
sudo rm $HIVE_HOME/lib/guava-19.0.jar
9.12.2.报错原因2
hive-site.xml配置文件中,3278行(见报错记录第二行)有特殊字符。
1 | Exception in thread "main" java.lang.RuntimeException: com.ctc.wstx.exc.WstxParsingException: Illegal character entity: expansion character (code 0x8 |
进入hive-site.xml文件,跳转到对应行,删除里面的
特殊字符即可。
9.13.尾巴
10.Sqoop配置
Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。Sqoop项目开始于2009年,最早是作为Hadoop的一个第三方模块存在,后来为了让使用者能够快速部署,也为了让开发人员能够更快速的迭代开发,Sqoop独立成为一个Apache项目。
10.1.下载sqoop1.4.7
10.2.解压安装
1 | 解压安装包hbase-2.2.2-bin.tar.gz至路径 /usr/local |
10.3.配置环境变量
1 | sudo vim ~/.profile |
10.4.修改配置文件sqoop-env.sh
1 | cd /sqoop/conf/ |
10.5.验证Sqoop安装
1 | ./bin/sqoop version |
10.6.将mysql驱动包拷贝到$SQOOP_HOME/lib
- MySQL :: Download Connector/J
1
2
3
4sudo tar -zxvf mysql-connector-java_8.0.28-1ubuntu20.04_all.deb
将mysql-connector-java_8.0.28-bin.jar拷贝到/usr/local/sqoop/lib
sudo cp mysql-connector-java_8.0.28-bin.jar /usr/local/sqoop/lib
10.7.测试与MySQL的连接
1 | 首先请确保hadoop和mysql服务已经启动 |
10.8.报错解决
错误: 找不到或无法加载主类 org.apache.sqoop.Sqoop
解决方法:
sqoop-1.4.x.tar.gz在1.4.5以上的安装包已经没有了这个jar包,解压sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
取出sqoop-1.4.7.jar放在/hadoop/share/hadoop/mapreduce/lib下,并且也放到/usr/local/sqoop/lib下。
然后重新导入数据
如果还解决不了,就在/usr/local/sqoop/bin里找到sqoop脚本,vim sqoop,修改最下面的配置。
1 | 将 |