写在前面
ps:Mac的小伙伴可以滑到文末
之前我在本地创键Hive表的时候一般都是以默认textFile格式进行存储的,最近玩的一些大表确实占用空间的,就想着Parquet格式存储+Snappy压缩来实现数据的存取。殊不知,
Caused by: java.lang.UnsatisfiedLinkError: no snappyjava in java.library.path
于是我检查了下本地环境:
➜ ~ hadoop checknative
20/12/20 12:00:33 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Native library checking:
hadoop: false
zlib: false
snappy: false
lz4: false
bzip2: false
openssl: false
20/12/20 12:00:33 INFO util.ExitUtil: Exiting with status 1
➜ ~
😭 hai… 这让我怎么玩,没办法,只有来搞搞了。
ps:我本地的hadoop是直接装在mac上的,为了不搞乱自己的电脑,我把这个操作移到了云服务器上。等云服务器上配置好了,下载到本地即可。
一、所需组件
Snappy 1.1.3
Protobuf-2.5.0
Hadoop-src-2.9.2
1.安装依赖包 **重要 不然后面你也是无法继续的
yum -y install gcc g++ libtool cmake maven zlib1g.dev autoconf automake gzip unzip
2.编译安装 Snappy 本地库
tar -zxvf snappy-1.1.3.tar.gz
cd snappy-1.1.3
./configure
make
make install
默认目录是 /usr/local/lib,查看snappy是否安装成功,显示和下面一致
[root@spark002 ~]# ll /usr/local/lib | grep snappy
-rw-r--r-- 1 root root 522248 12月 20 09:56 libsnappy.a
-rwxr-xr-x 1 root root 955 12月 20 09:56 libsnappy.la
lrwxrwxrwx 1 root root 18 12月 20 09:56 libsnappy.so -> libsnappy.so.1.3.0
lrwxrwxrwx 1 root root 18 12月 20 09:56 libsnappy.so.1 -> libsnappy.so.1.3.0
-rwxr-xr-x 1 root root 258704 12月 20 09:56 libsnappy.so.1.3.0
[root@spark002 ~]#
- 编译安装 Protobuf
tar -zxvf protobuf-2.5.0.tar.gz
cd protobuf-2.5.0
./configure --prefix=/opt/apps/protobuf
make
make install
将protobuf 添加到系统环境中
vim ~/.bash_profile
export PROTOBUF_HOME=/opt/apps/protobuf
export PATH=$PROTOBUF_HOME/bin:$PATH
验证:
[root@spark002 ~]# protoc --version
libprotoc 2.5.0
[root@spark002 ~]#
好,到这里。前置依赖就算OK了,接下来正式编译
二、Hadoop-src-2.9.2 源码编译
说明 : 在hadoop2.x源码已经集成了Snappy压缩了,所以编译安装
hadoop-snappy 根本是多余的,只要安装snappy本地库和重新编译hadoop native 库就行:
mvn clean package -DskipTests -Pdist,native -Dtar -Dsnappy.lib=/usr/local/lib -Dbundle.snappy
编译过程中,会出现java堆栈溢出情况,因此执行下述命令扩大内存:
export MAVEN_OPTS="-Xms256m -Xmx512m"
tar -zxvf hadoop-2.9.2-src.tar.gz
cd hadoop-2.9.2-src
执行编译命令:
mvn package -DskipTests -Pdist,native -Dtar -Dsnappy.lib=/usr/local/lib -Dbundle.snappy
这一步编译是真的很慢😭,要有耐心。最后你会看见BUILD SUCESS的
ll /opt/apps/hadoop-2.9.2-src/hadoop-dist/target/hadoop-2.9.2/lib/native
三、本地 Hadoop 添加 Snappy
将云服务器上刚才编译好的包拷贝到本地
$HADOOP_HOME/lib/native
ps:如果是集群,需要将这份文件分发到每个节点的$HADOOP_HOME/lib/native 目录下
添加到系统环境中:
$HADOOP_/HOME/etc/hadoop/hadoop-env.sh 添加如下环境变量:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_COMMON_LIB_NATIVE_DIR"
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native/
修改 $HADOOP_HOME/etc/hadoop/core-site.xml配置文件,在文件中加入:
<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>
</property>
修改 $HADOOP_HOME/etc/hadoop/mapred-site.xml
<property>
<name>mapred.output.compress</name>
<value>true</value>
</property>
<property>
<name>mapred.output.compression.codec</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>
<property>
<name>mapred.compress.map.output</name>
<value>true</value>
</property>
<property>
<name>mapred.map.output.compression.codec</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>
如果是集群也是需要将上面的配置同步到 集群中的每一个节点上的。
重新启动 HDFS,再次检查:
尴尬 好像还是不行。。。搞了那么多,结果不行 😿
重来
Mac开发之Unable to load native-hadoop library问题解决
MAC的小伙伴参考这个文章就可以了。
hadoop native on mac 下载
https://github.com/janlle/mac-hadoop-native-lib-mojove
https://github.com/whiteclaw/hadoop-native-macos
https://github.com/mingsquall/native-hadoop-library
最后,我终于可以了
花絮:
.option("compression", "uncompressed")
.csv("hdfs://spark003:8020/szdata-sparketl/sz20180901-uncompressed.csv")
VS
.option("compression", "snappy")
.parquet("hdfs://spark003:8020/szdata-sparketl/sz20180901-snappy.parquet")
列存parquet+压缩确实更够厉害🐶🐶
参考:
https://blog.csdn.net/zilong_zilong/article/details/78323946
https://blog.csdn.net/w1992wishes/article/details/105557645
https://blog.csdn.net/wyz0516071128/article/details/80892487