配置ArcGIS GA分析工具支持HADOOP SNAPPY压缩

Posted by Keling Ma on 2019-03-20

Snappy是google推出的压缩和解压缩库,它的设计目标旨在高速和合理压缩。这个库在Google内部广泛使用,在Hadoop产品家族中也被广泛采纳。今天我们要解决的问题是如何让ArcGIS GA 大数据分析工具能够顺利读取(解压缩)和输出(压缩)snappy压缩格式的数据。

配置GA支持读写snappy压缩数据,关键的环节有两步:一是编译Hadoop Snappy库让Hadoop支持snappy,这个过程有点繁琐,详情参见下述配置向导的前三步;第二个环节就是配置GA依赖的jre包含Hadoop snappy so库。总体思路清晰了,接下来我们就动手编译所需的库,配置GA支持snappy。

一 编译snappy-1.1.4

1,下载snappy-1.1.4安装包

下载地址:https://github.com/google/snappy/releases/tag/1.1.4

2,解压安装包

1
[root@gis088 software]# tar -xvf snappy-1.1.1.tar.gz -C /usr/local

3,安装编译所需的包

这里默认你已经预装了JDK,并已配置好了环境变量,我的测试环境中使用了Java version: 1.8.0_111

1
2
3
[root@gis088 software]# yum install gcc
[root@gis088 software]# yum install gcc-c++
[root@gis088 software]# yum install autoconf, automake, libtool

4,cd到snappy解压目录开始编译

1
2
3
4
[root@gis089 software]#cd /usr/local/snappy-1.1.4/
[root@gis088 snappy-1.1.4]# ./configure
[root@gis088 snappy-1.1.4]# make
[root@gis088 snappy-1.1.4]# make install

5,检查编译后的文件

默认会编译到/usr/local/lib目录下

1
2
3
4
5
6
7
8
9
10
[root@gis088 snappy-1.1.4]# ls -al /usr/local/lib
total 796
drwxr-xr-x. 3 root root 130 Mar 19 18:48 .
drwxr-xr-x. 15 root root 272 Mar 19 18:44 ..
-rw-r--r--. 1 root root 541800 Mar 19 18:48 libsnappy.a
-rwxr-xr-x. 1 root root 955 Mar 19 18:48 libsnappy.la
lrwxrwxrwx. 1 root root 18 Mar 19 18:48 libsnappy.so -> libsnappy.so.1.3.1
lrwxrwxrwx. 1 root root 18 Mar 19 18:48 libsnappy.so.1 -> libsnappy.so.1.3.1
-rwxr-xr-x. 1 root root 263600 Mar 19 18:48 libsnappy.so.1.3.1
drwxr-xr-x. 2 root root 23 Mar 19 18:48 pkgconfig

二 编译hadoop-snappy

hadoop-snappy库的编译需要基于Maven,因此我们先来部署maven。

(一)部署maven

1,下载maven安装包

下载地址:http://maven.apache.org/download.cgi

这里选择下载的版本是3.6.0

2,解压缩安装包

1
[root@gis088 software]# tar -xvf apache-maven-3.6.0-bin.tar -C /home

3,配置环境变量

1
[root@gis088 software]# vim /etc/profile

添加环境变量:

1
2
3
export MAVEN_HOME = /home/apache-maven-3.6.0
export PATH = $MAVEN_HOME/bin:PATH
[root@gis088 software]# source /etc/profile

4,验证

1
2
3
4
5
6
[root@gis088 apache-maven-3.6.0]# mvn -version
Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-25T02:41:47+08:00)
Maven home: /home/apache-maven-3.6.0
Java version: 1.8.0_111, vendor: Oracle Corporation, runtime: /usr/local/jdk1.8.0_111/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-693.el7.x86_64", arch: "amd64", family: "unix"

(二)编译hadoop-snappy

1,下载hadoop-snappy 源码

下载地址:https://github.com/electrum/hadoop-snappy

2,编译Hadoop snappy

1
[root@gis088 hadoop_snappy]# cd hadoop-snappy-master/

由于snappy编译到了默认的目录/usr/local,可以省略参数,否则通过-Dsnappy.prefix=SNAPPY_INSTALLATION_DIR指定snappy的安装目录。

