大數據Hadoop之——數據同步工具Sqoop

来源:https://www.cnblogs.com/liugp/archive/2022/05/22/16298917.html
-Advertisement-
Play Games

一、概述 Apache Sqoop(SQL-to-Hadoop)項目旨在協助RDBMS(Relational Database Management System:關係型資料庫管理系統)與Hadoop之間進行高效的大數據交流。用戶可以在 Sqoop 的幫助下,輕鬆地把關係型資料庫的數據導入到 Had ...


目錄

一、概述

Apache Sqoop(SQL-to-Hadoop)項目旨在協助RDBMS(Relational Database Management System:關係型資料庫管理系統)與Hadoop之間進行高效的大數據交流。用戶可以在 Sqoop 的幫助下,輕鬆地把關係型資料庫的數據導入到 Hadoop 與其相關的系統 (如HBase和Hive)中;同時也可以把數據從 Hadoop 系統里抽取並導出到關係型資料庫里。

Sqoop是一個在結構化數據和Hadoop之間進行批量數據遷移的工具,結構化數據可以是MySQL、Oracle等RDBMS。Sqoop底層用MapReduce程式實現抽取、轉換、載入,MapReduce天生的特性保證了並行化和高容錯率,而且相比Kettle等傳統ETL工具,任務跑在Hadoop集群上,減少了ETL伺服器資源的使用情況。在特定場景下,抽取過程會有很大的性能提升。

官網:https://sqoop.apache.org/
官方文檔:https://sqoop.apache.org/docs/1.99.7/index.html
GitHub:https://github.com/apache/sqoop

二、架構

sqoop的底層實現是mapreduce,所以sqoop依賴於hadoop,sqoop將導入或導出命令翻譯成MapReduce程式來實現,在翻譯出的MapReduce 中主要是對InputFormat和OutputFormat進行定製。

1)數據導入(RDBMS->Haoop)

  • sqoop會通過jdbc來獲取需要的資料庫的元數據信息,例如:導入的表的列名,數據類型。
  • 這些資料庫的數據類型會被映射成為java的數據類型,根據這些信息,sqoop會生成一個與表名相同的類用來完成序列化工作,保存表中的每一行記錄。
  • sqoop開啟MapReduce作業
  • 啟動的作業在input的過程中,會通過jdbc讀取數據表中的內容,這時,會使用sqoop生成的類進行序列化。
  • 最後將這些記錄寫到hdfs上,在寫入hdfs的過程中,同樣會使用sqoop生成的類進行反序列化。

2)數據導出(Haoop->RDBMS)

  • 首先sqoop通過jdbc訪問關係型資料庫獲取需要導出的信息的元數據信息
  • 根據獲取的元數據信息,sqoop生成一個Java類,用來承載數據的傳輸,該類必須實現序列化
  • 啟動MapReduce程式
  • sqoop利用生成的這個類,並行從hdfs中獲取數據
  • 每個map作業都會根據讀取到的導出表的元數據信息和讀取到的數據,生成一批insert 語句,然後多個map作業會並行的向MySQL中插入數據。

三、安裝

因為Sqoop依賴於hadoop服務,可以參考我之前的文章:大數據Hadoop原理介紹+安裝+實戰操作(HDFS+YARN+MapReduce)

Sqoop 作為一個二進位包發佈,包含兩個獨立的部分——客戶端和服務端。

  • 服務端——您需要在集群中的單個節點上安裝服務端。該節點將作為所有 Sqoop 客戶端的入口點。
  • 客戶端——客戶端可以安裝在任意數量的機器上。

將 Sqoop 安裝包複製到要運行 Sqoop 服務端的機器上。Sqoop 伺服器充當 Hadoop 客戶端,因此 Hadoop 庫(Yarn、Mapreduce 和 HDFS jar 文件)和配置文件(core-site.xml、mapreduce-site.xml,...)必須在此節點上可用。

1)下載

下載地址:http://archive.apache.org/dist/sqoop/

