雖然名稱叫做 HDFS 的 FDW,但是 hdfs_fdw 所溝通的是 Hive 跟 Spark 而非 HDFS 本身 ....
EnterpriseDB 對其所提供的 PostgreSQL 發行版和企業版提供 hdfs_fdw 安裝檔,以及社群 YUM Repo 也有提供相關 RPM,不用自己從原始碼編譯。這裡是功能測試的紀錄。
要安裝 hdfs_fdw 的話,EDB Postgres v11 企業版的 YUM Repo 有提供。如果使用 PostgreSQL YUM Repo,在 10/11 的裡面也提供了打包好內容;不然,另外一個 Postgres 發行版有 HadoopFDW 也能考慮看看。
這裡用 EDB 的企業版 EPAS 11 作練習。這邊直接使用一個已經準備好的 EDB 資料庫 Container
[brandon_hsu@labenv-lxc ~]$ sudo ./startenv.sh edb11 . . . 中間略 . . . [brandon_hsu@labenv-lxc ~]$ sudo ./envlogin.sh edb11 . . . 中間略 . . .
1. 安裝 Java 以及 hdsf_fdw。hdfs_fdw 的套件裡面有 Hive JDBC Client,找出 JAR 檔案路徑,等下要填寫到參數內
[root@edb11 ~]# yum install -y java edb-as11-hdfs_fdw . . . 中間略 . . . [root@edb11 ~]# find /usr/edb/as11/ -name *jar /usr/edb/as11/lib/HiveJdbcClient-1.0.jar [root@edb11 ~]#
2. 除了外掛套件提供的 jar 檔案之外,還需要下載 hive-jdbc-x.x.x-standalone.jar。這邊下載 v3.1.1(與來源端版本相同)
[root@edb11 ~]# wget http://central.maven.org/maven2/org/apache/hive/hive-jdbc/3.1.1/hive-jdbc-3.1.1-standalone.jar -P /etc/alternatives/jre/lib/ext/ --2019-05-06 16:35:16-- http://central.maven.org/maven2/org/apache/hive/hive-jdbc/3.1.1/hive-jdbc-3.1.1-standalone.jar Resolving central.maven.org (central.maven.org)... 151.101.184.209 Connecting to central.maven.org (central.maven.org)|151.101.184.209|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 74324746 (71M) [application/java-archive] Saving to: '/etc/alternatives/jre/lib/ext/hive-jdbc-3.1.1-standalone.jar' 100%[==================================================>] 74,324,746 201MB/s in 0.4s 2019-05-06 16:35:17 (201 MB/s) - '/etc/alternatives/jre/lib/ext/hive-jdbc-3.1.1-standalone.jar' saved [74324746/74324746] [root@edb11 ~]#
3. 啟動資料庫
[root@edb11 ~]# service edb-as-11 start Redirecting to /bin/systemctl start edb-as-11.service [root@edb11 ~]#
4. 啟用外掛
若嘗試直接啟用外掛,會遇到錯誤
[root@edb11 ~]# su - enterprisedb -bash-4.2$ psql -d edb psql.bin (11.1.7) Type "help" for help. edb=# select * from pg_available_extensions where name='hdfs_fdw'; name | default_version | installed_version | comment ----------+-----------------+-------------------+---------------------------------------------- hdfs_fdw | 2.0.3 | | foreign-data wrapper for remote hdfs servers (1 row) edb=# edb=# CREATE EXTENSION hdfs_fdw; ERROR: could not load JVM HINT: Add path of libjvm.so to hdfs_fdw.jvmpath edb=#
我們需要預先進行以下的參數設定:
由於這邊要設定的兩個 GUC 並沒有明顯紀錄在 Config 檔案內,因此需要先以 SET 指令載入,再使用 ALTER SYSTEM SET 使設定永久生效
edb=# SET hdfs_fdw.jvmpath='/etc/alternatives/jre/lib/amd64/server/'; SET edb=# ALTER SYSTEM SET hdfs_fdw.jvmpath='/etc/alternatives/jre/lib/amd64/server/'; ALTER SYSTEM edb=# SET hdfs_fdw.classpath='/usr/edb/as11/lib/HiveJdbcClient-1.0.jar'; SET edb=# ALTER SYSTEM SET hdfs_fdw.classpath='/usr/edb/as11/lib/HiveJdbcClient-1.0.jar'; ALTER SYSTEM edb=# edb=# select pg_reload_conf(); pg_reload_conf ---------------- t (1 row) edb=#
這時啟用外掛才會生效
edb=# CREATE EXTENSION hdfs_fdw; CREATE EXTENSION edb=#
以上便把 hdfs_fdw 的設定設置完成。
5. 接著就可以建立外部表了。
這邊要連線的 Hive Server 2 服務,是上一篇的 Container 環境中安裝的 hive 3.1.1(位置在 192.168.68.21:10000),以 NOSASL 認證模式的 Hiveserver2。
hdfs_fdw 存取 Hadoop 的方式,透過 Hive 或是 Spark 二擇一。在建立外部表時,需要設置 client_type 這個 FDW Option 來決定。這邊我只測試透過 Hive Server 2 的查詢模式。
此外,由於這個測試環境設定的帳號認證機制為 NOSASL,因此這邊設置 User Mapping 時不用設定遠端帳密。
以下開始從 PostgreSQL 連線到 Hadoop 的 Hive 表格。資料就是上一篇所匯入的 weblogs 測試資料。
edb=# CREATE SERVER hive_server FOREIGN DATA WRAPPER hdfs_fdw OPTIONS (host '192.168.68.21', port '10000', client_type 'hiveserver2', auth_type 'NOSASL', connect_timeout '10000', query_timeout '10000'); CREATE SERVER edb=# CREATE USER MAPPING FOR enterprisedb SERVER hive_server OPTIONS (username 'hive', password 'hive'); CREATE USER MAPPING edb=# edb=# CREATE FOREIGN TABLE weblogs ( client_ip TEXT, full_request_date TEXT, day TEXT, Month TEXT, month_num INTEGER, year TEXT, hour TEXT, minute TEXT, second TEXT, timezone TEXT, http_verb TEXT, uri TEXT, http_status_code TEXT, bytes_returned TEXT, referrer TEXT, user_agent TEXT ) SERVER hive_server OPTIONS (dbname 'd1', table_name 'weblogs'); CREATE FOREIGN TABLE edb=#
然後就可以查詢表格了
edb=# select * from weblogs limit 3; client_ip | full_request_date | day | month | month_num | year | hour | minute | second | timezone | http_verb | uri | http_status_code | bytes_returned | referrer | user_agent ---------------+----------------------------+-----+-------+-----------+------+------+--------+--------+----------+-----------+-------------------+------------------+----------------+-------------------+------------------------------------------------------------------------------------------------------------------ 612.57.72.653 | 03/Jun/2012:09:12:23 -0500 | 03 | Jun | 6 | 2012 | 09 | 12 | 23 | -0500 | GET | /product/product2 | 200 | 0 | /product/product2 | Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30) 612.57.72.653 | 03/Jun/2012:09:14:50 -0500 | 03 | Jun | 6 | 2012 | 09 | 14 | 50 | -0500 | GET | /product/product3 | 200 | 0 | /product/product2 | Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30) 612.57.72.653 | 03/Jun/2012:09:15:05 -0500 | 03 | Jun | 6 | 2012 | 09 | 15 | 05 | -0500 | GET | /product/product3 | 200 | 0 | /product/product3 | Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30) (3 rows) edb=#
目前 hdfs_fdw v2 還沒有提供資料輸入 Hive 的功能(可能是因為 Hive 要執行 DML 需要額外的設置)。期待以後完成的話,便可以把過期資料輕易的從 Postgres 倒進去 Hadoop,增加舊資料歸檔的彈性。
參考資料:
EDB 原廠客服團隊
其他類似的~
延伸專案 Greenplum 5 的 Hadoop 整合
https://gpdb.docs.pivotal.io/5180/pxf/overview_pxf.html:直接存取 HDFS,或是透過 Hive 或 HBase 也行,專門做大規模資料處理使用
沒有留言:
張貼留言