1
[root@gis088 hadoop-snappy-master]# mvn package

编译后的结果位于target文件夹。

三 在Hadoop中部署Hadoop Snappy库

1,安装库文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@gis088 hadoop-snappy-master]# cd target
[root@gis088 target]# tar -zxvf hadoop-snappy-0.0.1-SNAPSHOT.tar.gz -C /home
[root@gis088 target]# cd /home/hadoop-snappy-0.0.1-SNAPSHOT/
[root@gis088 hadoop-snappy-0.0.1-SNAPSHOT]# cp -rf lib/* /home/hadoop-2.8.1/lib
[root@gis088 hadoop-snappy-0.0.1-SNAPSHOT]# cd /home/hadoop-2.8.1/lib/native
[root@gis088 native]# cp -rf /usr/local/lib/* ./
[root@gis088 native]# ls -al
total 5280
drwxrwxr-x. 5 500 500 4096 Mar 19 19:59 .
drwxrwxr-x. 3 500 500 60 Mar 19 19:58 ..
drwxrwxr-x. 2 500 500 94 Jun 2 2017 examples
-rw-rw-r--. 1 500 500 1200084 Jun 2 2017 libhadoop.a
-rw-rw-r--. 1 500 500 1487164 Jun 2 2017 libhadooppipes.a
lrwxrwxrwx. 1 500 500 18 Jun 3 2017 libhadoop.so -> libhadoop.so.1.0.0
-rwxrwxr-x. 1 500 500 711938 Jun 2 2017 libhadoop.so.1.0.0
-rw-rw-r--. 1 500 500 581808 Jun 2 2017 libhadooputils.a
-rw-rw-r--. 1 500 500 365076 Jun 2 2017 libhdfs.a
lrwxrwxrwx. 1 500 500 16 Jun 3 2017 libhdfs.so -> libhdfs.so.0.0.0
-rwxrwxr-x. 1 500 500 229297 Jun 2 2017 libhdfs.so.0.0.0
-rw-r--r--. 1 root root 541800 Mar 19 19:59 libsnappy.a
-rwxr-xr-x. 1 root root 955 Mar 19 19:59 libsnappy.la
lrwxrwxrwx. 1 root root 18 Mar 19 19:59 libsnappy.so -> libsnappy.so.1.3.1
lrwxrwxrwx. 1 root root 18 Mar 19 19:59 libsnappy.so.1 -> libsnappy.so.1.3.1
-rwxr-xr-x. 1 root root 263600 Mar 19 19:59 libsnappy.so.1.3.1
drwxr-xr-x. 3 root root 177 Mar 19 19:58 Linux-amd64-64
drwxr-xr-x. 2 root root 23 Mar 19 19:59 pkgconfig

2,修改core-site.xml和mapred-site.xml配置文件

1
[root@gis088 hadoop]# vim core-site.xml

添加属性:

1
2
3
4
5
6
7
8
9
10
<property>
<name>io.compression.codecs</name>
<value>
org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
org.apache.hadoop.io.compress.BZip2Codec,
org.apache.hadoop.io.compress.SnappyCodec
</value>
<description>A list of the compression codec classes that can be used for compression/decompression.</description>
</property>
1
2
[root@gis088 hadoop]# cp mapred-site.xml.template mapred-site.xml
[root@gis088 hadoop]# vim mapred-site.xml

添加属性:

1
2
3
4
5
6
7
8
<property>
<name>mapreduce.map.output.compress</name>
<value>true</value>
</property>
<property>
<name>mapreduce.map.output.compression.codec</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>

3,验证hadoop环境中是否成功支持snappy

之前我已经在hdfs 中导入测试数据,位于/data/test.snappy。

测试过程是通过执行hadoop自带的样例程序wordcount来验证,计算结果输出到/output目录:

1
2
3
4
5
[root@gis088 hadoop-2.8.1]# hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.1.jar wordcount /data/test.snappy /output
[root@gis088 hadoop-2.8.1]# hdfs dfs -ls /output
Found 2 items
-rw-r--r-- 1 root supergroup 0 2019-03-19 20:27 /output/_SUCCESS
-rw-r--r-- 1 root supergroup 29844 2019-03-19 20:27 /output/part-r-00000