$ cd /opt/bigdata/hadoop/software/
$ wget http://archive.apache.org/dist/sqoop/1.99.7/sqoop-1.99.7-bin-hadoop200.tar.gz
$ tar -xf sqoop-1.99.7-bin-hadoop200.tar.gz -C /opt/bigdata/hadoop/server/

2)配置環境變數

# 創建第三方 jar包存放路徑
$ mkdir $SQOOP_HOME/lib
# 配置環境變數/etc/profile
export SQOOP_HOME=/opt/bigdata/hadoop/server/sqoop-1.99.7-bin-hadoop200
export PATH=$SQOOP_HOME/bin:$PATH
export SQOOP_SERVER_EXTRA_LIB=$SQOOP_HOME/lib
# 如果已經配置好了$HADOOP_HOME,就可以不用配置下麵的環境變數了,sqoop會自動去找
# sqoop hadoop環境配置
export HADOOP_COMMON_HOME=$HADOOP_HOME/share/hadoop/common
export HADOOP_HDFS_HOME=$HADOOP_HOME/share/hadoop/hdfs
export HADOOP_MAPRED_HOME=$HADOOP_HOME/share/hadoop/mapreduce
export HADOOP_YARN_HOME=$HADOOP_HOME/share/hadoop/yarn

$ source /etc/profile

3)配置sqoop代理用戶

先配置hadoop sqoop的代理用戶

$ vi $HADOOP_HOME/etc/hadoop/core-site.xml

<property>
  <name>hadoop.proxyuser.sqoop2.hosts</name>
  <value>*</value>
</property>
<property>
  <name>hadoop.proxyuser.sqoop2.groups</name>
  <value>*</value>
</property>

# 重新載入配置
$ hdfs dfsadmin -refreshSuperUserGroupsConfiguration

如果您在所謂的系統用戶下運行 Sqoop 2 伺服器(用戶 ID 小於min.user.id - 預設情況下為 1000),則預設情況下 YARN 將拒絕運行 Sqoop 2 作業。您需要將運行 Sqoop 2 伺服器的用戶名(很可能是用戶sqoop2)添加到container-executor.cfg的allowed.system.users屬性中。

當伺服器在sqoop2用戶下運行時,需要存在於container-executor.cfg文件中的示例片段:

# 創建sqoop2用戶
$ useradd sqoop2
# 添加配置
$ vi $HADOOP_HOME/etc/hadoop/container-executor.cfg
allowed.system.users=sqoop2

4)安裝JDBC

mysql驅動下載地址:https://repo1.maven.org/maven2/mysql/mysql-connector-java/,根據自己的mysql版本下載對應的驅動

$ cd $SQOOP_HOME/lib
$ wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.26/mysql-connector-java-8.0.26.jar
$ wget https://jdbc.postgresql.org/download/postgresql-42.3.4.jar

5)修改conf/sqoop.properties

org.apache.sqoop.submission.engine.mapreduce.configuration.directory=/opt/bigdata/hadoop/server/hadoop-3.3.1/etc/hadoop/

6)存儲庫初始化

首次啟動 Sqoop 2 伺服器之前,需要初始化元數據存儲庫。使用升級工具初始化存儲庫:

$ sqoop2-tool upgrade

【問題】derby的jar包版本過低報錯

Caused by: java.lang.SecurityException: sealing violation: package org.apache.derby.impl.jdbc.authentication is sealed

【解決】

# 刪掉sqoop2自帶的derby jar包
$ rm -f $SQOOP_HOME/server/lib/derby-*.jar
# 把hive的lib的jar copy到sqoop2 server lib目錄下
$ cp $HIVE_HOME/lib/derby-*.jar /$SQOOP_HOME/server/lib/

再初始化並驗證

$ sqoop2-tool upgrade
#驗證
$ sqoop2-tool verify

在當前目錄下會生產db目錄和log目錄

7)啟動sqoop服務端

$ sqoop2-server start
# 執行sqoop2-server stop會停止sqoop
# 查看進程
$ jps
# 查看埠,預設是12000,可以修改conf/sqoop.properties的org.apache.sqoop.jetty.port欄位來修改埠
$ netstat -tnlp|grep 12000

8)啟動sqoop客戶端

