บทช่วยสอน HDFS สำหรับนักวิเคราะห์ข้อมูลติดอยู่กับฐานข้อมูลเชิงสัมพันธ์
เผยแพร่แล้ว: 2022-03-11บทนำ
ถึงตอนนี้ คุณอาจเคยได้ยินเกี่ยวกับ Hadoop Distributed File System (HDFS) โดยเฉพาะอย่างยิ่งหากคุณเป็นนักวิเคราะห์ข้อมูลหรือผู้ที่รับผิดชอบในการย้ายข้อมูลจากระบบหนึ่งไปยังอีกระบบหนึ่ง อย่างไรก็ตาม ประโยชน์ของ HDFS ที่มีต่อฐานข้อมูลเชิงสัมพันธ์คืออะไร
HDFS เป็นโซลูชันโอเพ่นซอร์สที่ปรับขนาดได้สำหรับการจัดเก็บและประมวลผลข้อมูลปริมาณมาก HDFS ได้รับการพิสูจน์แล้วว่าเชื่อถือได้และมีประสิทธิภาพในศูนย์ข้อมูลที่ทันสมัยหลายแห่ง
HDFS ใช้ฮาร์ดแวร์สินค้าโภคภัณฑ์พร้อมกับซอฟต์แวร์โอเพ่นซอร์สเพื่อลดต้นทุนโดยรวมต่อไบต์ของการจัดเก็บ
ด้วยการจำลองแบบในตัวและความยืดหยุ่นต่อความล้มเหลวของดิสก์ HDFS จึงเป็นระบบในอุดมคติสำหรับการจัดเก็บและประมวลผลข้อมูลสำหรับการวิเคราะห์ ไม่ต้องการการสนับสนุนและค่าใช้จ่ายเพื่อสนับสนุนการทำธุรกรรม atomicity, ความสอดคล้อง, การแยกและความทนทาน (ACID) ตามความจำเป็นกับระบบฐานข้อมูลเชิงสัมพันธ์แบบดั้งเดิม
ยิ่งไปกว่านั้น เมื่อเปรียบเทียบกับฐานข้อมูลขององค์กรและเชิงพาณิชย์ เช่น Oracle การใช้ Hadoop เป็นแพลตฟอร์มการวิเคราะห์จะช่วยหลีกเลี่ยงค่าใช้จ่ายในการออกใบอนุญาตเพิ่มเติม
หนึ่งในคำถามที่หลายคนถามเมื่อเรียนรู้เกี่ยวกับ HDFS เป็นครั้งแรกคือ ฉันจะรับข้อมูลที่มีอยู่ไปยัง HDFS ได้อย่างไร
ในบทความนี้ เราจะตรวจสอบวิธีการนำเข้าข้อมูลจากฐานข้อมูล PostgreSQL ไปยัง HDFS เราจะใช้ Apache Sqoop ซึ่งปัจจุบันเป็นโซลูชันโอเพ่นซอร์สที่มีประสิทธิภาพมากที่สุดในการถ่ายโอนข้อมูลระหว่าง HDFS และระบบฐานข้อมูลเชิงสัมพันธ์ Apache Sqoop ออกแบบมาเพื่อโหลดข้อมูลจำนวนมากจากฐานข้อมูลเชิงสัมพันธ์ไปยัง HDFS (นำเข้า) และเพื่อเขียนข้อมูลจำนวนมากจาก HDFS ไปยังฐานข้อมูลเชิงสัมพันธ์ (ส่งออก)
ขั้นตอนในบทช่วยสอนนี้เขียนขึ้นสำหรับผู้ที่มีความรู้พื้นฐานเกี่ยวกับการดำเนินการสืบค้น SQL และความรู้เบื้องต้นเกี่ยวกับคำสั่ง HDFS
ระบบฐานข้อมูลที่ใช้คือ PostgreSQL 9.5 สำหรับ Windows และเวอร์ชัน HDFS คือ Cloudera Hadoop 2.5.0-cdh5.2.0 บนเครื่องเสมือน Centos 6.4 Linux
Apache Sqoop ใช้ไฟล์ JAR ของไดรเวอร์ JDBC เฉพาะสำหรับผู้จำหน่ายฐานข้อมูลเชิงสัมพันธ์และเวอร์ชันฐานข้อมูล
ในการดำเนินการตามขั้นตอนที่แสดงในบทความนี้ ผู้ใช้จะต้องได้รับสิทธิ์ในการเชื่อมต่อระยะไกลกับฐานข้อมูล PostgreSQL, สิทธิ์ SELECT
บนฐานข้อมูลเชิงสัมพันธ์, สิทธิ์ในการเขียนบน HDFS และดำเนินการสิทธิ์บนไฟล์สั่งการ Sqoop
สำหรับจุดประสงค์ของบทช่วยสอนนี้ เราได้สร้างฐานข้อมูล PostgreSQL ตั้งชื่อว่า Toptal และทำให้สามารถเข้าถึงได้ผ่านพอร์ต 5432
แหล่งข้อมูล PostgreSQL
ในการเริ่มต้น ในฐานข้อมูล PostgreSQL Toptal
เราจะสร้างตารางข้อมูลทดสอบชื่อ sales
เราจะถือว่าใบรับรอง OpenSSL และไฟล์คีย์ส่วนตัวมีอยู่แล้วในเซิร์ฟเวอร์ PostgreSQL
Server [localhost]: Database [postgres]: Toptal Port [5432]: Username [postgres]: Password for user postgres: psql (9.5.3) Toptal=# create table sales Toptal-# ( Toptal(# pkSales integer constraint salesKey primary key, Toptal(# saleDate date, Toptal(# saleAmount money, Toptal(# orderID int not null, Toptal(# itemID int not null Toptal(# ); CREATE TABLE
ต่อไปเราจะแทรก 20 แถวลงในตาราง:
Toptal=# insert into sales values (1, '2016-09-27', 1.23, 1, 1); INSERT 0 1 Toptal=# insert into sales values (2, '2016-09-27', 2.34, 1, 2); INSERT 0 1 Toptal=# insert into sales values (3, '2016-09-27', 1.23, 2, 1); INSERT 0 1 Toptal=# insert into sales values (4, '2016-09-27', 2.34, 2, 2); INSERT 0 1 Toptal=# insert into sales values (5, '2016-09-27', 3.45, 2, 3); INSERT 0 1 Toptal=# insert into sales values (6, '2016-09-28', 3.45, 3, 3); INSERT 0 1 Toptal=# insert into sales values (7, '2016-09-28', 4.56, 3, 4); INSERT 0 1 Toptal=# insert into sales values (8, '2016-09-28', 5.67, 3, 5); INSERT 0 1 Toptal=# insert into sales values (9, '2016-09-28', 1.23, 4, 1); INSERT 0 1 Toptal=# insert into sales values (10, '2016-09-28', 1.23, 5, 1); INSERT 0 1 Toptal=# insert into sales values (11, '2016-09-28', 1.23, 6, 1); INSERT 0 1 Toptal=# insert into sales values (12, '2016-09-29', 1.23, 7, 1); INSERT 0 1 Toptal=# insert into sales values (13, '2016-09-29', 2.34, 7, 2); INSERT 0 1 Toptal=# insert into sales values (14, '2016-09-29', 3.45, 7, 3); INSERT 0 1 Toptal=# insert into sales values (15, '2016-09-29', 4.56, 7, 4); INSERT 0 1 Toptal=# insert into sales values (16, '2016-09-29', 5.67, 7, 5); INSERT 0 1 Toptal=# insert into sales values (17, '2016-09-29', 6.78, 7, 6); INSERT 0 1 Toptal=# insert into sales values (18, '2016-09-29', 7.89, 7, 7); INSERT 0 1 Toptal=# insert into sales values (19, '2016-09-29', 7.89, 8, 7); INSERT 0 1 Toptal=# insert into sales values (20, '2016-09-30', 1.23, 9, 1); INSERT 0 1
มาเลือกข้อมูลเพื่อตรวจสอบว่าข้อมูลถูกต้องหรือไม่:
Toptal=# select * from sales; pksales | saledate | saleamount | orderid | itemid ---------+------------+------------+---------+-------- 1 | 2016-09-27 | $1.23 | 1 | 1 2 | 2016-09-27 | $2.34 | 1 | 2 3 | 2016-09-27 | $1.23 | 2 | 1 4 | 2016-09-27 | $2.34 | 2 | 2 5 | 2016-09-27 | $3.45 | 2 | 3 6 | 2016-09-28 | $3.45 | 3 | 3 7 | 2016-09-28 | $4.56 | 3 | 4 8 | 2016-09-28 | $5.67 | 3 | 5 9 | 2016-09-28 | $1.23 | 4 | 1 10 | 2016-09-28 | $1.23 | 5 | 1 11 | 2016-09-28 | $1.23 | 6 | 1 12 | 2016-09-29 | $1.23 | 7 | 1 13 | 2016-09-29 | $2.34 | 7 | 2 14 | 2016-09-29 | $3.45 | 7 | 3 15 | 2016-09-29 | $4.56 | 7 | 4 16 | 2016-09-29 | $5.67 | 7 | 5 17 | 2016-09-29 | $6.78 | 7 | 6 18 | 2016-09-29 | $7.89 | 7 | 7 19 | 2016-09-29 | $7.89 | 8 | 7 20 | 2016-09-30 | $1.23 | 9 | 1 (20 rows)
ข้อมูลดูดีดังนั้นไปต่อ
นำเข้าไปยัง HDFS โดยใช้ Sqoop
ด้วยการกำหนดแหล่งข้อมูล เราพร้อมที่จะนำเข้าข้อมูลไปยัง HDFS แล้ว คำสั่ง sqoop
ที่เราจะตรวจสอบแสดงอยู่ด้านล่าง และเราจะแยกย่อยแต่ละอาร์กิวเมนต์ในหัวข้อย่อยที่ตามมา โปรดทราบว่าคำสั่งควรอยู่ในบรรทัดเดียวหรือตามที่แสดงด้านล่าง โดยมีแบ็กสแลช (อักขระต่อเนื่องของบรรทัดคำสั่ง Linux) ที่ส่วนท้ายของแต่ละบรรทัด ยกเว้นบรรทัดสุดท้าย
sqoop import --connect 'jdbc:postgresql://aaa.bbb.ccc.ddd:5432/Toptal?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory' \ --username 'postgres' -P \ --table 'sales' \ --target-dir 'sales' \ --split-by 'pksales'
-
sqoop import
- ชื่อเรียกsqoop
และเรากำลังแนะนำให้นำเข้าข้อมูลจากตารางหรือมุมมองจากฐานข้อมูลไปยัง HDFS -
--connect
- ด้วย--connect
อาร์กิวเมนต์ เรากำลังส่งผ่านสตริงการเชื่อมต่อ JDBC สำหรับ PostgreSQL ในกรณีนี้ เราใช้ที่อยู่ IP หมายเลขพอร์ต และชื่อฐานข้อมูล เรายังจำเป็นต้องระบุด้วยว่ามีการใช้ SSL และจำเป็นต้องจัดหาคลาสSSLSocketFactory
เพื่อใช้งาน - --
--username
ผู้ใช้ - ในตัวอย่างนี้ ชื่อผู้ใช้คือการเข้าสู่ระบบ PostgreSQL ไม่ใช่การเข้าสู่ระบบ Windows ผู้ใช้ต้องมีสิทธิ์ในการเชื่อมต่อกับฐานข้อมูลที่ระบุและเลือกจากตารางที่ระบุ -
-P
- คำสั่งนี้จะแจ้งให้ผู้ใช้บรรทัดคำสั่งป้อนรหัสผ่าน หากใช้งาน Sqoop น้อยมาก นี่อาจเป็นตัวเลือกที่ดี มีหลายวิธีในการส่งผ่านรหัสผ่านไปยังคำสั่งโดยอัตโนมัติ แต่เราพยายามทำให้มันง่ายสำหรับบทความนี้ -
--table
- นี่คือที่ที่เราส่งผ่านในชื่อของตาราง PostgreSQL -
--target-dir
- อาร์กิวเมนต์นี้ระบุไดเร็กทอรี HDFS ที่จะเก็บข้อมูล -
--split-by
- เราต้องจัดเตรียม Sqoop ด้วยตัวระบุที่ไม่ซ้ำกัน เพื่อช่วยกระจายปริมาณงาน ต่อมาในผลลัพธ์ของงาน เราจะเห็นว่า Sqoop เลือกค่าต่ำสุดและสูงสุดไว้ที่ใดเพื่อช่วยกำหนดขอบเขตแยก
เป็นความคิดที่ดีที่จะใส่คำสั่งในสคริปต์เพื่อวัตถุประสงค์ในการทำซ้ำและแก้ไขดังที่แสดงด้านล่าง:
[hdfs@localhost:/sqoop]$ cat sqoopCommand.sh sqoop import --connect 'jdbc:postgresql://aaa.bbb.ccc.ddd:5432/toptal?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory' \ --username 'postgres' -P \ --table 'sales' \ --target-dir 'sales' \ --split-by 'pksales' [hdfs@localhost:/sqoop]$
ถึงเวลารันสคริปต์คำสั่ง Sqoop ด้านบนแล้ว ผลลัพธ์จากคำสั่ง Sqoop แสดงอยู่ด้านล่าง
[hdfs@localhost:/sqoop]$ ./sqoopCommand.sh 16/10/02 18:58:34 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5-cdh5.2.0 Enter password: 16/10/02 18:58:40 INFO manager.SqlManager: Using default fetchSize of 1000 16/10/02 18:58:40 INFO tool.CodeGenTool: Beginning code generation 16/10/02 18:58:41 INFO manager.SqlManager: Executing SQL statement: SELECT t.* FROM "sales" AS t LIMIT 1 16/10/02 18:58:41 INFO orm.CompilationManager: HADOOP_MAPRED_HOME is /usr/lib/hadoop-0.20-mapreduce Note: /tmp/sqoop-training/compile/77f9452788024792770d52da72ae871f/sales.java uses or overrides a deprecated API. Note: Recompile with -Xlint:deprecation for details. 16/10/02 18:58:43 INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-training/compile/77f9452788024792770d52da72ae871f/sales.jar 16/10/02 18:58:43 WARN manager.PostgresqlManager: It looks like you are importing from postgresql. 16/10/02 18:58:43 WARN manager.PostgresqlManager: This transfer can be faster! Use the --direct 16/10/02 18:58:43 WARN manager.PostgresqlManager: option to exercise a postgresql-specific fast path. 16/10/02 18:58:43 INFO mapreduce.ImportJobBase: Beginning import of sales 16/10/02 18:58:45 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same. 16/10/02 18:58:46 INFO db.DBInputFormat: Using read commited transaction isolation 16/10/02 18:58:46 INFO db.DataDrivenDBInputFormat: BoundingValsQuery: SELECT MIN("pksales"), MAX("pksales") FROM "sales" 16/10/02 18:58:47 INFO mapred.JobClient: Running job: job_201609280401_0005 16/10/02 18:58:48 INFO mapred.JobClient: map 0% reduce 0% 16/10/02 18:59:04 INFO mapred.JobClient: map 50% reduce 0% 16/10/02 18:59:14 INFO mapred.JobClient: map 75% reduce 0% 16/10/02 18:59:15 INFO mapred.JobClient: map 100% reduce 0% 16/10/02 18:59:18 INFO mapred.JobClient: Job complete: job_201609280401_0005 16/10/02 18:59:18 INFO mapred.JobClient: Counters: 23 16/10/02 18:59:18 INFO mapred.JobClient: File System Counters 16/10/02 18:59:18 INFO mapred.JobClient: FILE: Number of bytes read=0 16/10/02 18:59:18 INFO mapred.JobClient: FILE: Number of bytes written=1190344 16/10/02 18:59:18 INFO mapred.JobClient: FILE: Number of read operations=0 16/10/02 18:59:18 INFO mapred.JobClient: FILE: Number of large read operations=0 16/10/02 18:59:18 INFO mapred.JobClient: FILE: Number of write operations=0 16/10/02 18:59:18 INFO mapred.JobClient: HDFS: Number of bytes read=438 16/10/02 18:59:18 INFO mapred.JobClient: HDFS: Number of bytes written=451 16/10/02 18:59:18 INFO mapred.JobClient: HDFS: Number of read operations=4 16/10/02 18:59:18 INFO mapred.JobClient: HDFS: Number of large read operations=0 16/10/02 18:59:18 INFO mapred.JobClient: HDFS: Number of write operations=4 16/10/02 18:59:18 INFO mapred.JobClient: Job Counters 16/10/02 18:59:18 INFO mapred.JobClient: Launched map tasks=4 16/10/02 18:59:18 INFO mapred.JobClient: Total time spent by all maps in occupied slots (ms)=48877 16/10/02 18:59:18 INFO mapred.JobClient: Total time spent by all reduces in occupied slots (ms)=0 16/10/02 18:59:18 INFO mapred.JobClient: Total time spent by all maps waiting after reserving slots (ms)=0 16/10/02 18:59:18 INFO mapred.JobClient: Total time spent by all reduces waiting after reserving slots (ms)=0 16/10/02 18:59:18 INFO mapred.JobClient: Map-Reduce Framework 16/10/02 18:59:18 INFO mapred.JobClient: Map input records=20 16/10/02 18:59:18 INFO mapred.JobClient: Map output records=20 16/10/02 18:59:18 INFO mapred.JobClient: Input split bytes=438 16/10/02 18:59:18 INFO mapred.JobClient: Spilled Records=0 16/10/02 18:59:18 INFO mapred.JobClient: CPU time spent (ms)=3980 16/10/02 18:59:18 INFO mapred.JobClient: Physical memory (bytes) snapshot=481574912 16/10/02 18:59:18 INFO mapred.JobClient: Virtual memory (bytes) snapshot=2949685248 16/10/02 18:59:18 INFO mapred.JobClient: Total committed heap usage (bytes)=127401984 16/10/02 18:59:18 INFO mapreduce.ImportJobBase: Transferred 451 bytes in 33.7555 seconds (13.3608 bytes/sec) 16/10/02 18:59:18 INFO mapreduce.ImportJobBase: Retrieved 20 records. [hdfs@localhost:/sqoop]$
สังเกตว่าบรรทัดสุดท้ายของเอาต์พุตด้านบนแสดงว่ามีการดึงข้อมูล 20 รายการ ซึ่งสอดคล้องกับ 20 รายการในตารางในฐานข้อมูล PostgreSQL