以上过程完成了Hadoop支持snappy压缩的安装配置,为了让GA能支持读写snappy压缩的文件,还需要进一步配置hadoop snappy库到GA依赖的jre下。

四 配置GA支持Snappy

在没有经过任何snappy部署的GA环境下,如果我们尝试读取snappy压缩的数据,通常会收到以下类似的报错信息:

py4j.protocol.Py4JJavaError: An error occurred while calling o34.collectToPython.

: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 0.0 failed 1 times, most recent failure: Lost task 0.0 in stage 0.0 (TID 0, localhost, executor driver): java.lang.RuntimeException: native snappy library not available: this version of libhadoop was built without snappy support.

为了让GA能支持snappy压缩格式的解析,还需要进一步的将hadoop snappy动态链接库复制到GA所在服务器的/usr/lib64目录下。

1,部署库

在我的测试环境中GA集群包含了三台服务器,分别是:
10.10.20.39
10.10.20.40
10.10.20.41

现在需要从部署hadoop的服务器(10.10.20.88),将hadoop/lib/native目录下的hadoop , snappy动态链接库复制到GA 集群服务器各节点的/usr/lib64目录下。

1
2
3
4
5
6
7
8
[root@gis088 hadoop-2.8.1]# scp /home/hadoop-2.8.1/lib/native/libhadoop.so* 10.10.20.39:/usr/lib64
[root@gis088 hadoop-2.8.1]# scp /home/hadoop-2.8.1/lib/native/libsnappy.so* 10.10.20.39:/usr/lib64

[root@gis088 hadoop-2.8.1]# scp /home/hadoop-2.8.1/lib/native/libhadoop.so* 10.10.20.40:/usr/lib64
[root@gis088 hadoop-2.8.1]# scp /home/hadoop-2.8.1/lib/native/libsnappy.so* 10.10.20.40:/usr/lib64

[root@gis088 hadoop-2.8.1]# scp /home/hadoop-2.8.1/lib/native/libhadoop.so* 10.10.20.41:/usr/lib64
[root@gis088 hadoop-2.8.1]# scp /home/hadoop-2.8.1/lib/native/libsnappy.so* 10.10.20.41:/usr/lib64

登陆所有GA 服务器,通过ls命令检查/usr/lib64目录下是否包含了所有需要的动态链接库

1
2
3
[root@gis039 home]# ls -al /usr/lib64
[root@gis040 home]# ls -al /usr/lib64
[root@gis041 home]# ls -al /usr/lib64

2,验证成果

通过Run Python Script工具测试GA可以支持snappy压缩数据的读写,在浏览器中打开run python script 提交页面:

https://gis039.esri.local/arcgis/rest/services/System/GeoAnalyticsTools/GPServer/RunPythonScript/submitJob

在Python Script 窗口,输入以下示例:

示例一:读取hdfs中snappy压缩的csv 数据

1
2
3
4
print("start...")
snappy_data = "hdfs://10.10.20.88:9000/data/test.snappy"
input_layer = spark.read.csv(snappy_data)
input_layer.show()

示例二:读取hdfs中的csv数据,然后以snappy压缩格式输出到hdfs

对于写出操作,GA执行时需要使用GA进程账户,而不是root, 因此要确保GA 进程账户对输出目录拥有写权限。

默认用root账户创建的hdfs 目录权限,可以看到对于非root用户并没有写权限:

1
drwxr-xr-x   - root supergroup          0 2019-03-20 14:00 /out

这里我简单赋予其它用户和组写权限,确保样例可以正确执行:

1
[root@gis088 makl]# hdfs dfs -chmod 777 /out
1
2
3
4
5
6
print("start…")
csv_data = "hdfs://10.10.20.88:9000/data/bjRAIN.csv"
input_layer = spark.read.csv(csv_data)
input_layer.show()
out_path = "hdfs://10.10.20.88:9000/out/bjRAIN"
input_layer.write.csv(out_path, compression="snappy")

如果上述样例通过Run Python Script工具都可以成功执行,那恭喜你,大功告成!接下来就可以愉快的在GA环境中使用snappy压缩数据啦。