由於我現在是偽分散式,所以sqoop server和sqoop client都在一臺機器上,直接執行sqoop2-shell命令即可啟動sqoop客戶端

$ sqoop2-shell

發現啟動客戶端報錯了

【原因&解決】是因為jdk版本不匹配,重新下載jdk安裝
jdk下載地址:https://www.oracle.com/java/technologies/downloads/

$ cd /opt/bigdata/hadoop/software/
$ wget https://download.oracle.com/otn-pub/java/jdk/8u331-b09/165374ff4ea84ef0bbd821706e29b123/jdk-8u331-linux-x64.tar.gz
$ tar -xf jdk-8u331-linux-x64.tar.gz -C /opt/bigdata/hadoop/server/
# 在/etc/profile配置環境變數
export JAVA_HOME=/opt/bigdata/hadoop/server/jdk1.8.0_331
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

# 重新載入
$ source /etc/profile

重新啟動sqoop客戶端

$ sqoop2-shell
# 查看版本
show version --all
# 查看幫助
help

9)設置客戶端的各種屬性

Set 命令允許設置客戶端的各種屬性。與輔助命令類似,set 不需要連接到 Sqoop 伺服器。設置命令不用於重新配置 Sqoop 伺服器。

# 將sqoop包copy到其它機器,當作客戶端
$ scp -r /opt/bigdata/hadoop/server/sqoop-1.99.7-bin-hadoop200 hadoop-node2:/opt/bigdata/hadoop/server/
# 配置環境變數/etc/profile
export SQOOP_HOME=/opt/bigdata/hadoop/server/sqoop-1.99.7-bin-hadoop200
export PATH=$SQOOP_HOME/bin:$PATH

$ source /etc/profile

$ sqoop2-shell
# 設置埠,host,預設埠12000
set server --host hadoop-node1 --port 12000 --webapp sqoop
# 或者如下:
set server --url http://hadoop-node1:12000/sqoop
# 查看設置
show server --all

【溫馨提示】註意:當給出--url選項時,--host、--port或--webapp選項將被忽略。

參數 預設值 描述
-h, --host localhost 運行 Sqoop 伺服器的伺服器名稱 (FQDN)
-p, --port 12000
-w, --webapp sqoop Jetty 的 Web 應用程式名稱
-u, --url url 格式的 Sqoop 伺服器

四、簡單使用

1)常用命令

$ sqoop2-shell
# 查看幫助
help
# 配置服務
set server --url http://hadoop-node1:12000/sqoop
show server --all
# 顯示持久的作業提交對象
show submission
show submission --j jobName
show submission --job jobName --detail
# 顯示所有鏈接
show link
# 顯示連接器
show connector

2)數據從MYSQL導入到HDFS(Import)

1、 創建JDBC連接

$ sqoop2-shell
sqoop:000> set server --url http://hadoop-node1:12000/sqoop
# 先查看connector
sqoop:000> show connector
# 創建mysql連接
sqoop:000> create link -connector generic-jdbc-connector
Creating link for connector with name generic-jdbc-connector
Please fill following values to create new link object
Name: mysql-jdbc-link

Database connection

Driver class: com.mysql.cj.jdbc.Driver
Connection String: jdbc:mysql://hadoop-node1:3306/azkaban?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
Username: root
Password: ******
Fetch Size:
Connection Properties:
There are currently 0 values in the map:
entry#

SQL Dialect

Identifier enclose:
New link was successfully created with validation status OK and name mysql-jdbc-link
sqoop:000>

sqoop:000> show link
# 刪除
sqoop:000> delete link --name mysql-jdbc-link

2、創建HDFS連接

sqoop:000> create link -connector hdfs-connector
Creating link for connector with name hdfs-connector
Please fill following values to create new link object
Name: hdfs-link

HDFS cluster

URI: hdfs://hadoop-node1:8082
Conf directory: /opt/bigdata/hadoop/server/hadoop-3.3.1/etc/hadoop/
Additional configs::
There are currently 0 values in the map:
entry#
New link was successfully created with validation status OK and name hdfs-link

sqoop:000> show link

3、創建Job任務