หลังจากรันคำสั่ง Sqoop เราสามารถรันคำสั่ง hdfs dfs -ls
เพื่อดูไดเร็กทอรีที่สร้างขึ้นโดยค่าเริ่มต้นด้วยชื่อตารางบน HDFS
[hdfs@localhost:/sqoop]$ hdfs dfs -ls Found 1 items drwxrwxrwx - toptal data 0 2016-10-02 18:59 sales [hdfs@localhost:/sqoop]$
เราสามารถใช้คำสั่ง hdfs dfs -ls
อีกครั้งเพื่อแสดงรายการเนื้อหาของไดเร็กทอรี sales
หากคุณดูที่ HDFS คุณจะสังเกตเห็นว่าข้อมูลถูกแบ่งพาร์ติชั่นและกระจายไปทั่วสี่ไฟล์ตามค่าเริ่มต้น ไม่ใช่แค่อยู่ในไฟล์เดียว
[hdfs@localhost:/sqoop]$ hdfs dfs -ls sales Found 6 items -rw-rw-rw- 1 toptal data 0 2016-10-02 18:59 sales/_SUCCESS drwxrwxrwx - toptal data 0 2016-10-02 18:58 sales/_logs -rw-rw-rw- 1 toptal data 110 2016-10-02 18:59 sales/part-m-00000 -rw-rw-rw- 1 toptal data 111 2016-10-02 18:59 sales/part-m-00001 -rw-rw-rw- 1 toptal data 115 2016-10-02 18:59 sales/part-m-00002 -rw-rw-rw- 1 toptal data 115 2016-10-02 18:59 sales/part-m-00003 [hdfs@localhost:/sqoop]$
คำสั่ง hdfs dfs -cat
จะแสดงระเบียนทั้งหมดในพาร์ติชันแรกของข้อมูลการขายบน HDFS
[hdfs@localhost:/sqoop]$ hdfs dfs -cat sales/part-m-00000 1,2016-09-27,1.23,1,1 2,2016-09-27,2.34,1,2 3,2016-09-27,1.23,2,1 4,2016-09-27,2.34,2,2 5,2016-09-27,3.45,2,3 [hdfs@localhost:/sqoop]$
ขอให้สังเกตว่าตัวคั่นไฟล์เริ่มต้นคือเครื่องหมายจุลภาค นอกจากนี้ โปรดสังเกตว่าในแต่ละพาร์ติชันมีเพียง 5 แถวเท่านั้น เนื่องจาก 20 แถวในซอร์สมีการกระจายเท่าๆ กันทั่วทั้งสี่พาร์ติชัน
เพื่อจำกัดจำนวนแถวที่ส่งออกไปยังหน้าจอ เราสามารถไพพ์เอาต์พุตของคำสั่ง cat
ไปที่คำสั่ง head
ดังที่แสดงด้านล่าง เพื่อตรวจสอบเนื้อหาของอีกสามพาร์ติชั่น
อาร์กิวเมนต์ -n 5
ของคำสั่ง head
จำกัดเอาต์พุตหน้าจอไว้ที่ห้าแถวแรก
(โปรดทราบว่าในกรณีของเรา ไม่จำเป็น เนื่องจากในแต่ละพาร์ติชั่นจะเริ่มต้นเพียง 5 แถว ในทางปฏิบัติ คุณอาจมีแถวมากกว่านี้ในแต่ละพาร์ติชั่น และต้องการตรวจสอบสองสามแถวแรกเพื่อ ตรวจสอบให้แน่ใจว่าดูถูกต้อง ดังนั้นสิ่งนี้จะแสดงให้คุณเห็นว่าต้องทำอย่างไร)
[hdfs@localhost:/sqoop]$ hdfs dfs -cat sales/part-m-00001 |head -n 5 6,2016-09-28,3.45,3,3 7,2016-09-28,4.56,3,4 8,2016-09-28,5.67,3,5 9,2016-09-28,1.23,4,1 10,2016-09-28,1.23,5,1 [hdfs@localhost:/sqoop]$ hdfs dfs -cat sales/part-m-00002 |head -n 5 11,2016-09-28,1.23,6,1 12,2016-09-29,1.23,7,1 13,2016-09-29,2.34,7,2 14,2016-09-29,3.45,7,3 15,2016-09-29,4.56,7,4 [hdfs@localhost:/sqoop]$ hdfs dfs -cat sales/part-m-00003 |head -n 5 16,2016-09-29,5.67,7,5 17,2016-09-29,6.78,7,6 18,2016-09-29,7.89,7,7 19,2016-09-29,7.89,8,7 20,2016-09-30,1.23,9,1 [hdfs@localhost:/sqoop]$
หากคุณต้องการเรียกใช้คิวรีเพื่อดึงข้อมูลจากหลายตารางในฐานข้อมูล PostgreSQL สามารถทำได้โดยใช้คำสั่งต่อไปนี้:
[hdfs@localhost:/sqoop]$ cat sqoopCommand.sh sqoop import --connect 'jdbc:postgresql://aaa.bbb.ccc.ddd:5432/toptal?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory' \ --username 'postgres' -P \ --target-dir 'creditCardOrders' \ --split-by 'pksales' \ --query "select s.pksales, s.saledate, s.saleamount, o.shippingtype, o.methodofpayment from sales s inner join orders o on s.orderid=o.orderid where o.methodofpayment='credit card' and \$CONDITIONS" [hdfs@localhost:/sqoop]$
ในคำสั่งด้านบน เราใช้อาร์กิวเมนต์เดียวกันกับคำสั่ง Sqoop แต่จะมีความสำคัญต่างกันเมื่อใช้กับคำสั่ง SQL
-
--target-dir
- ไดเร็กทอรีเป้าหมายบอก Sqoop ว่าไดเร็กทอรีใดบน HDFS ที่จะเก็บข้อมูลที่เลือกไว้ Sqoop จำเป็นต้องใช้อาร์กิวเมนต์นี้เมื่อใช้คิวรีรูปแบบอิสระ -
--split-by
- แม้ว่าเราจะเลือกคีย์หลักของตารางการขาย แต่เรายังต้องจัดเตรียม Sqoop ด้วยตัวระบุที่ไม่ซ้ำกันเพื่อช่วยกระจายปริมาณงาน -
--query
- นี่คืออาร์กิวเมนต์ที่เราจัดหาแบบสอบถาม SQL แบบสอบถามด้านบนอยู่ในเครื่องหมายคำพูดคู่ โปรดสังเกตว่า ไม่มี แบ็กสแลช (อักขระต่อเนื่องของบรรทัด) ในหลายบรรทัดที่มีข้อความค้นหา นอกจากนี้ ให้สังเกตand \$CONDITIONS
ที่ส่วนท้ายของส่วนWHERE
สิ่งนี้จำเป็นสำหรับ Sqoop เนื่องจาก Sqoop จะแทนที่โทเค็น$CONDITIONS
โดยอัตโนมัติด้วยนิพจน์เฉพาะ
ปัญหาหรือไม่มีปัญหา: คุณควรพิจารณา HDFS
HDFS มีข้อดีเหนือฐานข้อมูลเชิงสัมพันธ์มากมาย หากคุณกำลังทำการวิเคราะห์ข้อมูล คุณควรพิจารณาย้ายข้อมูลของคุณไปยัง HDFS ตั้งแต่วันนี้
ด้วยทักษะที่เรียนรู้ที่นี่ การนำเข้าข้อมูลจากระบบฐานข้อมูลเชิงสัมพันธ์ไปยัง HDFS เป็นกระบวนการที่ง่ายและตรงไปตรงมา ซึ่งสามารถทำได้ด้วยคำสั่งเดียว แม้ว่าตัวอย่างเหล่านี้จะมีแถวจำนวนน้อย แต่กลไกของการนำเข้าข้อมูลจำนวนมากไปยัง HDFS จากตารางฐานข้อมูล PostgreSQL ยังคงเหมือนเดิม
คุณยังสามารถทดลองนำเข้าตารางขนาดใหญ่และตัวคั่นพื้นที่เก็บข้อมูลแบบต่างๆ ได้อีกด้วย การใช้ Apache Sqoop นั้นมีประสิทธิภาพมากกว่าการส่งออกข้อมูลฐานข้อมูลไปยังไฟล์ การถ่ายโอนไฟล์จากเซิร์ฟเวอร์ฐานข้อมูลไปยัง HDFS จากนั้นจึงโหลดไฟล์ไปยัง HDFS