java读取Mysql数据库写入hdfs

该Java程序演示了如何连接到MySQL数据库,从aa表中读取所有列的数据,然后将这些数据写入HDFS文件系统中的一份1.txt文件。通过加载MySQL JDBC驱动,建立数据库连接,执行SQL查询,将结果转换为字符串并编码为UTF-8,最后将内容写入HDFS文件。
package com.Test;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.DriverPropertyInfo;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.sql.Statement;
import java.util.Properties;
import java.util.logging.Logger;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class Mysql {

	String url = "jdbc:mysql://192.168.0.44:3306/mysql";
	String user = "root";
	String password = "mysql";

	public static void main(String[] args) throws ClassNotFoundException, SQLException, IOException {

		String driver = "com.mysql.jdbc.D
### 方法概述 将 MySQL 数据库中的数据导入 Hadoop HDFS 通常使用 **Sqoop** 工具完成。Sqoop 是一个专门用于在 Hadoop 和关系型数据库之间传输数据的工具,能够高效地将数据MySQL 导入到 HDFS,同时也支持导出操作。 ### 准备工作 在执行数据导入操作之前,需要完成以下准备工作: - **安装并配置 Hadoop 集群**:确保 Hadoop 集群正常运行,并且 HDFS 可用。 - **安装 Sqoop**:确保 Sqoop 已经安装并正确配置,与 Hadoop 集成。 - **MySQL 连接配置**:确保 MySQL 数据库可访问,并且 Sqoop 能够通过 JDBC 驱动连接到 MySQL。 ### 数据导入命令 以下是一个典型的 Sqoop 命令示例,用于将 MySQL 数据导入 HDFS: ```bash bin/sqoop import \ --connect jdbc:mysql://<host>:<port>/<database> \ --username <username> \ --password <password> \ --target-dir <HDFS_target_directory> \ --delete-target-dir \ --num-mappers <number_of_mappers> \ --fields-terminated-by "\t" \ --query 'SELECT <columns> FROM <table> WHERE <condition> AND $CONDITIONS;' ``` 例如,从 MySQL 中的 `staff` 表中导入 `id <= 3` 的数据HDFS 的 `/user/company1` 目录下: ```bash bin/sqoop import \ --connect jdbc:mysql://hadoop0:3306/company \ --username root \ --password Root@123 \ --target-dir /user/company1 \ --delete-target-dir \ --num-mappers 1 \ --fields-terminated-by "\t" \ --query 'select name,sex from staff where id <=3 and $CONDITIONS;' ``` 该命令会启动一个 MapReduce 作业,使用 `DBInputFormat` 从 MySQL 查询数据,并将其存储到 HDFS 的指定路径下[^3]。 ### 数据存储格式 - **字段分隔符**:通过 `--fields-terminated-by` 参数指定字段之间的分隔符,如 `\t`(制表符)。 - **文件格式**:默认情况下,Sqoop 会将数据存储为文本文件,但也可以使用 `--as-parquetfile` 或 `--as-sequencefile` 等参数将其存储为 Parquet 或 SequenceFile 格式。 ### 数据导入原理 Sqoop 利用数据库的元数据生成对应的 `DBWritable` 类,并使用 `DBInputFormat` 来读取数据库查询结果。每个 Map 任务处理一部分数据,最终将数据写入 HDFS 中。这种方式确保了数据的高效导入,并支持大规模数据的并行处理。 ### 数据导入注意事项 - **避免重复导入**:使用 `--delete-target-dir` 参数可以确保在目标目录已存在时自动删除旧数据,避免冲突。 - **并行导入**:可以通过增加 `--num-mappers` 参数来提高数据导入的并行度,从而提升性能。 - **查询条件**:在使用 `--query` 参数时,必须包含 `$CONDITIONS` 占位符,以便 Sqoop 自动分割数据范围。 ### 示例代码 以下是一个完整的 Sqoop 导入命令示例: ```bash sqoop import \ --connect jdbc:mysql://localhost:3306/mydb \ --username root \ --password mypass \ --target-dir /user/hadoop/output \ --delete-target-dir \ --num-mappers 4 \ --fields-terminated-by "," \ --query 'SELECT id, name, age FROM users WHERE age > 25 AND $CONDITIONS'; ``` 此命令将从 MySQL 数据库 `mydb` 中的 `users` 表中导入 `age > 25` 的数据HDFS 的 `/user/hadoop/output` 目录中,并使用逗号作为字段分隔符,同时使用 4 个 Map 任务进行并行处理。 ### 数据导入后的处理 导入完成后,数据存储在 HDFS 上,可以进一步使用 Hive、HBase 或 Spark 等工具进行分析和处理。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值