Sqoop之java API导入导出数据

折腾了一下午终于成功了,这里做一下总结

 

项目依赖:

<dependency>

    <groupId>junit</groupId>

    <artifactId>junit</artifactId>

    <version>3.8.1</version>

    <scope>test</scope>

</dependency>

<dependency>

    <groupId>org.apache.sqoop</groupId>

    <artifactId>sqoop-client</artifactId>

    <version>1.99.7</version>

</dependency>

<dependency>

    <groupId>mysql</groupId>

    <artifactId>mysql-connector-java</artifactId>

    <version>5.1.34</version>

</dependency>

 

遇到的一些坑都在代码中进行注释,下面就是利用java操作sqoop的代码:

import org.apache.sqoop.client.SqoopClient;

import org.apache.sqoop.model.*;

import org.apache.sqoop.submission.counter.Counter;

import org.apache.sqoop.submission.counter.CounterGroup;

import org.apache.sqoop.submission.counter.Counters;

import org.apache.sqoop.validation.Status;



import java.util.Arrays;

import java.util.UUID;



public class SqoopDataModel {

    //创建静态客户端对象

    static SqoopClient client;

    //创建jdbc连接

    public static MLink createMysqlLink() {

    //使用内置的连接器

    MLink link = client.createLink("generic-jdbc-connector");

    // 随机生成名字,也可以自己自定

    link.setName("jdbc-link" + UUID.randomUUID().toString().substring(0, 4));

    link.setCreationUser("wangwang");



    //获取连接配置对象

    MLinkConfig linkConfig = link.getConnectorLinkConfig();

    //指定连接jdbc路径uri、驱动、用户名和密码
  linkConfig.getStringInput("linkConfig.connectionString").setValue("jdbc:mysql://localhost:3306/db1");

linkConfig.getStringInput("linkConfig.jdbcDriver").setValue("com.mysql.jdbc.Driver");

linkConfig.getStringInput("linkConfig.username").setValue("root");

linkConfig.getStringInput("linkConfig.password").setValue("123456");

// 这里必须指定 identifierEnclose, 它默认是双引号,mysql也会报错

//表示解析sql语句的单词界定符,这里我配置成空格

linkConfig.getStringInput("dialect.identifierEnclose").setValue(" ");

//保存连接

    Status status = client.saveLink(link);

    if (status.canProceed()) {

        System.out.println("Created Link with Link Name : " + link.getName());

        return link;

    } else {

        System.out.println("Something went wrong creating the link");

        return null;

    }

}


/**
 *创建hdfs连接
 *
 */
public static MLink createHdfsLink() {

    //使用内置的连接器

    MLink link = client.createLink("hdfs-connector");
    
    link.setName("hdfs-link" + UUID.randomUUID().toString().substring(0, 4));

    link.setCreationUser("wangwang");

    //获取连接配置对象,并配置hdfs路径及hadoop配置路径

    MLinkConfig linkConfig = link.getConnectorLinkConfig();

    linkConfig.getStringInput("linkConfig.uri").setValue("hdfs://localhost:9000/");
   linkConfig.getStringInput("linkConfig.confDir").setValue("/Users/wangwang/softdir/hadoop-2.8.5/etc/hadoop");

    //保存连接

    Status status = client.saveLink(link);

    if (status.canProceed()) {

        System.out.println("Created Link with Link Name : " + link.getName());

        return link;

    } else {

        System.out.println("Something went wrong creating the link");

        return null;

    }

}

/**

* job:mysql to hdfs

* @param fromLink

* @param toLink

* @return

*/

public static String createMysqlToHdfsJob(MLink fromLink, MLink toLink) {

    //创建job,参数1表示数据源link名称,参数2表示目的地link名称

    MJob job = client.createJob(fromLink.getName(), toLink.getName());

    job.setName("wangwang-job" + UUID.randomUUID());
    
    job.setCreationUser("wangwang");

    //获取数据源配置对象fromJobConfig,并配置数据库名和表名,以及字段名

    MFromConfig fromJobConfig = job.getFromJobConfig();

    fromJobConfig.getStringInput("fromJobConfig.schemaName").setValue("db1");

    fromJobConfig.getStringInput("fromJobConfig.tableName").setValue("t_user");
    fromJobConfig.getListInput("fromJobConfig.columnList").setValue(Arrays.asList("id", "user_name", "passwd"));

    //获取目的地配置对象,并配置输出路径、输出格式、配置压缩比、是否覆盖空值

    MToConfig toJobConfig = job.getToJobConfig();

    //这里为了每次不对输出文件删除,我做了随机拼接操作,保证每次的输出路径不同,因为sqoop的hdfs导出路径要求不能存在

    toJobConfig.getStringInput("toJobConfig.outputDirectory").setValue("/sqooptest" + UUID.randomUUID());

    //如果不指定输出格式,则会出现以下异常

    //Caused by: org.apache.sqoop.common.SqoopException: MAPRED_EXEC_0013:Cannot write to the data writer

    toJobConfig.getEnumInput("toJobConfig.outputFormat").setValue("TEXT_FILE");

    toJobConfig.getEnumInput("toJobConfig.compression").setValue("NONE");

    toJobConfig.getBooleanInput("toJobConfig.overrideNullValue").setValue(true);

    //获取驱动器并指定map数量

    MDriverConfig driverConfig = job.getDriverConfig();

    driverConfig.getIntegerInput("throttlingConfig.numExtractors").setValue(1);

    //保存job

    Status status = client.saveJob(job);

    if (status.canProceed()) {

        System.out.println("Created Job with Job Name: " + job.getName());

        return job.getName();

    } else {

        System.out.println("Something went wrong creating the job");

        return null;

    }

}

/**

* job:hdfs to mysql

* @param fromLink

* @param toLink

* @return

*/

public static String createHdfsToMysqlJob(MLink fromLink, MLink toLink) {

    MJob job = client.createJob(fromLink.getName(), toLink.getName());
    
    job.setName("wangwang" + UUID.randomUUID());

    job.setCreationUser("wangwang");
    


    MFromConfig fromJobConfig = job.getFromJobConfig();

    fromJobConfig.getStringInput("fromJobConfig.inputDirectory").setValue("/sqoopDir");

    MToConfig toJobConfig = job.getToJobConfig();

    toJobConfig.getStringInput("toJobConfig.tableName").setValue("t_user");

    //这里不需要指定表的字段,否则会出现语法错误

    //GENERIC_JDBC_CONNECTOR_0002:Unable to execute the SQL

    // toJobConfig.getListInput("toJobConfig.columnList")

    // .setValue(Arrays.asList("id", "user_name", "passwd"));

    MDriverConfig driverConfig = job.getDriverConfig();

    //这里指定map数量,查看mapreduce运行情况发现就没有reduce任务

    driverConfig.getIntegerInput("throttlingConfig.numExtractors").setValue(1);

    //这里我们不能指定reduce的数量,否则会出现异常:No data available in table

    //driverConfig.getIntegerInput("throttlingConfig.numLoaders").setValue(10);



    Status status = client.saveJob(job);

    if (status.canProceed()) {

        System.out.println("Created Job with Job Name: " + job.getName());

        return job.getName();

    } else {

        System.out.println("Something went wrong creating the job");

    return null;

    }

}

//启动job

static void startJob(String jobName) {

    //Job start

    MSubmission submission = client.startJob(jobName);

    System.out.println("Job Submission Status : " + submission.getStatus());

    if (submission.getStatus().isRunning() && submission.getProgress() != -1) {

    System.out.println("Progress : " + String.format("%.2f %%",     submission.getProgress() * 100));

}



    System.out.println("Hadoop job id :" + submission.getExternalJobId());

    System.out.println("Job link : " + submission.getExternalLink());

    Counters counters = submission.getCounters();

    if (counters != null) {

    System.out.println("Counters:");

    for (CounterGroup group : counters) {

        System.out.print("\t");

        System.out.println(group.getName());

        for (Counter counter : group) {

            System.out.print("\t\t");

            System.out.print(counter.getName());

            System.out.print(": ");

            System.out.println(counter.getValue());

        }

    }

}

}



public static void main(String[] args) {

    String url = "http://localhost:12000/sqoop/";

    client = new SqoopClient(url);

    System.out.println(client);

    MLink mysqlLink = createMysqlLink();

    MLink hdfsLink = createHdfsLink();

    // 将数据导入 hdfs

    // startJob(createMysqlToHdfsJob(mysqlLink, hdfsLink));

    // 将数据导回 mysql

    startJob(createHdfsToMysqlJob(hdfsLink, mysqlLink));

    }

}

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
Sqoop是一款用于在Hadoop与关系型数据库之间进行数据传输的工具,可以方便地将数据从关系型数据导入到Hadoop中,也可以将Hadoop中的数据导出到关系型数据库中。下面分别介绍Sqoop导入导出功能: 1. Sqoop数据导入 Sqoop数据导入功能可以将关系型数据库中的数据导入到Hadoop中进行处理和分析。以下是导入数据的步骤: (1)执行以下命令安装Sqoop: ``` sudo apt-get update sudo apt-get install sqoop ``` (2)使用以下命令进行数据导入,其中jdbc-url和username、password分别为数据库的连接地址、用户名和密码,table为需要导入的表名,target-dir为数据导入的目录: ``` sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --table student --target-dir /user/hadoop/student ``` 2. Sqoop数据导出 Sqoop数据导出功能可以将Hadoop中的数据导出到关系型数据库中进行存储和处理。以下是导出数据的步骤: (1)执行以下命令进行数据导出,其中jdbc-url和username、password分别为数据库的连接地址、用户名和密码,table为需要导出的表名,export-dir为数据导出的目录: ``` sqoop export --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --table student --export-dir /user/hadoop/student ``` Hive是一种数据仓库工具,可以用于对大规模数据进行处理和分析。Hive可以将结构化的数据映射为一张数据库表,并提供类SQL查询语言对数据进行查询和分析。以下是使用Hive进行数据处理和分析的步骤: (1)启动Hive 在终端中执行以下命令启动Hive: ``` hive ``` (2)创建表 使用Hive的SQL语法创建一个表,例如: ```sql CREATE TABLE student ( id INT, name STRING, age INT ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE; ``` (3)导入数据 使用Hive的LOAD DATA语法将数据导入到表中,例如: ```sql LOAD DATA LOCAL INPATH '/home/hadoop/student.txt' INTO TABLE student; ``` (4)查询数据 使用Hive的SELECT语法查询表中的数据,例如: ```sql SELECT * FROM student WHERE age > 18; ``` (5)保存查询结果 使用Hive的INSERT语法将查询结果保存到另一个表中,例如: ```sql INSERT INTO student2 SELECT * FROM student WHERE age > 18; ``` 以上是使用Sqoop进行数据导入导出使用Hive进行数据处理和分析的基本步骤,具体的操作可以根据实际需求进行调整。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值