首先先創建HDFS存儲目錄

$ hadoop fs -mkdir -p /user/sqoop2/output/
$ hadoop fs -chown -R sqoop2:sqoop2 /user/sqoop2/output/

再執行數據轉換

$ sqoop2-shell
sqoop:000> set server --url http://hadoop-node1:12000/sqoop
sqoop:000> show link
sqoop:000> create job -f "mysql-jdbc-link" -t "hdfs-link"
Name: mysql2hdfs
sqoop:000> show job


4、執行Job

sqoop:000> show job
sqoop:000> start job -n mysql2hdfs

在yarn平臺上查看

查看執行狀態是失敗的,查看有錯誤日誌,主要日誌如下:
【問題一】

java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils

【解決】
下載地址:https://commons.apache.org/proper/commons-lang/download_lang.cgi

$ cd $SQOOP_HOME/lib/
$ wget https://mirrors.tuna.tsinghua.edu.cn/apache//commons/lang/binaries/commons-lang-2.6-bin.tar.gz
$ tar -xf commons-lang-2.6-bin.tar.gz
# 將jar包放在mapreduce lib目錄,所有節點都得放,因為調度到哪台機器是隨機的
$ cp commons-lang-2.6/commons-lang-2.6.jar $HADOOP_HOME/share/hadoop/mapreduce/
# 網上說放在sqoop lib目錄下,應該也是可以的,但是也是所有節點需要放
# $ cp commons-lang-2.6/commons-lang-2.6.jar .
$ rm -fr commons-lang-2.6-bin.tar.gz commons-lang-2.6

# 重啟sqoop server
$ cd $SQOOP_HOME
$ sqoop2-server stop;sqoop2-server start
# 設置執行用戶
$ export HADOOP_USER_NAME=sqoop2

【問題二】hdfs賬號不允許假扮root用戶

Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): User: hdfs is not allowed to impersonate root

【解決】在core-sit-xml配置hdfs代理用戶

<property>
  <name>hadoop.proxyuser.hdfs.hosts</name>
  <value>*</value>
</property>
<property>
  <name>hadoop.proxyuser.hdfs.groups</name>
  <value>*</value>
</property>

重新載入配置生效

$ hdfs dfsadmin -refreshSuperUserGroupsConfiguration

再執行job

start job -n mysql2hdfs
# 查看狀態
status job -n mysql2hdfs
# 停止job
#stop job -n mysql2hdfs

去Yarn上查看執行情況

去HDFS上查看輸出

3)從HDFS導出到MYSQL(Export)

本來是想通過hive去轉換,但是現在沒有了hive的連接器了,所以這裡選擇通過hive去創建HDFS數據文件,通過HDFS轉出到mysql,當然也可以一步到位。

1、創建集群測試表和數據

# 準備數據文件
$ vi /tmp/sqoop-test-data
test01,北京
test02,上海
test03,廣州
test04,深圳
$ hive

sql語句如下:

-- hive創建測試庫
create database hive_sqoop_test_db;
-- hive創建一張表,預設是textfile類型的,通過逗號分隔欄位
create table hive_sqoop_test_db.test_table01(name string,address string) row format delimited fields terminated by ',';
# 從local載入數據,這裡的local是指hs2服務所在機器的本地linux文件系統
load data local inpath '/tmp/sqoop-test-data' into table hive_sqoop_test_db.test_table01;
select * from hive_sqoop_test_db.test_table01;

-- 當然也可以通過下麵方式創建,但是不提倡,因為很慢很慢
-- hive創建一張表,預設是textfile類型的
create table if not exists hive_sqoop_test_db.test_table01
(
name    string,
address string
);
# -- 創建測試數據
insert into hive_sqoop_test_db.test_table01 values('test01','北京');
insert into hive_sqoop_test_db.test_table01 values('test02','上海');
insert into hive_sqoop_test_db.test_table01 values('test02','廣州');
insert into hive_sqoop_test_db.test_table01 values('test02','深圳');
# 查詢驗證
select * from hive_sqoop_test_db.test_table01;

對應HDFS的文件:/user/hive/warehouse/hive_sqoop_test_db.db/test_table01/sqoop-test-data

