使用 unixODBC/isql 将数据加载到 HDFS

Posted

技术标签:

【中文标题】使用 unixODBC/isql 将数据加载到 HDFS【英文标题】:Loading Data to HDFS with unixODBC/isql 【发布时间】:2016-09-13 13:22:28 【问题描述】:

我在 Linux 服务器 (Cloudera) 上有一个脚本,它使用 unixODBC/isql 从 Netezza 服务器提取数据。它在本地文件系统上生成一个文本文件,然后将其推送到 HDFS。

export ODBCHOME=;
export ODBCINI=;
export LIBPATH=;
export LD_LIBRARY_PATH=;

NZ_ODBC_INI_PATH=/home/myuser/sql/;
export NZ_ODBC_INI_PATH;
export ODBCINI=/home/myuser/sql/odbc.ini;

export NZ_HOME=/usr/local/nz;
export PATH=$PATH:$NZ_HOME/bin64;
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$NZ_HOME/lib64;
export NZ_HOST=myntzserver

EXTRACT_PATH=/home/myuser/trgt_path/;
export EXTRACT_PATH;

cd $EXTRACT_PATH;

hive_char=`printf "\035\n"`

isql nettezaServer1 tsg1dev \$\$infadmin11 -v<<EOF
drop table test_1;
CREATE EXTERNAL TABLE test_1 ( GRP BIGINT, ID BIGINT, DATA CHARACTER V VARYING(10) ) USING (DATAOBJECT ("$EXTRACT_PATH/test_1.txt") REMOTESOURCE 'ODBC' delimiter 2);
insert into test_1 SELECT GRP,ID,DATA FROM SCHEMA1..test_table;
EOF

hdfs dfs -put /home/myuser/trgt_path/test_1.txt /user/projects/my_dir/

我想知道是否有一种方法可以直接连接到 HDFS,或者将数据通过管道传输到 HDFS。换句话说,由于空间限制,我想跳过在本地文件系统上创建文本文件(源表为数百 GB)。

我不使用sqoop的原因是因为项目要求所需的时间太长。上面的脚本能够在 2-3 小时内创建文本文件,而 sqoop 平均需要 7-8 小时来加载数据。我团队的 sqoop 专家尝试微调命令以缩短时间,但没有成功。

总而言之,是否可以跳过本地文件系统并将这些数据直接加载到 HDFS?

【问题讨论】:

【参考方案1】:

Netezza 包括 Fluid Query,它允许 Netezza 查询其他数据源,而且您更感兴趣的是,能够以各种格式将数据直接从 Netezza 移动到 HDFS。

虽然软件权利是 Fluid Query 包含在 Netezza 中,但您的管理员必须在使用前安装和配置它。

Here's a quick overview of Fluid Query.

【讨论】:

以上是关于使用 unixODBC/isql 将数据加载到 HDFS的主要内容,如果未能解决你的问题,请参考以下文章

HASH 何时将key加载到h.definedata()中

将数据从全局加载到共享内存时如何避免银行冲突

Android:NullPointerException 无法将数据库加载到片段内的列表视图中

将位图数据加载到 OpenGL 纹理中时出现问题

将文件中的字体加载到pango?

无法从 S3 存储桶(镶木地板文件)将数据加载到 EMR 上的猪中