1. 程式人生 > >使用Sqoop實現RDS MySQL到Redshift的資料同步

使用Sqoop實現RDS MySQL到Redshift的資料同步

希臘有一個著名的谷堆悖論。“如果1粒穀子落地不能形成谷堆,2粒穀子落地不能形成谷堆,3粒穀子落地也不能形成谷堆,依此類推,無論多少粒穀子落地都不能形成谷堆。但是,事實並非如此。”
這個悖論說的,就是告訴我們量變產生質變,需要一個明顯的分割線。如果說,量是一個量化的資料,質是一個結論的話。那麼,資料分析做的,就是要分析量,從而引向“定性”、”定質”。定量的瞭解歷史的規律(“質”),從而預測未來。
近幾年,大資料風靡全球,越來越多的企業利用MapReduce,Hive,Spark等計算框架和工具來為自身的業務提供幫助,在AWS上,我們也提供了諸多的服務,幫助使用者能夠快速地構建起適合自身需求的大資料分析架構,其中,Amazon Redshift是效能優異並且完全託管的PB級別資料倉庫服務,提供了標準SQL資料庫訪問介面,並且可以十分方便地與現有的主流商業智慧資料分析工具整合,構建企業級資料倉庫。

然而,大部分企業的核心資料都儲存在關係型資料庫中,如何能夠有效地將這部分存量資料以及後續的增量資料匯入Redshift中呢?本文介紹一種使用開源的Apache Sqoop工具,幫助我們輕鬆實現這一過程。

配置步驟:

第一步 準備工作

1.1 修改MySQL中的表結構

為了能夠實現增量同步,需要在MySQL表中增加一列時間戳,該列能夠自動記錄行被插入更新的時間
為了能夠實現同步刪除操作,需要在MySQL表中增加一列刪除記號列,應用對資料庫的刪除通過標記該列完成,而不是通過傳統的delete語句,因為通常對於曾經存在過的資料,也有分析的意義

本例需要同步的表為country,orders,user,其中country表為Mycat中的全域性表,在兩臺RDS mysql1和mysql2中都有全部資訊,orders和user表為Mycat中的分片表,資訊分佈在RDS mysql1和mysql2中

mycat_sequence表是用於記錄其他表自增欄位資訊的功能表,無需同步到Redshift中分析

執行如下語句新增兩列

alter table country add ifdelete boolean NOT NULL default 0;
alter table country add lastmodified TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMEST AMP;

1.2 建立EMR叢集

注意勾選上Hive和Sqoop,同時目前AWS EMR最新的版本為5.4.0,其中對一些元件的版本進行了更新,不過Hive和Sqoop的版本與本文一致

注意選擇相應的VPC和子網,子網需要有internet的路由方便之後ssh登入

選擇登入的金鑰對,Master安全組使用預設的ElasticMapReduce-master,不用修改

啟動EMR集群后,修改Master節點的安全組,新增允許公網ssh訪問

在EMR介面獲取master節點ssh登入的資訊

1.3 建立Redshift資料倉庫

首先建立Redshift使用的安全組,放行所有源訪問5439埠的許可權

分別在cn-north-1a和cn-north-1b兩個可用區中建立兩個子網給Redshift使 用,由於之後會通過公網連線Redshift,這兩個子網需要有到internet的路由

在Redshift中建立子網組,選上之前建立的兩個子網組

建立Redshift引數組

建立Redshift叢集例項

選擇之前建立的引數組,VPC,子網組和安全組,開啟公網訪問

獲取連線Redshift的JDBC驅動及連線的URL資訊

驅動如果無法下載,也可以從如下連線下載

1.4 建立並儲存access key和secret access key

之後從 S3 中同步資料到Redshift時需要提供access key和secret access key資訊,這邊測試時可以全部放開許可權

在IAM中增加一個使用者並賦予許可權

下載存有access key和secret access key的CSV檔案

1.5 建立S3的bucket桶

S3會作為Hive表的底層儲存

第二步 建立Hive表

Hive表為RDS到Redshift資料同步的中間表,底層使用S3作為儲存,另外由於Hive的表名不能是user,這裡使用users

exit; 退出hive

第三步 安裝MySQL JDBC驅動(可選)

下載安裝JDBC驅動,最新版的EMR不需要,如果在執行Sqoop的時候報找不到驅動時需要手動安裝

ssh登入EMR的master節點

tar xzvf mysql-connector-java-5.1.40.tar.gz

cp mysql-connector-java-5.1.40/ mysql-connector-java-5.1.40-bin.jar /usr/bin/sqoop/lib/

第四步 修改java許可權,否則執行Sqoop job會有warning和error

vim /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.29.amzn1.86_64/jre/lib/security/java.policy
在grant{}中新增如下語句

permission javax.management.MBeanTrustPermission “register”;

第五步 配置Sqoop

5.1 建立Sqoop訪問資料庫的密碼,XXXXXX 為建立RDS mysql1和mysql2時賦予的賬號密碼