2、創建MYSQL接收表

-- 創建測試庫
create database sqoop_test_db
-- 創建接收表
create table sqoop_test_db.test_table01
(
name varchar(10),
address varchar(10)
);

3、創建MYSQL連接

$ sqoop2-shell
sqoop:000> set server --url http://hadoop-node1:12000/sqoop
sqoop:000> show connector
sqoop:000> create link -connector generic-jdbc-connector
Name: hive2mysql-mysql-link
Driver class: com.mysql.cj.jdbc.Driver
Connection String: jdbc:mysql://hadoop-node1:3306/sqoop_test_db?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
Username: root
Password: 123456

4、創建HDFS連接

sqoop:000> create link -connector hdfs-connector
Name: hdfs2mysql-hdfs-link
URI: hdfs://hadoop-node1:8082
Conf directory: /opt/bigdata/hadoop/server/hadoop-3.3.1/etc/hadoop/

5、創建Job

sqoop:000> show link
sqoop:000> create job -f "hdfs2mysql-hdfs-link" -t "hive2mysql-mysql-link"
Name: hdfs2mysql-job
Input directory: hdfs://hadoop-node1:8082/user/hive/warehouse/hive_sqoop_test_db.db/test_table01/
Choose: 0
Schema name: sqoop_test_db
Table name: test_table01
Extractors: 1
Loaders: 1

6、開始執行Job

sqoop:000> start job -n hdfs2mysql-job
sqoop:000> status job -n hdfs2mysql-job

YARN上查看任務

去mysql上查看數據

4)通過JAVA實現數據從MYSQL導入到HDFS(Import)

1、先準備好數據源

CREATE DATABASE sqoop_test_db;
-- 必須設置一個主鍵,要不然會報錯
create table if not exists sqoop_test_db.test_table01
(
id INT Unsigned Primary Key AUTO_INCREMENT,
name    VARCHAR(20),
address VARCHAR(20)
);
# -- 創建測試數據
insert into sqoop_test_db.test_table01 values(1,'test01','北京');
insert into sqoop_test_db.test_table01 values(2,'test02','上海');
insert into sqoop_test_db.test_table01 values(3,'test03','廣州');
insert into sqoop_test_db.test_table01 values(4,'test04','深圳');

2、添加項目依賴

<dependency>
  <groupId>org.apache.sqoop</groupId>
  <artifactId>sqoop-client</artifactId>
  <version>1.99.7</version>
</dependency>

3、編寫java代碼

這裡實現的是HDFS=》MYSQL的數據轉換

import org.apache.commons.io.filefilter.FalseFileFilter;
import org.apache.sqoop.client.SqoopClient;
import org.apache.sqoop.common.SqoopException;
import org.apache.sqoop.model.*;
import org.apache.sqoop.validation.Status;

import javax.sound.midi.Soundbank;
import java.util.List;
import java.util.ResourceBundle;

/**
 * Import
 * mysql數據 導出 HDFS
 *
 */

