sqoop导入导出数据

本文详细介绍了如何使用Sqoop进行数据迁移,包括从MySQL导入数据到HDFS、Hive、Hbase,以及反向将HDFS、Hive、Hbase的数据导回MySQL。在实践中,遇到了权限问题、通信链接失败、jar包缺失等问题,并给出了相应的解决方案。重点讲解了授权设置、错误排查和所需jar包的添加。

导入:MySQL==> HDFS、Hive、Hbase

导出:HDFS、Hive、Hbase ==>  MySQL

一、安装,配置环境

1、下载压缩包

2、配置文件sqoop.env.sh

3、验证:bin/sqoop  help

4、拷贝jdbc驱动到sqoop/lib

5、连接MySQL

[root@master sqoop-1.4.7]# ./bin/sqoop list-databases --connect jdbc:mysql://master:3306/ --username root --password 111111

 


二、实践

1、启动MySQL:

mysql -uroot -p111111

2、创建员工表

-- 创建公司company数据库
create database company

-- 在公司company数据库下创建员工表staff
create table company.staff(id int(4) primary key not null auto_increment,
                           name varchar(255),                             
                           sex varchar(255));


-- 在员工表中插入数据
insert into company.staff(name,sex) values('Thomes','Male');
insert into company.staff(name,sex) values('Catalina','Female');

全量数据导入:

./bin/sqoop import \
--connect jdbc:mysql://localhost:3306/company \
--username root \
--password 111111 \
--table staff \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t"

错误一:

Error: java.lang.RuntimeException: java.lang.RuntimeException: java.sql.SQLException: null,  message from 
server: "Host 'slave1' is not allowed to connect to this MariaDB server"

表示该对象不是远程对象,不能通过该对象远程访问数据

方案一:改表:

use mysql ;select user,host,password from user;

update user set host = '%' where user='root';

执行方法一时:遇到ERROR 1062 (23000): Duplicate entry '%-root' for key 'PRIMARY'

解决方法:不予理会,直接执行  flush privileges;然后重连数据库

方法二没用,暂时不知道是否能解决问题:

方案二:授权法:

例如,你想myuser使用mypassword从任何主机连接到mysql服务器的话。 
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION; 
如果你想允许用户myuser从ip为192.168.1.3的主机连接到mysql服务器,并使用mypassword作为密码 
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'192.168.1.3' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;

错误2:

Error: Java.lang.RuntimeException: java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

 

 

解决完上述问题之后,再次执行导入命令,得到结果:结果存在HDFS目录上:

二、查询导入

./bin/sqoop import \
--connect jdbc:mysql://master:3306/company \
--username root \
--password 111111 \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--query 'select name,sex from staff where id <= 1 and $CONDITION'
-- 使用双引号需要使用 \ 在$CONDITION前 进行转义
--query "select name,sex from staff where id <= 1 and \$CONDITION"

三、导入指定的列

./bin/sqoop import \
--connect jdbc:mysql://master:3306/company \
--username root \
--password 111111 \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--columns id,sex \
--table staff

四、关键字筛选

./bin/sqoop import \
--connect jdbc:mysql://master:3306/company \
--username root \
--password 111111 \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--table staff \
--where "id=1"

五、关键字和指定关键字同时使用

./bin/sqoop import \
--connect jdbc:mysql://master:3306/company \
--username root \
--password 111111 \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--table staff \
--columns id,sex \
--where "id=1"

二、MySQL数据导入Hive

数据先上传至HDFS的   /user/root/staff    目录(系统默认路径:/user/系统目录(root)/表名(staff))下,

然后再存入hive表(hive表对应的HDFS仓库位置:/user/hive/warehouse/staff_hive)

./bin/sqoop import \
--connect jdbc:mysql://master:3306/company \
--username root \
--password 111111 \
--table staff \
--num-mappers 1 \
--hive-import \
--fields-terminated-by "\t" \
--hive-overwrite \
--hive-table staff_hive

执行遇到的坑:

坑一:

 java.io.IOException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf

问题原因:缺少jar包

问题解决:复制hive lib 包下面的hive-common-1.1.0-cdh5.7.0.jar 至sqoop lib 包下

坑二:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hive/shims/ShimLoader

问题原因:缺少jar包

问题解决:拷贝 hive lib 包下 hive-exec-1.1.0-cdh5.7.0.jar 至 sqoop 的lib包下

 

三、MySQL数据导入Hbase

./bin/sqoop import \
--connect jdbc:mysql://master:3306/company \
--username root \
--password 111111 \
--table staff \
--columns "id,name,sex" \
--column-family "info" \
--hbase-create-table \
--hbase-row-key "id" \
--hbase-table "hbase_company" \
--num-mappers 1 \
--split-by id

坑一:

Sqoop HBase导入:java.lang.NoSuchMethodError:org.apache.hadoop.hbase.HTableDescriptor.addFamily

问题分析:版本不兼容;sqoop1.4.6 只支持Hbase1.0及其以前的版本

问题解决:手动创建Hbase表,如下:

hbase(main):001:0> create 'hbase_company','info'

然后重新执行sqoop语句:

./bin/sqoop import \
--connect jdbc:mysql://master:3306/company \
--username root \
--password 111111 \
--table staff \
--columns "id,name,sex" \
--column-family "info" \
--hbase-create-table \
--hbase-row-key "id" \
--hbase-table "hbase_company" \
--num-mappers 1 \
--split-by id

四、Hive或HDFS数据导入MySQL

./bin/sqoop export \
--connect jdbc:mysql://master:3306/company \
--username root \
--password 111111 \
--table staff \
--num-mappers 1 \
--export-dir /user/hive/warehouse/staff_hive \
--input-fields-terminated-by "\t"

五、脚本执行

vi jobs/sqp.opt


./bin/sqoop export \
--connect 
jdbc:mysql://master:3306/company 
--username 
root
--password
111111
--table
staff
--num-mappers
1
--export-dir 
/user/hive/warehouse/staff_hive 
--input-fields-terminated-by 
"\t"

--执行:
[root@master sqoop-1.4.6]# ./bin/sqoop --options-file /usr/local/src/test4/sqp_job/sqp.opt

坑一:MySQL在centos7中重设密码:

Centos7重置mysql密码

"Host 'xxx' is not allowed to connect to this MySQL server":

MySQL导入hive报错——缺少jar包

### 数据集成:MySQL与Hadoop通过Sqoop导入导出数据的实践指南 Sqoop 是一种用于在 Hadoop 和关系型数据库之间高效传输数据的工具,支持从 MySQL 等数据导入数据到 Hadoop 生态系统中,也可以将处理后的数据导出回数据库。以下是一个基本的操作指南: #### 1. 安装 Sqoop 确保已经安装了 Java、Hadoop,并配置好了环境变量。然后下载并安装 Sqoop: ```bash wget https://downloads.apache.org/sqoop/1.4.7/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /usr/local mv /usr/local/sqoop-1.4.7.bin__hadoop-2.6.0 /usr/local/sqoop ``` 设置 `SQOOP_HOME` 并将其添加到 `PATH`。 #### 2. 导入 MySQL 表到 HDFS/Hive 使用以下命令将 MySQL 中的数据导入到 HDFS: ```bash sqoop import \ --connect jdbc:mysql://localhost:3306/db_name \ --username root \ --password password \ --table table_name \ --target-dir /user/hadoop/output_dir \ --fields-terminated-by ',' \ --lines-terminated-by '\n' \ --num-mappers 1 ``` 如果需要导入到 Hive,可以加上 `--hive-import` 参数。 #### 3. 导出 HDFS/Hive 数据到 MySQL 将 HDFS 上的数据导出回 MySQL: ```bash sqoop export \ --connect jdbc:mysql://localhost:3306/db_name \ --username root \ --password password \ --table table_name \ --export-dir /user/hadoop/output_dir \ --input-fields-terminated-by ',' ``` Sqoop 的底层是基于 MapReduce 实现的,因此具备良好的并行性和容错能力[^1]。 --- ### Spark RDD 和 SparkSQL 基础任务编写教程 #### 1. RDD 编程基础 Spark 提供了弹性分布式数据集(RDD)作为其核心数据结构,适合进行低层次的函数式操作。 ##### 创建 RDD ```python from pyspark import SparkContext sc = SparkContext("local", "RDD Example") data = [1, 2, 3, 4, 5] distData = sc.parallelize(data) ``` ##### 转换与动作操作 ```python rdd = sc.parallelize([1, 2, 3, 4]) squared = rdd.map(lambda x: x * x).collect() print(squared) # 输出 [1, 4, 9, 16] ``` #### 2. SparkSQL 编程基础 SparkSQL 提供了更高层次的抽象,支持结构化查询语言和 DataFrame API。 ##### 使用 DataFrame 进行 SQL 查询 ```python from pyspark.sql import SparkSession spark = SparkSession.builder.appName("SparkSQL Example").getOrCreate() df = spark.read.csv("path/to/file.csv", header=True, inferSchema=True) df.createOrReplaceTempView("people") result = spark.sql("SELECT name FROM people WHERE age > 30") result.show() ``` Spark 支持多种数据源,并提供了内存计算模型以提升性能[^2]。 --- ### HDFS 高可用方案设计与实现(如 NameNode HA) HDFS 的高可用性主要通过 NameNode 的主备切换机制来实现,避免单点故障。 #### 1. 架构设计 HDFS HA 架构含两个 NameNode(一个 Active,一个 Standby),多个 JournalNode 用于共享编辑日志(EditLog),ZooKeeper 协调主备切换。 #### 2. 配置步骤 - **配置 ZooKeeper**:确保 ZooKeeper 集群正常运行。 - **配置 hdfs-site.xml** ```xml <configuration> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <property> <name>dfs.ha.nameservices</name> <value>mycluster</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>host1:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>host2:8020</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>host1:50070</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>host2:50070</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/path/to/journal/data</value> </property> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> </configuration> ``` - **启动 HA 模式** 执行以下命令初始化 HA 状态并启动服务: ```bash hdfs zkfc -formatZK hdfs namenode -initializeSharedEdits ``` HDFS 采用主备架构,并通过 ZooKeeper 实现自动故障转移,从而提供高可用性[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值