echo –n “XXXXXX” > /home/hadoop/sqoop.password

5.2 建立並執行Sqoop任務

其中由於country表是全域性表,所以這裡只是從mysql1的read replica讀副本中同步,而user和orders表由於是分片表,所以需要分別從mysql1和mysql2各自的讀副本中同步資料
需要注意修改如下指令中的URL為自己RDS讀副本的URL,同時,對於user和orders,兩條sqoop job是不同的,第一條job中通過hive-overwrite引數覆蓋上一次job執行後遺留在Hive表中的資料,第二條job是沒有hive-overwrite引數的,否則會把上一條job從mysql1中同步的資料錯誤地刪除

下面進行第一次同步,分別執行如下命令將RDS中的資料同步到Hive表中,第一次執行是全備,根據表中資料量,時間可能較長

sqoop job –exec mysql1_country

sqoop job –exec mysql1_user

sqoop job –exec mysql2_user

sqoop job –exec mysql1_orders

sqoop job –exec mysql2_orders

進入Hive,查看錶是否同步成功

第六步 將Hive表中的資料同步到Redshift中

使用JDBC客戶端連線Redshift,這裡使用SQL Workbench
分別建立country,user,orders表及各自的中間表,同時將Hive存在S3中的資料同步到中間表中,其中aws_access_key_id和aws_secret_access_key為準備工作中在IAM下載的CSV中的值

檢視stage表中的資訊是否同步正確

通過如下事務插入更新country,users,orders表,並刪除中間表

檢視資料是否正確插入更新到country,users,orders表中

第七步 執行增量同步

人為對MySQL中的表進行適當的增刪改操作,本例對country表執行插入操作, 對user表執行插入和更新操作,對orders表執行刪除操作,注意到時間戳為操作執行時的時間

ssh登入EMR的master節點,再次執行sqoop job將MySQL中插入更新的資料同步到Hive表中
sqoop job –exec mysql1_country

sqoop job –exec mysql1_user

sqoop job –exec mysql2_user

sqoop job –exec mysql1_orders

sqoop job –exec mysql2_orders

在Sqoop執行輸出中可以看到,sqoop job會記錄之前執行任務的時間,並調整where語句來實現增量同步資料,所以如果需要多次測試,需要刪除job(sqoop job –delete XXX)並重新建立,這樣會再次全量同步

進入Hive,檢視增量資料是否同步成功

使用SQL Workbench通過JDBC連線Redshift,執行如下命令將增量資料同步到中間表

執行如下事務將中間表的資料插入更新到country,users,orders表中

檢視資料是否正確插入更新到country,users,orders表中

之後在Redshift中的分析語句都可以通過新增where ifdelete=false排除刪除的記錄,同時可以定期刪除ifdelete標記為false的記錄,釋放儲存空間

作者介紹:

餘駿

AWS解決方案架構師,負責基於AWS的雲端計算方案架構的諮詢和設計,同時致力於AWS雲服務在國內的應用和推廣。在加入AWS之前,他在思科中國擔任系統工程師,負責方案諮詢和架構設計,在企業私有云和基礎網路方面有豐富經驗。

相關推薦

使用Sqoop實現RDS MySQL到Redshift的資料同步

希臘有一個著名的谷堆悖論。“如果1粒穀子落地不能形成谷堆,2粒穀子落地不能形成谷堆,3粒穀子落地也不能形成谷堆,依此類推,無論多少粒穀子落地都不能形成谷堆。但是,事實並非如此。” 這個悖論說的,就是告訴我們量變產生質變,需要一個明顯的分割線。如果說,量是一個量化的資料,質是一個結論的話。那麼

Rsync 實現window伺服器資料同步備份到Linux伺服器

公司最近window伺服器各種磁碟告警,都是老機器了,一時半會也沒有新機器來擴容,於是我就想把MySQL的每日全量檔案備份到Linux新機器上(別問為啥是每日全量,歷史問題); 查詢了下方案,大致分為兩類: 1、FTP/SSH等方式直接同步;服務端主動推送 2、通過第三方客戶端同步,

讓天下沒有難用的資料庫 » 如何將RDS資料同步到本地自建資料庫

長期以來有很多的使用者諮詢如何將RDS的資料同步到本地的資料庫環境中,本篇文章以在阿里雲的ECS伺服器為例來說明如何將RDS的資料同步到本地資料庫中。RDS對外提供服務是一個DNS地址+埠3306,這樣就遮蔽了RDS後端的主從節點,那麼該如何將資料同步到本地?那麼我們來看一下RDS的主從架構: 應

centos7 下安裝canal,並實現將mysql資料同步到redis