public class Mysql2HDFS {
    public static void main(String[] args) {
        String url = "http://hadoop-node1:12000/sqoop/";
        SqoopClient client = new SqoopClient(url);

        String mysql_link_name = "java-mysql-link";
        String hdfs_link_name = "java-hdfs-link";

        // 獲取所有link
        List<MLink> links = client.getLinks();
        boolean mysql_link_isexist = Boolean.FALSE;
        boolean hdfs_link_isexist = Boolean.FALSE;
        for (MLink link : links) {
            if (!mysql_link_isexist && link.getName().equals(mysql_link_name)){
                mysql_link_isexist = Boolean.TRUE;
            }
            if (!hdfs_link_isexist && link.getName().equals(hdfs_link_name)){
                hdfs_link_isexist = Boolean.TRUE;
            }
            if (mysql_link_isexist && hdfs_link_isexist){
                break;
            }
        }

        /**
         * 1、創建mysql link
         */
        MLink mysql_link = client.createLink("generic-jdbc-connector");
        mysql_link.setName("java-mysql-link");
        mysql_link.setCreationUser("root");
        // 如果不存在就創建link
        if (!mysql_link_isexist){
            MLinkConfig mysql_linkConfig = mysql_link.getConnectorLinkConfig();
            System.out.println(mysql_linkConfig);
            // fill in the link config values
            mysql_linkConfig.getStringInput("linkConfig.jdbcDriver").setValue("com.mysql.cj.jdbc.Driver");
            mysql_linkConfig.getStringInput("linkConfig.connectionString").setValue("jdbc:mysql://hadoop-node1:3306/sqoop_test_db?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true");
            mysql_linkConfig.getStringInput("linkConfig.username").setValue("root");
            mysql_linkConfig.getStringInput("linkConfig.password").setValue("123456");
            mysql_linkConfig.getStringInput("dialect.identifierEnclose").setValue(" ");

            // 設置 primary key
            // mysql_linkConfig.getStringInput("linkConfig.partitionColumn").setValue("id");
            // save the link object that was filled
            Status mysql_status = client.saveLink(mysql_link);

            // 查看屬性
            // describe(client.getConnector("generic-jdbc-connector").getLinkConfig().getConfigs(), client.getConnectorConfigBundle("generic-jdbc-connector"));
            if(mysql_status.canProceed()) {
                System.out.println("Created Link with Link Name : " + mysql_link.getName());
            } else {
                System.out.println("Something went wrong creating the link");
            }
        }else {
            System.out.println("Link Name : " + mysql_link.getName() + " is exist");
        }

        /**
         * 2、創建hdfs link
         */
        MLink hdfs_link = client.createLink("hdfs-connector");
        hdfs_link.setName("java-hdfs-link");
        hdfs_link.setCreationUser("root");
        // 如果不存在就創建link
        if (!hdfs_link_isexist){
            // 創建hdfs link
            MLinkConfig hdfs_linkConfig = hdfs_link.getConnectorLinkConfig();
            hdfs_linkConfig.getStringInput("linkConfig.uri").setValue("hdfs://hadoop-node1:8082");
            hdfs_linkConfig.getStringInput("linkConfig.confDir").setValue("/opt/bigdata/hadoop/server/hadoop-3.3.1/etc/hadoop/");
            Status hdfs_status = client.saveLink(hdfs_link);
            if(hdfs_status.canProceed()) {
                System.out.println("Created Link with Link Name : " + hdfs_link.getName());
            } else {
                System.out.println("Something went wrong creating the link");
            }
        }else {
            System.out.println("Link Name : " + hdfs_link.getName() + " is exist");
        }

        /**
         * 3、創建job
         */
        String job_name = "java-mysql2hdfs";
        List<MJob> jobs = client.getJobs();

        boolean job_isexist = Boolean.FALSE;
        for (MJob job : jobs) {
            if (job.getName().equals(job_name)){
                job_isexist = Boolean.TRUE;
                break;
            }
        }
        MJob job = client.createJob(mysql_link_name, hdfs_link_name);
        job.setName("java-mysql2hdfs");

        job.setCreationUser("root");
        if (!job_isexist){
            // set the "FROM" link job config values
            MFromConfig fromJobConfig = job.getFromJobConfig();
            System.out.println(fromJobConfig);
            fromJobConfig.getStringInput("fromJobConfig.schemaName").setValue("sqoop_test_db");
            fromJobConfig.getStringInput("fromJobConfig.tableName").setValue("test_table01");

            // set the "TO" link job config values
            MToConfig toJobConfig = job.getToJobConfig();
            // 導出目錄是需要不存在的
            toJobConfig.getStringInput("toJobConfig.outputDirectory").setValue("hdfs://hadoop-node1:8082/tmp/output/");
            toJobConfig.getEnumInput("toJobConfig.outputFormat").setValue("TEXT_FILE");
            toJobConfig.getEnumInput("toJobConfig.compression").setValue("NONE");
            toJobConfig.getBooleanInput("toJobConfig.overrideNullValue").setValue(true);

            // set the driver config values
            MDriverConfig driverConfig = job.getDriverConfig();
            // System.out.println(driverConfig);
            driverConfig.getIntegerInput("throttlingConfig.numExtractors").setValue(1);
            // driverConfig.getIntegerInput("throttlingConfig.numLoaders").setValue(0);


            Status status = client.saveJob(job);
            if(status.canProceed()) {
                System.out.println("Created Job with Job Name: "+ job.getName());
            } else {
                System.out.println("Something went wrong creating the job");
                System.exit(0);
            }
        } else {
            System.out.println("Job Name : " + job.getName() + " is exist");
        }

        /**
         * 4、啟動job
         */
        MSubmission submission = client.startJob(job.getName());
        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());

    }

    /**
     * 輸出屬性信息
     * @param configs
     * @param resource
     */
    public static void  describe(List<MConfig> configs, ResourceBundle resource) {
        for (MConfig config : configs) {
            System.out.println(resource.getString(config.getLabelKey())+":");
            List<MInput<?>> inputs = config.getInputs();
            for (MInput input : inputs) {
                System.out.println(resource.getString(input.getLabelKey()) + " : " + input.getValue());
            }
            System.out.println();
        }
    }

}

