先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip204888 (备注大数据)
正文
>
> 1. 使用命令报错时:
>
>
> ```
> #测试能否成功连接数据库
> sqoop list-databases --connect jdbc:mysql://master:3306/?useSSL=false --username sqoop --password 123456
>
> ```
> 2. \*\*报错信息如下:\*\*ERROR manager.CatalogQueryManager: Failed to list databases
>
>
> **com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure**
>
>
> 完整信息在下面:
>
>
> * ```
> Warning: /usr/local/sqoop/../hcatalog does not exist! HCatalog jobs will fail.
> Please set $HCAT\_HOME to the root of your HCatalog installation.
> Warning: /usr/local/sqoop/../accumulo does not exist! Accumulo imports will fail.
> Please set $ACCUMULO\_HOME to the root of your Accumulo installation.
> 。。。
> at org.apache.sqoop.Sqoop.runTool(Sqoop.java:243)
> at org.apache.sqoop.Sqoop.main(Sqoop.java:252)
> Caused by: java.net.ConnectException: Connection refused (Connection refused)
> at java.net.PlainSocketImpl.socketConnect(Native Method)
> at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
> at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
> at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
> at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
> at java.net.Socket.connect(Socket.java:589)
> at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:211)
> at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:301)
> ... 24 more
>
> ```
>
>
> **原因:没有开启远程登录,需要修改配置**
>
>
>
> ```
> **解决方案:**
>
> ```
>
>
> ```
> #查看状态(防火墙是inactive状态)
> sudo ufw status
> #查看端口
> netstat -an | grep 3306
>
> ```
>
> ![07-5-sqoop解决连接不上的问题](https://img-blog.csdnimg.cn/img_convert/10016246859fa1c0ae42b56ca1bc4768.jpeg)
>
>
>
> ```
> ~~~shell
>
> ```
>
> #编辑端口
> #注释掉43行的bind-address
> sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
>
>
> ##修改端口,需要重启虚拟机
> sudo reboot
>
>
> ![07-6-sqoop解决连接不上的问题](https://img-blog.csdnimg.cn/img_convert/6074cbc61a227e949a7585ba97755a61.jpeg)
>
>
> **成功状态**:
>
>
> ![07-7-连接MySQL成功状态](https://img-blog.csdnimg.cn/img_convert/7965b431172fb31a5b37c0f2db136388.png)
>
>
>
>
> \*\*如果Sqoop转移数据到Hive不成功需注意:\*\*之前Hive初始化是在单机伪分布式状态下进行的,和现在集群状态不符,**需要重新格式化HIve,删除MySQL的hive元数据库**
>
>
>
> ```
> #hive如果想重新配置的同学
> #在配置完master的hive之后,不要初始化,根据情形进行下面操作
> #情形一:如果单机节点没有配好,
> #按照Hive单机的安装步骤,在master配置完hive后,需要同步给slave1和slave2
> scp /usr/local/hive hadoop@slave1:/usr/local/
> scp /usr/local/hive hadoop@slave2:/usr/local/
>
> #同步系统环境变量
> scp /home/hadoop/.bashrc hadoop@slave1:/home/hadoop
> scp /home/hadoop/.bashrc hadoop@slave2:/home/hadoop
>
> #三个节点上刷新
> source /home/hadoop/.bashrc
>
> #情形二:单机已经成功,其他节点是克隆出来的
> #查看mysql数据里的hive元数据信息
> #查看默认的账号和密码,使用以下命令:
> sudo cat /etc/mysql/debian.cnf
> mysql -u debian-sys-maint -p
> #输入cat命令显示的密码
>
> #当前节点数据库有哪些
> show databases;
>
> #查看的密码
> #三个节点都要执行超级用户登录后,查看有没有hive的数据库,有的话删除
> drop database hive;
>
> #三个节点初始化操作
> schematool -dbType mysql -initSchema
>
> ```
>
> 验证状态-Hive初始化成功:
>
>
> ![07-4-Hive重新格式化](https://img-blog.csdnimg.cn/img_convert/7ce00b10e96efec499039f7f5703c99b.jpeg)
>
>
> **再次执行查询数据库命令:**
>
>
>
> ```
> #测试能否成功连接数据库
> sqoop list-databases --connect jdbc:mysql://master:3306/?useSSL=false --username sqoop --password 123456
>
> ```
>
>
#### 1.3.4 使用前的数据准备
##### 1.3.4.1 mysql数据准备(下面操作可在dbeaver中进行)
![07-8-MySQL准备](https://img-blog.csdnimg.cn/img_convert/b7471d882cd88aff39a4c33139fab397.jpeg)
#(1)使用sqoop用户登录MySQL,使用以下命令:
#如果使用dbeaver连接MySQL,不用在输入这步命令了
mysql -u sqoop -p
#(2)创建并使用使用sqoop数据库,使用以下命令:
create database sqoop
use sqoop
#(3)创建student表用于演示导入MySQL数据到HDFS,使用以下命令:
CREATE TABLE IF NOT EXISTS student
(
id
int PRIMARY KEY COMMENT ‘编号’,
name
varchar(20) COMMENT ‘名字’,
age
int COMMENT ‘年龄’
)COMMENT ‘学生表’;
#(4) 向student表插入一些数据,使用以下命令:
INSERT INTO student VALUES(1, ‘zhangsan’, 20);
INSERT INTO student VALUES(2, ‘lisi’, 24);
INSERT INTO student VALUES(3, ‘wangwu’, 18);
INSERT INTO student VALUES(4, ‘zhaoliui’, 22);
#(5) 创建student2表用于装载Hive导出的数据,使用以下命令:
CREATE TABLE IF NOT EXISTS student2
(
id
int PRIMARY KEY COMMENT ‘编号’,
name
varchar(20) COMMENT ‘名字’,
age
int COMMENT ‘年龄’
)COMMENT ‘学生表’;
**dbeaver远程登录MySQL失败:**
![image-20221024171548427](https://img-blog.csdnimg.cn/img_convert/b5e53e161b98f0013bcde32e4fb30360.png)
#查看状态
sudo ufw status
#查看端口
netstat -an | grep 3306
#编辑端口
#注释掉43行的bind-address
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
#bind-address = 127.0.0.1
##修改端口,需要重启虚拟机
sudo reboot
**数据准备完成后**:
* **student表**:
![07-9连接MySQL](https://img-blog.csdnimg.cn/img_convert/ca2cdd067736338fbbd8a6313ce44a32.png)
* **student2表:**
![07-10准备Hive表](https://img-blog.csdnimg.cn/img_convert/3c64eeb273f5e570122ee1d670dbad21.png)
##### 1.3.4.2 Hive的准备(也在dbeaver中执行):
–(1) 启动hive,使用以下命令:
hiveserver2
–(2) 打开DBeaver连接Hive
–(3) 创建sqoop数据库,使用以下命令:
CREATE DATABASE sqoop;
–(4) 使用sqoop数据库,使用以下命令:
USE sqoop;
–(5) 创建student表用于装载MySQL导入的数据,使用以下命令:
CREATE TABLE IF NOT EXISTS student(
id INT COMMENT ‘编号’,
name STRING COMMENT ‘名字’,
age INT COMMENT ‘年龄’
) COMMENT ‘学生表’
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ’ ';
* **如果搭建完HadoopHA后在启动Hive报错**
###### [hive启动时,提示java.net.UnknownHostException:ns]( )
![04-hive报错异常](https://img-blog.csdnimg.cn/img_convert/43211fd10e943e67ff629125abc506e0.png)
**注意复制HDFS的core-site.xml和hdfs-site.xml到hive目录的conf下面**
cp /usr/local/hadoop/etc/hadoop/hdfs-site.xml /usr/local/hive/conf
cp /usr/local/hadoop/etc/hadoop/core-site.xml /usr/local/hive/conf
### 1.5 Sqoop命令
#### Sqoop 的常用命令
| **命令** | **说明** |
| --- | --- |
| **list-databases** | **列出所有数据库名** |
| **list-tables** | **列出某个数据库下所有表** |
| **import** | **将数据导入到 HDFS 集群,hive,hbase,hdfs本身等等** |
| **export** | **将 HDFS 集群数据导出** |
| **help** | 打印 sqoop 帮助信息 |
| **version** | 打印 sqoop 版本信息 |
#### Sqoop 的公共参数
| **命令** | **说明** |
| --- | --- |
| **–connect** | 连接关系型数据库的URL |
| **–username** | 连接数据库的用户名 |
| **–password** | 连接数据库的密码 |
#### Sqoop的 import 命令参数
| **参数** | **说明** |
| --- | --- |
| **–fields-terminated-by** | Hive中的列分隔符,默认是逗号 |
| **–lines-terminated-by** | Hive中的行分隔符,默认是\n |
| **–append** | 将数据追加到HDFS中已经存在的DataSet中,如果使用该参数,sqoop会把数据先导入到临时文件目录,再合并。 |
| **–columns** | 指定要导入的字段 |
| **–m**或–**num-mappers** | 启动N个map来并行导入数据,默认4个。 |
| **–query**或\*\*–e\*\* | 将查询结果的数据导入,使用时必须伴随参–target-dir,–hive-table,如果查询中有where条件,则条件后必须加上$CONDITIONS关键字 |
| **–table** | 关系数据库的表名 |
| **–target-dir**
| 指定导入数据存储的HDFS路径 |
| **–null-string** | string类型的列如果null,替换为指定字符串 |
| **–null-non-string** | 非string类型的列如果null,替换为指定字符串 |
| **–check-column** | 作为增量导入判断的列名 |
| **–incremental** | mode:append或lastmodified |
| **–last-value** | 指定某一个值,用于标记增量导入的位置 |
#### Sqoop 的 export 命令参数
| **参数** | **说明** |
| --- | --- |
| **–input-fields-terminated-by** | Hive中的列分隔符,默认是逗号 |
| **–input-lines-terminated-by** | Hive中的行分隔符,默认是\n |
| **–export-dir** | 存放数据的HDFS的源目录 |
| **-m****或****–num-mappers** | 启动N个map来并行导出数据,默认4个 |
| **–table** | 指定导出到哪个RDBMS中的表 |
| **–update-key** | 对某一列的字段进行更新操作 |
| **–update-mode** | updateonly或allowinsert(默认) |
#### Sqoop 的命令案例
* **导入到HDFS**
#查看MySQL中已有的数据库名称
sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username sqoop --password 123456
#查看MySQL中Sqoop数据库中的表,使用以下命令
sqoop list-tables --connect jdbc:mysql://localhost:3306/sqoop --username sqoop --password 123456
#导入全部MySQL数据到HDFS,执行以下命令
sqoop import --connect jdbc:mysql://localhost:3306/sqoop --username sqoop --password 123456 --table student --target-dir /user/student --delete-target-dir -m 1
#执行完成后,去HDFS查看数据是否导入成功,使用以下命令:
hdfs dfs -cat /user/student/part-m-00000
#导入部分mysql数据到HDFS(导入时筛选)
#-- query不与–table同时使用
#必须在where后面加上$CONDITIONS
sqoop import --connect jdbc:mysql://localhost:3306/sqoop --username sqoop --password 123456 --target-dir /user/student --delete-target-dir -m 1 --query ‘select * from student where age <20 and $CONDITIONS’
**查看–target-dir指定的路径**
![05-hdfs上web管理界面查看内容](https://img-blog.csdnimg.cn/img_convert/16a83da2061089820175fe8286d62c1f.png)
* **导入到Hive**
#导入MySQL数据到hive
sqoop import --connect jdbc:mysql://localhost:3306/sqoop --username sqoop --password 123456 --table student --target-dir /user/student2 --delete-target-dir --hive-import --fields-terminated-by " " --columns id,name,age --hive-overwrite --hive-table sqoop.student -m 1
#导入部分MySQL数据到hive(覆盖导入)
sqoop import --connect jdbc:mysql://localhost:3306/sqoop --username sqoop --password 123456 --target-dir /user/student2 --delete-target-dir -m 1 --query ‘select * from student where age <20 and $CONDITIONS’ --hive-import --fields-terminated-by " " --columns id,name,age --hive-overwrite --hive-table sqoop.student2
#增量导入部分MySQL数据到hive
#–incremental append不能和–delete-target-dir一起用
sqoop import --connect jdbc:mysql://localhost:3306/sqoop --username sqoop --password 123456 --table student --target-dir /user/student2 --hive-import --fields-terminated-by " " --columns id,name,age --hive-table sqoop.student2 --check-column id --incremental append --last-value 3 -m 1
+ **问题:导入数据权限不足,导入hive失败**
- ![06-web管理错误](https://img-blog.csdnimg.cn/img_convert/f43e11dd71a760073ead43782f26045d.png)
* [Hdfs页面操作文件出现 Permission denied: user=dr.who,]( )
* ```
#在xshell
hdfs dfs -chmod -R 755 /
```
* **导入到HBase**
#导入数据到HBase,需要提前创建对应的表student
#导入数据之前
hbase shell
create ‘student’,‘info’
#开始执行导入命令
sqoop import --connect jdbc:mysql://localhost:3306/sqoop --username sqoop --password 123456 -table student -hbase-table “student” --hbase-row-key “id” --column-family “info” --columns “id,name,age” --split-by id -m -1
* **Hive导出到MySQL**
#Sqoop 的导出命令案例
sqoop export --connect jdbc:mysql://localhost:3306/sqoop --username sqoop --password 123456 --table student2 --export-dir /usr/local/hive/warehouse/sqoop.db/student --input-fields-terminated-by " " -m 1
![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fs2.loli.net%2F2023%2F10%2F25%2FTMgxwd8kJQ4nIXC.png&pos_id=img-42gsrcpI-1698215152169)
## 2. Flume
### 2.1Flume简介
* Flume是一个分布式的、高可靠的、高可用的将大批量的**不同数据源**的**日志数据**收集、聚合、移动\*\*到数据中心(\*\*HDFS)进行存储的系统
+ 1、可以**高速**采集数据,采集的数据能够以想要的**文件格式**及**压缩方式**存储在hdfs上;
+ 2、事务功能保证了数据在采集的过程中数据不丢失;
- 原子性
+ 3、部分Source保证了Flume挂了以后重启依旧能够继续在上一次采集点采集数据,真正做到**数据零丢失**。
### 2.2Flume架构
* Agent 是 Flume 中**最小**的**独立运行单位**,一个 agent 就是一个 **JVM**(java虚拟机)
+ 含有三个核心组件,分别是 **source、channel 和 sink**
+ ![08-flume原理](https://img-blog.csdnimg.cn/img_convert/89b3364f1f0a7c8ee668220a2293b591.png)
### 2.3 Flume安装
#下载、上传、解压、重命名和授权
https://mirrors.tuna.tsinghua.edu.cn/apache/flume/1.9.0/apache-flume-1.9.0-bin.tar.gz
#上传到 /home/hadoop 目录
sudo tar -xvf apache-flume-1.9.0-bin.tar.gz -C /usr/local
sudo mv /usr/local/apache-flume-1.9.0-bin/ /usr/local/flume
sudo chown -R hadoop /usr/local/flume
### 2.4 Flume配置
#### 配置环境变量
#编辑环境变量
vim /home/hadoop/.bashrc
#在环境变量最后添加以下内容
export FLUME_HOME=/usr/local/flume
export PATH=
P
A
T
H
:
PATH:
PATH:FLUME_HOME/bin
#刷新环境变量
source /home/hadoop/.bashrc
#### 配置 Agent
为 agent 起个名字叫做 a1
设置 a1 的 sources 叫做 r1
a1.sources = r1
设置 a1 的 sinks 叫做 k1
a1.sinks = k1
设置 a1 的 channels 叫做 c1
a1.channels = c1
#### 配置Source
设置 r1 的类型是 exec,用于采集命令产生的数据
a1.sources.r1.type = exec
设置 r1 采集 tail -F 命令产生的数据
a1.sources.r1.command = tail -F /home/hadoop/tail-test.txt
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)**
![img](https://img-blog.csdnimg.cn/img_convert/daab07154596fa44e253cc699be53cec.png)
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
1.sources = r1
# 设置 a1 的 sinks 叫做 k1
a1.sinks = k1
# 设置 a1 的 channels 叫做 c1
a1.channels = c1
配置Source
# 设置 r1 的类型是 exec,用于采集命令产生的数据
a1.sources.r1.type = exec
# 设置 r1 采集 tail -F 命令产生的数据
a1.sources.r1.command = tail -F /home/hadoop/tail-test.txt
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)
[外链图片转存中…(img-XmGlQ9Mo-1713155742444)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!