簡介:canal為阿里巴巴產品,它主要模擬了mysql的Slave向Master傳送請求,當mysql有增刪改查時則會出發請求將資料傳送到canal服務中,canal將資料存放到記憶體,直到客戶端程式(canal服務端和客戶端程式都是由java編寫,且客戶端邏輯由我們藉助c

mysql建立觸發器實現相同伺服器下不同庫的表資料同步的錯誤收集

1、建立INSERT|UPDATE時,由於沒有加上declare和set語句,導致同步表中的大部分資料為null。 解決:參照建立MYSQL TRIGGER 2、1363 - There is no NEW row in on DELETE trigger 原因:delete觸發器不

mysql建立TRIGGER觸發器實現相同伺服器下不同庫的表資料同步

實現功能:mysql建立INSERT|UPDATE|DELETE觸發器實現相同伺服器下不同庫的表資料同步。比如table1表的資料有insert|update|delete操作,便同步到sync表中。然後再根據sync表中state(同步狀態)和oper(操作方式)欄位的狀態將sync表

ElasticSearch5+logstash的logstash-input-jdbc實現mysql資料同步

在實現的路上遇到了各種坑,再次驗證官方文件只能產考不能全信! ElasticSearch安裝就不說了上一篇有說! 安裝logstash 官方:https://www.elastic.co/guide/en/logstash/current/installing-logstash.html 1

Sqoop與HDFS、Hive、Hbase等系統的資料同步操作

Sqoop與HDFS結合         下面我們結合 HDFS,介紹 Sqoop 從關係型資料庫的匯入和匯出。 Sqoop import        

實現兩個資料庫之間的資料同步

不同伺服器資料庫之間的資料操作   --建立連結伺服器  exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '遠

Gearman實現Mysql到Redis的資料同步

Gearman實現Mysql到Redis的資料同步 Gearman 是一個支援分散式的任務分發框架: Gearman Job Server: Gearman 核心程式,需要編譯安裝並以守護程序形式執行在後臺。 Gearman Client:可以理解為任務的請求者。 Gearman W

Memcached實現MySQL資料同步

一、介紹 1、Memcached介紹 Memcached 是一個高效能的分散式記憶體物件快取系統,用於動態Web應用以減輕資料庫負載。它通過在記憶體中快取資料和物件來減少讀取資料庫的次數,從而提高動態、資料庫驅動網站的速度。Memcached基於一個儲存鍵/值對的hashm

分散式站點資料同步機制的設計與實現[出自別處]

摘要:在網際網路蓬勃發展的今天,把集團公司下的各個水電站的資料同步起來,統一管理的需求日益突顯。本公司首先採用了oracle公司自身提供的解決方案高階複製技術,但限於本國網速緩慢網路時常斷線的不穩定的狀態的特殊國情,實施效果不盡如人意。針對我國苛刻的網路條件,本公司努力研發,自主地設計了一套低網速資料同步系統

使用Sqlserver事務釋出實現資料同步

下載網站:www.SyncNavigator.CN   客服QQ1793040 ----------------------------------------------------------     關於HKROnline

ElasticSearch5+logstash-input-jdbc實現mysql資料同步及躺坑彙總

轉載來源 http://www.cnblogs.com/phpshen/p/6098333.html ElasticSearch安裝就不說了上一篇有說! 安裝logstash 官方:https://www.elastic.co/guide/en/logstash/cur

實現資料同步 -----將post, get 碼雲私有倉庫

# -*- coding: utf-8 -*- import requests import sqlite3 import time from demo_handle import sql_handle from bs4 import BeautifulSoup class post: d

實現MySQL資料同步到ElasticSearch中

一、場景 筆者最近在寫全文搜尋引擎服務,用到的是ElasticSearch框架,該篇部落格就如何實現MySQL資料同步到ES中進行闡述 二、解決方案 執行系統:mac系統下 採用到的技術:ES2.4、logstash-2.4.1 用到的相關外掛:ES-head、logst

面試題(redis master和slave是怎麼實現資料同步的)

Redis的主從同步機制可以確保redis的master和slave之間的資料同步。按照同步內容的多少可以分為全同步和部分同步;按照同步的時機可以分為slave剛啟動時的初始化同步和正常執行過程中的資料修改同步;本文將對這兩種機制的流程進行分析。 全備份過程中,在sla

基於Webservice API 的資料同步的reset的實現

1、資料庫A主鍵增長值2  資料庫B主鍵增長值2 2、設計資料庫A的公共API 3、呼叫的實現  SqlConnection myconn = new SqlConnection("server=.;databa

資料庫中兩張表之間的資料同步實現思路(增加、刪除、更新)Mysql、sqlserver

分別建立增加、刪除、更新的觸發器(Trigger)來達到兩張表之間資料同步的目的。 1:資料同步增加:如有兩張表——A表和B表,建立觸發器使當A表插入資料後B表也同步插入資料。其中B表插入資料的欄位需要同A表中的欄位相對應。 CREATE TRIGGER 觸發器名稱 ON A表 AFTER INSERT

關於資料同步的幾種實現

關於資料同步的幾種實現 轉載:https://blog.csdn.net/xuemoyao/article/details/14002209概述 關於資料同步主要有兩個層面的同步,一是通過後臺程式編碼實現資料同步,二是直接作用於資料庫,在資料庫層面實現資料的同步。通過程式編碼實現資料同步,其主要的實現思路