查看AYRN任務

查看HDFS

這裡只用java代碼實現了MYSQL-》HDFS的轉換,HDFS-》MYSQL的轉換就留給小伙伴試試,其實也很簡單,稍微把我上面的代碼改一下就ok了,也可以對照上面第三個示例。有疑問的小伙伴歡迎給我留言,後續會有更多大數據相關的文章,請小伙伴耐心等待~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 分組和樹形結構是不一樣的。 樹形結構是以遞歸形式存在。分組是以鍵值對存在的形式,類似於GroupBy這樣的形式。 舉個例子 ID NAME SEX Class 1 張三 男 1 2 李四 女 2 3 王二 男 1 當以Sex為分組依據時則是 Key Value 男 1 張三 男 1 3 王二 男 1 ...
  • Docker compose 部署 nginx+php 拉取Docker鏡像 docker pull nginx:1.21.6 docker pull php:7.4.28-fpm 創建docker-compose 目錄 在home目錄下創建docker-nginx mkdir /home/dock ...
  • netstat是一個控制台命令,可用於監控本機的TCP/IP網路,獲得路由表、網路連接以及所有網路介面設備的狀態信息。一般情況下,我們主要使用netstat命令顯示與IP、TCP、UDP和ICMP協議相關的統計數據,檢驗本機各埠的網路連接情況。 比如說,在日常使用電腦時,如果連接到了網路,或多或少 ...
  • 參考別人的,自己記錄一下,怕丟失 修改方法:vim /etc/apt/sources.list,然後添加下麵對應的代碼區 中科大鏡像源 deb https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse ...
  • 前言 本篇博客將會詳細介紹 CSAPP 之 ShellLab 的完成過程,實現一個簡易(lou)的 shell。tsh 擁有以下功能: 可以執行外部程式 支持四個內建命令,名稱和功能為: quit:退出終端 jobs:列出所有後臺作業 bg <job>:繼續在後臺運行一個處於停止狀態的後臺作業,<j ...
  • 前置工作:安裝OpenBLAS; 安裝Mpich (可參考首頁博客) 官網下載壓縮包到/opt目錄 cd /opt && wget https://www.netlib.org/benchmark/hpl/hpl-2.3.tar.gz 解壓到 /opt 目錄 tar -xzf hpl-2.3.tar ...
  • 查看官網版本 https://www.mpich.org/downloads/ 最新的stable release是mpich 4.0.2,複製下載鏈接。 安裝依賴 mpich需要系列依賴,如果不確定缺少哪些依賴,可以在後續配置mpich時根據提示安裝缺少的依賴。 CentOS 7.9下安裝mpic ...
  • 概述 MongoDB 是一個介於關係型資料庫和非關係型資料庫之間的產品,是非關係型資料庫中功能最豐富,最像關係型資料庫的。 MongoDB 支持的數據結構非常鬆散,類似 json 的 bson 格式,因此可以存儲比較複雜的數據類型。MongoDB 最大的特點是支持的查詢語言非常強大,語法類似於面向對 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...